[Add] Added checksum. Also fized InputStreamWrapper it could not find size_t..

This commit is contained in:
Rtch90 2012-09-03 20:33:47 +01:00
parent f6645cd911
commit bfde44079c
4 changed files with 83 additions and 1 deletions

View File

@ -46,6 +46,7 @@ HEADERS += ../src/Actor/Player.h \
../src/System/Filesystem/InputFileStream.h \ ../src/System/Filesystem/InputFileStream.h \
../src/System/Filesystem/FilePackageManager.h \ ../src/System/Filesystem/FilePackageManager.h \
../src/System/Filesystem/InputStreamWrapper.h \ ../src/System/Filesystem/InputStreamWrapper.h \
../src/System/Checksum.h \
../src/Texture/Texture.h \ ../src/Texture/Texture.h \
../src/Sound/Music.h \ ../src/Sound/Music.h \
../src/TMXParser/base64.h \ ../src/TMXParser/base64.h \
@ -101,6 +102,7 @@ SOURCES += ../src/Actor/Player.cpp \
../src/System/Filesystem/InputFileStream.cpp \ ../src/System/Filesystem/InputFileStream.cpp \
../src/System/Filesystem/FilePackageManager.cpp \ ../src/System/Filesystem/FilePackageManager.cpp \
../src/System/Filesystem/InputStreamWrapper.cpp \ ../src/System/Filesystem/InputStreamWrapper.cpp \
../src/System/Checksum.cpp \
../src/Texture/Texture.cpp \ ../src/Texture/Texture.cpp \
../src/Sound/Music.cpp \ ../src/Sound/Music.cpp \
../src/Actor/NPC.cpp \ ../src/Actor/NPC.cpp \

68
src/System/Checksum.cpp Normal file
View File

@ -0,0 +1,68 @@
#include "Checksum.h"
#include "Filesystem/InputStreamWrapper.h"
#include <assert.h>
#include <stdio.h>
using namespace saracraft;
unsigned int Checksum::CountChecksumForFile(const char* filename) {
unsigned int chksum = 0;
int filesize = 0;
bool success = CountChecksumForFileImpl(&chksum, &filesize, filename);
if(success) {
return chksum;
} else {
assert(0);
return 0;
}
}
bool Checksum::DoesChecksumAndSizeMatchFile(unsigned int checksum, int filesize, const char* filename) {
unsigned int chksum = 0;
int size = 0;
bool success = CountChecksumForFileImpl(&chksum, &size, filename);
if(success) {
if(chksum == checksum && filesize == size)
return true;
else
return false;
} else {
return false;
}
}
bool Checksum::CountChecksumForFileImpl(unsigned int* checksum, int* filesize, const char* filename) {
assert(filename != NULL);
filesystem::FB_FILE* f = filesystem::fb_fopen(filename, "rb");
if(f == NULL) {
return false;
}
int size = filesystem::fb_fsize(f);
char* buf = new char[size];
bool success = true;
int got = filesystem::fb_fread(buf, size, 1, f);
if(got != 1) {
success = false;
} else {
success = true;
*filesize = size;
unsigned int hashCode = 1327341033;
int hashmult = 0;
for(int i = 0; i < size; i++) {
if((i % 73) == 0)
hashCode += (buf[i] << hashmult);
else
hashCode ^= (buf[i] << hashmult);
hashmult+=4;
if(hashmult > 23) hashmult -= 23;
}
delete [] buf;
filesystem::fb_fclose(f);
return success;
}
}

12
src/System/Checksum.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
class Checksum {
public:
static unsigned int CountChecksumForFile(const char* filename);
static bool DoesChecksumAndSizeMatchFile(unsigned int checksum,
int filesize, const char* filename);
private:
static bool CountChecksumForFileImpl(unsigned int* checksum,
int* filesize, const char* filename);
};

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#include <cstring>
namespace saracraft { namespace saracraft {
namespace filesystem { namespace filesystem {