]> git.lizzy.rs Git - minetest.git/blobdiff - src/filecache.cpp
Grow dirt_with_snow instead of dirt_with_grass if snow is above it
[minetest.git] / src / filecache.cpp
index 28d6bbc80d6c29105073e0647a91717202242c4e..23df1d7d081e5d137e631dd4e8fbeca99182750f 100644 (file)
@@ -1,41 +1,42 @@
 /*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
-Copyright (C) 2012 Jonathan Neuschäfer <j.neuschaefer@gmx.net>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013 Jonathan Neuschäfer <j.neuschaefer@gmx.net>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include "filecache.h"
+
 #include "clientserver.h"
 #include "log.h"
 #include "filesys.h"
-#include "utility.h"
 #include "hex.h"
-
+#include "sha1.h"
 #include <string>
 #include <iostream>
+#include <fstream>
+#include <sstream>
 
-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 +54,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 +69,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 +79,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)
-{
-       std::string path = m_dir + DIR_DELIM + name;
-       return loadByPath(name, os, path);
-}
-
-
-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(name, data, path);
+       return updateByPath(path, data);
 }
-
-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;
 }