Tune caves
[oweals/minetest.git] / src / filecache.cpp
index 28d6bbc80d6c29105073e0647a91717202242c4e..0ef2dd11ef7a0892465eac535290df7d2430183a 100644 (file)
@@ -24,18 +24,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "filesys.h"
 #include "utility.h"
 #include "hex.h"
+#include "sha1.h"
 
 #include <string>
 #include <iostream>
 
-bool FileCache::loadByPath(const std::string &name, std::ostream &os,
-               const std::string &path)
+bool FileCache::loadByPath(const std::string &path, std::ostream &os)
 {
        std::ifstream fis(path.c_str(), std::ios_base::binary);
 
        if(!fis.good()){
-               infostream<<"FileCache: File not found in cache: "
-                       <<name << " expected it at: "<<path<<std::endl;
+               verbosestream<<"FileCache: File not found in cache: "
+                               <<path<<std::endl;
                return false;
        }
 
@@ -53,15 +53,14 @@ bool FileCache::loadByPath(const std::string &name, std::ostream &os,
                }
        }
        if(bad){
-               infostream<<"FileCache: Failed to read file from cache: \""
-                       <<path<<"\""<<std::endl;
+               errorstream<<"FileCache: Failed to read file from cache: \""
+                               <<path<<"\""<<std::endl;
        }
 
        return !bad;
 }
 
-bool FileCache::updateByPath(const std::string &name, const std::string &data,
-               const std::string &path)
+bool FileCache::updateByPath(const std::string &path, const std::string &data)
 {
        std::ofstream file(path.c_str(), std::ios_base::binary |
                        std::ios_base::trunc);
@@ -69,7 +68,7 @@ bool FileCache::updateByPath(const std::string &name, const std::string &data,
        if(!file.good())
        {
                errorstream<<"FileCache: Can't write to file at "
-                       <<path<<std::endl;
+                               <<path<<std::endl;
                return false;
        }
 
@@ -79,39 +78,41 @@ bool FileCache::updateByPath(const std::string &name, const std::string &data,
        return !file.fail();
 }
 
-bool FileCache::loadByName(const std::string &name, std::ostream &os)
+bool FileCache::update(const std::string &name, const std::string &data)
 {
        std::string path = m_dir + DIR_DELIM + name;
-       return loadByPath(name, os, path);
+       return updateByPath(path, data);
 }
-
-
-bool FileCache::updateByName(const std::string &name, const std::string &data)
-{
-       std::string path = m_dir + DIR_DELIM + name;
-       return updateByPath(name, data, path);
-}
-
-std::string FileCache::getPathFromChecksum(const std::string &name,
-               const std::string &checksum)
+bool FileCache::update_sha1(const std::string &data)
 {
-       std::string checksum_hex = hex_encode(checksum.c_str(), checksum.length());
-       size_t dot = name.find_last_of('.');;
-       std::string ext = (dot == std::string::npos)? "" :
-               name.substr(dot, std::string::npos);
-       return m_dir + DIR_DELIM + checksum_hex + ext;
+       SHA1 sha1;
+       sha1.addBytes(data.c_str(), data.size());
+       unsigned char *digest = sha1.getDigest();
+       std::string sha1_raw((char*)digest, 20);
+       free(digest);
+       std::string sha1_hex = hex_encode(sha1_raw);
+       return update(sha1_hex, data);
 }
-
-bool FileCache::loadByChecksum(const std::string &name, std::ostream &os,
-               const std::string &checksum)
+bool FileCache::load(const std::string &name, std::ostream &os)
 {
-       std::string path = getPathFromChecksum(name, checksum);
-       return loadByPath(name, os, path);
+       std::string path = m_dir + DIR_DELIM + name;
+       return loadByPath(path, os);
 }
-
-bool FileCache::updateByChecksum(const std::string &name,
-               const std::string &data, const std::string &checksum)
+bool FileCache::load_sha1(const std::string &sha1_raw, std::ostream &os)
 {
-       std::string path = getPathFromChecksum(name, checksum);
-       return updateByPath(name, data, path);
+       std::ostringstream tmp_os(std::ios_base::binary);
+       if(!load(hex_encode(sha1_raw), tmp_os))
+               return false;
+       SHA1 sha1;
+       sha1.addBytes(tmp_os.str().c_str(), tmp_os.str().length());
+       unsigned char *digest = sha1.getDigest();
+       std::string sha1_real_raw((char*)digest, 20);
+       free(digest);
+       if(sha1_real_raw != sha1_raw){
+               verbosestream<<"FileCache["<<m_dir<<"]: filename "<<sha1_real_raw
+                               <<" mismatches actual checksum"<<std::endl;
+               return false;
+       }
+       os<<tmp_os.str();
+       return true;
 }