From b95975183df9fa7f1e71a5b7a6455dd96fb39b81 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Fri, 7 Sep 2012 20:37:21 +0100 Subject: [PATCH] [Add] Then there was compressed output files! --- Bin/LibD.pro | 3 + src/System/Filesystem/IOapi.h | 60 +++++++++++++++++ .../Filesystem/OutputCompressedFileStream.cpp | 66 +++++++++++++++++++ .../Filesystem/OutputCompressedFileStream.h | 23 +++++++ 4 files changed, 152 insertions(+) create mode 100644 src/System/Filesystem/IOapi.h create mode 100644 src/System/Filesystem/OutputCompressedFileStream.cpp create mode 100644 src/System/Filesystem/OutputCompressedFileStream.h diff --git a/Bin/LibD.pro b/Bin/LibD.pro index 0077d10..f27f96d 100644 --- a/Bin/LibD.pro +++ b/Bin/LibD.pro @@ -38,8 +38,10 @@ HEADERS += ../src/Actor/Player.h \ ../src/System/Debug.h \ ../src/System/ResourceManager.h \ ../src/System/Convert/str2int.h \ + ../src/System/Filesystem/IOapi.h \ ../src/System/Filesystem/FileTimestampChecker.h \ ../src/System/Convert/ConvertType.h \ + ../src/System/Filesystem/OutputCompressedFileStream.h \ ../src/System/Filesystem/InputCompressedFileStream.h \ ../src/System/Filesystem/InputStream.h \ ../src/System/Filesystem/OutputStream.h \ @@ -105,6 +107,7 @@ SOURCES += ../src/Actor/Player.cpp \ ../src/System/Debug.cpp \ ../src/System/Convert/str2int.cpp \ ../src/System/Filesystem/FileTimestampChecker.cpp \ + ../src/System/Filesystem/OutputCompressedFileStream.cpp \ ../src/System/Filesystem/InputCompressedFileStream.cpp \ ../src/System/Filesystem/InputStream.cpp \ ../src/System/Filesystem/OutputStream.cpp \ diff --git a/src/System/Filesystem/IOapi.h b/src/System/Filesystem/IOapi.h new file mode 100644 index 0000000..f559b69 --- /dev/null +++ b/src/System/Filesystem/IOapi.h @@ -0,0 +1,60 @@ +// This is an IO base function header for compress and uncompress. +// This is for files using zlib + zip or unzip. + +#pragma once + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (3) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + +#ifndef ZCALLBACK +#if(defined(WIN32) || defined(WINDOWS) || defined(_WINDOWS)) && \ + defined(CALLBACK) && defined(USEWINDOWS_CALLBACK) +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf(ZCALLBACK* open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK* read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK* write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong sixe)); +typedef long (ZCALLBACK* tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK* seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK* close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK* testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s { // WHY ?!?!?!!?! + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +void Fill_Fopen_FileFunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filfunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + +#ifdef __cplusplus +} +#endif + diff --git a/src/System/Filesystem/OutputCompressedFileStream.cpp b/src/System/Filesystem/OutputCompressedFileStream.cpp new file mode 100644 index 0000000..b6a94e9 --- /dev/null +++ b/src/System/Filesystem/OutputCompressedFileStream.cpp @@ -0,0 +1,66 @@ +#include +#include +#include + +#include "OutputCompressedFileStream.h" + +namespace saracraft { +namespace filesystem { + +struct OutputCompressedFileStreamBufferData { + std::ofstream stream; + std::vector buffer; + + OutputCompressedFileStreamBufferData(const std::string filename) : + stream(filename.c_str(), std::ios::binary) { + + } + + ~OutputCompressedFileStreamBufferData(void) { + } + + void Compress(void) { + int bytes = buffer.size(); + stream.write((char*)& bytes, sizeof(int)); + if(!bytes) + return; + + std::vector tempBuffer(bytes+12); + Bytef* source = &buffer[0]; + uLong sourceLength = buffer.size(); + Bytef* destination = (Bytef*)& tempBuffer[0]; + uLong destinationLength = tempBuffer.size(); + + int code = ::compress(destination, &destinationLength, source, sourceLength); + if(code != Z_OK) + int a = 0; + stream.write(&tempBuffer[0], destinationLength); + } +}; + +OutputCompressedFileStreamBuffer::OutputCompressedFileStreamBuffer(const std::string& filename) { + boost::scoped_ptr tempData(new OutputCompressedFileStreamBufferData(filename)); + _data.swap(tempData); +} + +OutputCompressedFileStreamBuffer::~OutputCompressedFileStreamBuffer(void) { + _data->Compress(); +} + +void OutputCompressedFileStreamBuffer::PutByte(unsigned char c) { + _data->buffer.push_back(c); + //char c_ = c; + //_data->stream.Write(&c_, 1); +} + +OutputStream CreateOutputCompressedFileStream(const std::string& filename) { + OutputStream outputStream; + boost::shared_ptr outputBuffer(new OutputCompressedFileStreamBuffer(filename)); + + outputStream.SetBuffer(outputBuffer); + return outputStream; +} + +} // Namespace filesystem. +} // Namespace saracraft. + diff --git a/src/System/Filesystem/OutputCompressedFileStream.h b/src/System/Filesystem/OutputCompressedFileStream.h new file mode 100644 index 0000000..2bccb32 --- /dev/null +++ b/src/System/Filesystem/OutputCompressedFileStream.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include "OutputStream.h" + +namespace saracraft { +namespace filesystem { + +struct OutputCompressedFileStreamBufferData; + +class OutputCompressedFileStreamBuffer : public IOutputStreamBuffer { + boost::scoped_ptr _data; +public: + OutputCompressedFileStreamBuffer(const std::string& filename); + ~OutputCompressedFileStreamBuffer(void); + + void PutByte(unsigned char c); +}; + +OutputStream CreateOutputCompressedFileStream(const std::string& filename); + +} // Namespace filesystem. +} // Namespace saracraft. +