summaryrefslogtreecommitdiff
path: root/src/filecache.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-25 14:47:51 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-03-25 14:48:22 +0300
commit1cac1de3b27c5c6a511bf86bd9cb1d763c5c7d5d (patch)
treedb4e9d92380de549834efc6b50603ac933127c7a /src/filecache.cpp
parent524c78a8d696e2ff980db7c60272032b4028864b (diff)
downloadminetest-1cac1de3b27c5c6a511bf86bd9cb1d763c5c7d5d.tar.gz
minetest-1cac1de3b27c5c6a511bf86bd9cb1d763c5c7d5d.tar.bz2
minetest-1cac1de3b27c5c6a511bf86bd9cb1d763c5c7d5d.zip
Almost support loading sounds from server
Diffstat (limited to 'src/filecache.cpp')
-rw-r--r--src/filecache.cpp54
1 files changed, 31 insertions, 23 deletions
diff --git a/src/filecache.cpp b/src/filecache.cpp
index 5ba8ef5cc..0ef2dd11e 100644
--- a/src/filecache.cpp
+++ b/src/filecache.cpp
@@ -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;
}