]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/filecache.cpp
Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenu
[dragonfireclient.git] / src / filecache.cpp
index 5ba8ef5cce6404debba6bfa6e93a397c76bfd3a2..c4de6cf8220bfc8f6db0e0323e44a0bba1bb3f30 100644 (file)
@@ -1,32 +1,35 @@
 /*
-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>
+#include <stdlib.h>
 
 bool FileCache::loadByPath(const std::string &path, std::ostream &os)
 {
@@ -34,7 +37,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 +56,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 +70,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 +80,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;
 }