From bfde44079ce36bb8f732bed1f6e4f6f28e6af64f Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Mon, 3 Sep 2012 20:33:47 +0100 Subject: [PATCH] [Add] Added checksum. Also fized InputStreamWrapper it could not find size_t.. --- Bin/LibD.pro | 2 + src/System/Checksum.cpp | 68 ++++++++++++++++++++++ src/System/Checksum.h | 12 ++++ src/System/Filesystem/InputStreamWrapper.h | 2 +- 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/System/Checksum.cpp create mode 100644 src/System/Checksum.h diff --git a/Bin/LibD.pro b/Bin/LibD.pro index 0b1751c..f77e42f 100644 --- a/Bin/LibD.pro +++ b/Bin/LibD.pro @@ -46,6 +46,7 @@ HEADERS += ../src/Actor/Player.h \ ../src/System/Filesystem/InputFileStream.h \ ../src/System/Filesystem/FilePackageManager.h \ ../src/System/Filesystem/InputStreamWrapper.h \ + ../src/System/Checksum.h \ ../src/Texture/Texture.h \ ../src/Sound/Music.h \ ../src/TMXParser/base64.h \ @@ -101,6 +102,7 @@ SOURCES += ../src/Actor/Player.cpp \ ../src/System/Filesystem/InputFileStream.cpp \ ../src/System/Filesystem/FilePackageManager.cpp \ ../src/System/Filesystem/InputStreamWrapper.cpp \ + ../src/System/Checksum.cpp \ ../src/Texture/Texture.cpp \ ../src/Sound/Music.cpp \ ../src/Actor/NPC.cpp \ diff --git a/src/System/Checksum.cpp b/src/System/Checksum.cpp new file mode 100644 index 0000000..00e1ecb --- /dev/null +++ b/src/System/Checksum.cpp @@ -0,0 +1,68 @@ +#include "Checksum.h" +#include "Filesystem/InputStreamWrapper.h" +#include +#include + +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; + } +} + diff --git a/src/System/Checksum.h b/src/System/Checksum.h new file mode 100644 index 0000000..7fce821 --- /dev/null +++ b/src/System/Checksum.h @@ -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); +}; + diff --git a/src/System/Filesystem/InputStreamWrapper.h b/src/System/Filesystem/InputStreamWrapper.h index d643a20..b8a1d61 100644 --- a/src/System/Filesystem/InputStreamWrapper.h +++ b/src/System/Filesystem/InputStreamWrapper.h @@ -1,5 +1,5 @@ #pragma once - +#include namespace saracraft { namespace filesystem {