191 lines
4.5 KiB
C
191 lines
4.5 KiB
C
|
|
#ifndef __FILESTREAM_H_
|
|||
|
|
#define __FILESTREAM_H_
|
|||
|
|
|
|||
|
|
#include <zlib.h>
|
|||
|
|
#include "memory/base_allocator.hpp"
|
|||
|
|
|
|||
|
|
namespace stream
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>࣬<EFBFBD>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>麯<EFBFBD><E9BAAF><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
class BaseStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
BaseStream(BaseAllocator* alloc)
|
|||
|
|
{
|
|||
|
|
alloc_ = alloc;
|
|||
|
|
};
|
|||
|
|
virtual ~BaseStream() {};
|
|||
|
|
|
|||
|
|
virtual int getSize();
|
|||
|
|
virtual bool setSize(int)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
inline int getPosition()
|
|||
|
|
{
|
|||
|
|
return seek(0, SEEK_CUR);
|
|||
|
|
}
|
|||
|
|
int setPosition(const int tPosition);
|
|||
|
|
virtual int seek(const int tOffset, const int Origin) = 0;
|
|||
|
|
virtual int read(void* lpBuffer, const int tSizeToRead) = 0;
|
|||
|
|
virtual int write(const void* lpBuffer, const size_t tSizeToWrite) = 0;
|
|||
|
|
virtual int copyFrom(BaseStream& stream, int tSizeToCopy = 0);
|
|||
|
|
protected:
|
|||
|
|
BaseAllocator* alloc_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* <09>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<EFBFBD>е<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
class FileStream
|
|||
|
|
: public BaseStream
|
|||
|
|
{
|
|||
|
|
protected:
|
|||
|
|
#ifdef _MSC_VER
|
|||
|
|
HANDLE hdl_;
|
|||
|
|
#else
|
|||
|
|
FILE* fp_;
|
|||
|
|
#endif
|
|||
|
|
public:
|
|||
|
|
#ifdef _MSC_VER
|
|||
|
|
void setHandle(HANDLE Handle);
|
|||
|
|
#endif
|
|||
|
|
//<2F>ļ<EFBFBD><C4BC>Ĵ<C4B4>ʽ
|
|||
|
|
enum FileAccessType
|
|||
|
|
{
|
|||
|
|
faRead = 0x0001, //<2F><>ȡ
|
|||
|
|
faWrite = 0x0002, //д<><D0B4>
|
|||
|
|
faCreate = 0x1000, //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
faShareRead = 0x0100, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
faShareWrite = 0x0200, //д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
faShareDelete = 0x0400, //ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
};
|
|||
|
|
//win32<33>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
enum OpenDisposition
|
|||
|
|
{
|
|||
|
|
CreateIfNotExists = 1, //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
AlwaysCreate, //<2F><><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ض<EFBFBD>Ϊ0<CEAA>ֽ<EFBFBD>
|
|||
|
|
OpenExistsOnly, //<2F><><EFBFBD><EFBFBD><F2BFAAB4>ڵ<EFBFBD><DAB5>ļ<EFBFBD>
|
|||
|
|
AlwaysOpen, //<2F><><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<D3B4><F2BFAAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
TruncExistsOnly, //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ض<EFBFBD>Ϊ0<CEAA>ֽ<EFBFBD>
|
|||
|
|
};
|
|||
|
|
private:
|
|||
|
|
char fn_[256];
|
|||
|
|
protected:
|
|||
|
|
void setFileName(const char* lpFileName);
|
|||
|
|
void construct(const char* lpFileName, unsigned int dwAccessType, unsigned int dwWin32CreationDisposition);
|
|||
|
|
public:
|
|||
|
|
FileStream(const char* lpFileName, unsigned int dwAccessType, BaseAllocator* alloc);
|
|||
|
|
FileStream(const char* lpFileName, unsigned int dwAccessType, OpenDisposition eWin32CreateionDisposition, BaseAllocator* alloc);
|
|||
|
|
~FileStream();
|
|||
|
|
int seek(const int tOffset, const int Origin);
|
|||
|
|
int read(void* lpBuffer, const int tSizeToRead);
|
|||
|
|
int write(const void* lpBuffer, const size_t tSizeToWrite);
|
|||
|
|
inline const char* getFileName()
|
|||
|
|
{
|
|||
|
|
return fn_;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* <09>ڴ<EFBFBD><DAB4><EFBFBD>
|
|||
|
|
ʹ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
class MemoryStream
|
|||
|
|
: public BaseStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef BaseStream Inherited;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
char* mem_; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
char* ptr_; //<2F><>ָ<EFBFBD><D6B8>
|
|||
|
|
char* end_ptr_; //<2F>ļ<EFBFBD>βָ<CEB2><D6B8>
|
|||
|
|
char* mem_end_; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַָ<D6B7><D6B8>
|
|||
|
|
int alloc_count_; // ÿ<><C3BF><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
protected:
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ڼ̳<DABC><CCB3><EFBFBD><EFBFBD>и<EFBFBD><D0B8>Ǵ˺<C7B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
virtual char* AllocStream(char* ptr, const int size);
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
MemoryStream(BaseAllocator* alloc);
|
|||
|
|
~MemoryStream();
|
|||
|
|
|
|||
|
|
bool setSize(int tSize);
|
|||
|
|
int seek(const int tOffset, const int Origin);
|
|||
|
|
int read(void* lpBuffer, const int tSizeToRead);
|
|||
|
|
int write(const void* lpBuffer, const size_t tSizeToWrite);
|
|||
|
|
void setAllocSize(int size)
|
|||
|
|
{
|
|||
|
|
alloc_count_ = size;
|
|||
|
|
}
|
|||
|
|
//<2F><>ȡ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
inline void* getMemory()
|
|||
|
|
{
|
|||
|
|
return mem_;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ڴ<EFBFBD>
|
|||
|
|
int loadFromFile(const char* lpFileName);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>浽<EFBFBD>ļ<EFBFBD>
|
|||
|
|
int saveToFile(const char* lpFileName);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* ZLib<69><62>ѹ<EFBFBD><D1B9>
|
|||
|
|
<EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>н<EFBFBD>ѹ<EFBFBD><EFBFBD>д<EFBFBD>뵽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
class ZDecompressionStream
|
|||
|
|
: public BaseStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef BaseStream Inherited;
|
|||
|
|
protected:
|
|||
|
|
BaseStream* strm_; //zlib<69><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
|
|||
|
|
int strm_pos_; //Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB>
|
|||
|
|
z_stream z_strm_; //zlib<69><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>z_stream<61>ṹ
|
|||
|
|
Bytef buff_[0xffff]; //zlib<69><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int last_code_; //<2F><>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
ZDecompressionStream(BaseStream& source, BaseAllocator* alloc);
|
|||
|
|
~ZDecompressionStream();
|
|||
|
|
|
|||
|
|
int seek(const int tOffset, const int Origin);
|
|||
|
|
int read(void* lpBuffer, const int tSizeToRead);
|
|||
|
|
int write(const void*, const size_t)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
int copyFrom(BaseStream&, int)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
private:
|
|||
|
|
static void* zlibAllocMem(ZDecompressionStream& ZStream, uInt Items, uInt Size);
|
|||
|
|
static void zlibFreeMem(ZDecompressionStream& ZStream, void* lpBlock);
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//zlib<69><62><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>뺯<EFBFBD><EBBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷţ<CDB7><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ̳<DABC><CCB3><EFBFBD><EFBFBD>и<EFBFBD><D0B8>Ǵ˺<C7B4><CBBA><EFBFBD>
|
|||
|
|
void* AllocStream(int size);
|
|||
|
|
//zlib<69><62><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ溯<DAB4><E6BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷţ<CDB7><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ̳<DABC><CCB3><EFBFBD><EFBFBD>и<EFBFBD><D0B8>Ǵ˺<C7B4><CBBA><EFBFBD>
|
|||
|
|
void SFree(void* ptr);
|
|||
|
|
//zlib<69><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8>Ǵ˺<C7B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void DoProgress();
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline void setLastCode(const int code)
|
|||
|
|
{
|
|||
|
|
last_code_ = code;
|
|||
|
|
}
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline int getLastCode()
|
|||
|
|
{
|
|||
|
|
return last_code_;
|
|||
|
|
}
|
|||
|
|
inline int succeeded()
|
|||
|
|
{
|
|||
|
|
return last_code_ >= 0;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|