Tune caves
[oweals/minetest.git] / src / filecache.cpp
index 5ba8ef5cce6404debba6bfa6e93a397c76bfd3a2..0ef2dd11ef7a0892465eac535290df7d2430183a 100644 (file)
@@ -24,6 +24,7 @@ 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>
@@ -34,7 +35,7 @@ bool FileCache::loadByPath(const std::string &path, std::ostream &os)
 
        if(!fis.good()){
                verbosestream<<"FileCache: File not found in cache: "
-                       <<path<<std::endl;
+                               <<path<<std::endl;
                return false;
        }
 
@@ -53,7 +54,7 @@ bool FileCache::loadByPath(const std::string &path, std::ostream &os)
        }
        if(bad){
                errorstream<<"FileCache: Failed to read file from cache: \""
-                       <<path<<"\""<<std::endl;
+                               <<path<<"\""<<std::endl;
        }
 
        return !bad;
@@ -67,7 +68,7 @@ bool FileCache::updateByPath(const std::string &path, const std::string &data)
        if(!file.good())
        {
                errorstream<<"FileCache: Can't write to file at "
-                       <<path<<std::endl;
+                               <<path<<std::endl;
                return false;
        }
 
@@ -77,34 +78,41 @@ bool FileCache::updateByPath(const std::string &path, const std::string &data)
        return !file.fail();
 }
 
-bool FileCache::loadByName(const std::string &name, std::ostream &os)
-{
-       std::string path = m_dir + DIR_DELIM + name;
-       return loadByPath(path, os);
-}
-
-
-bool FileCache::updateByName(const std::string &name, const std::string &data)
+bool FileCache::update(const std::string &name, const std::string &data)
 {
        std::string path = m_dir + DIR_DELIM + name;
        return updateByPath(path, data);
 }
-
-std::string FileCache::getPathFromChecksum(const std::string &checksum)
+bool FileCache::update_sha1(const std::string &data)
 {
-       std::string checksum_hex = hex_encode(checksum.c_str(), checksum.length());
-       return m_dir + DIR_DELIM + checksum_hex;
+       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 &checksum, std::ostream &os)
+bool FileCache::load(const std::string &name, std::ostream &os)
 {
-       std::string path = getPathFromChecksum(checksum);
+       std::string path = m_dir + DIR_DELIM + name;
        return loadByPath(path, os);
 }
-
-bool FileCache::updateByChecksum(const std::string &checksum,
-               const std::string &data)
+bool FileCache::load_sha1(const std::string &sha1_raw, std::ostream &os)
 {
-       std::string path = getPathFromChecksum(checksum);
-       return updateByPath(path, data);
+       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;
 }