Files

191 lines
4.5 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#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