120 lines
3.2 KiB
C
120 lines
3.2 KiB
C
|
|
#ifndef _WYL_ZLIB_STREAM_H_
|
|||
|
|
#define _WYL_ZLIB_STREAM_H_
|
|||
|
|
|
|||
|
|
|
|||
|
|
/******************************************************************
|
|||
|
|
*
|
|||
|
|
* wyLib库 2008 - 2010
|
|||
|
|
*
|
|||
|
|
* $ ZIP压缩、解压类 $
|
|||
|
|
*
|
|||
|
|
* - 主要功能 -
|
|||
|
|
*
|
|||
|
|
* 使用流的方式封装ZIP压缩和解压缩代码。
|
|||
|
|
*
|
|||
|
|
*****************************************************************/
|
|||
|
|
|
|||
|
|
|
|||
|
|
namespace wylib
|
|||
|
|
{
|
|||
|
|
namespace zstream
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
/* ZLib流的基类
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
class CBaseZStream
|
|||
|
|
: public stream::CBaseStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef CBaseStream Inherited;
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
CBaseStream *m_pStrm; //zlib操作的目标流
|
|||
|
|
LONGLONG m_nStrmPos; //目标流的指针位置
|
|||
|
|
z_stream m_ZStrm; //zlib操作的z_stream结构
|
|||
|
|
Bytef m_sBuffer[260]; //zlib操作缓冲区
|
|||
|
|
int m_nLastCode; //上一次操作的返回码
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
static void* zlibAllocMem(CBaseZStream& ZStream, uInt Items, uInt Size);
|
|||
|
|
static void zlibFreeMem(CBaseZStream& ZStream, void *lpBlock);
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//zlib操作内存申请函数,如果关心内存的申请和释放,则可在继承类中覆盖此函数
|
|||
|
|
virtual void* Alloc(LONGLONG size);
|
|||
|
|
//zlib操作释放内存函数,如果关心内存的申请和释放,则可在继承类中覆盖此函数
|
|||
|
|
virtual void Free(void* ptr);
|
|||
|
|
//zlib操作进度通知函数,如果关心进度,则在子类中覆盖此函数即可
|
|||
|
|
virtual void DoProgress();
|
|||
|
|
//设置上当前操作的返回码
|
|||
|
|
inline void setLastCode(const int code){ m_nLastCode = code; }
|
|||
|
|
public:
|
|||
|
|
CBaseZStream(CBaseStream &stream);
|
|||
|
|
virtual ~CBaseZStream();
|
|||
|
|
|
|||
|
|
//获取上一次操作的返回码
|
|||
|
|
inline int getLastCode(){ return m_nLastCode; }
|
|||
|
|
inline int succeeded(){ return m_nLastCode >= 0; }
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* ZLib压缩流
|
|||
|
|
可对数据进行压缩并写入到流中
|
|||
|
|
*/
|
|||
|
|
class CZCompressionStream
|
|||
|
|
: public CBaseZStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef CBaseZStream Inherited;
|
|||
|
|
|
|||
|
|
enum CompressionLevel
|
|||
|
|
{
|
|||
|
|
clNone = 0, //储存(未压缩)
|
|||
|
|
clFastest, //最快压缩(速度快,节省时间但压缩比不高)
|
|||
|
|
clDefault, //默认压缩等级(压缩速度和压缩比率均折中)
|
|||
|
|
clMax, //最高压缩比(压缩速度慢,但压缩比较高)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
CZCompressionStream(CBaseStream& destStream, CompressionLevel CmprsLvl);
|
|||
|
|
~CZCompressionStream();
|
|||
|
|
|
|||
|
|
LONGLONG seek(const LONGLONG tOffset, const int Origin);
|
|||
|
|
LONGLONG read(LPVOID lpBuffer, const LONGLONG tSizeToRead){ return -1; };
|
|||
|
|
LONGLONG write(LPCVOID lpBuffer, const LONGLONG tSizeToWrite);
|
|||
|
|
//提交压缩缓冲中的数据到流中
|
|||
|
|
void finish();
|
|||
|
|
//获取压缩后的压缩比,返回的是一个浮点数
|
|||
|
|
inline float getCompressionRate()
|
|||
|
|
{
|
|||
|
|
if ( m_ZStrm.total_in == 0 )
|
|||
|
|
return 0;
|
|||
|
|
else return (1.0f - ((float)m_ZStrm.total_out / m_ZStrm.total_in)) * 100.0f;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* ZLib解压流
|
|||
|
|
可对数据进行解压并写入到流中
|
|||
|
|
*/
|
|||
|
|
class CZDecompressionStream
|
|||
|
|
: public CBaseZStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef CBaseZStream Inherited;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
CZDecompressionStream(CBaseStream &source);
|
|||
|
|
~CZDecompressionStream();
|
|||
|
|
|
|||
|
|
LONGLONG seek(const LONGLONG tOffset, const int Origin);
|
|||
|
|
LONGLONG read(LPVOID lpBuffer, const LONGLONG tSizeToRead);
|
|||
|
|
LONGLONG write(LPCVOID lpBuffer, const LONGLONG tSizeToWrite){ return -1; };
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|