00001
00011 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00012 #pragma once
00013 #endif
00014 #ifndef COMMON_ZLIB_UTILS_H_
00015 #define COMMON_ZLIB_UTILS_H_
00016
00017 #include "Stream.hpp"
00018 #include "Error.hpp"
00019
00020 namespace common
00021 {
00022
00027
00029 class ZlibError : public Error
00030 {
00031 public:
00032 ZlibError(int Code, const tstring &Msg = _T(""), const tstring &File = _T(""), int Line = 0);
00033 };
00034
00037
00038 const int ZLIB_STORE_LEVEL = 0;
00040 const int ZLIB_FASTEST_LEVEL = 1;
00042 const int ZLIB_BEST_LEVEL = 9;
00044 extern const int ZLIB_DEFAULT_LEVEL;
00046
00048 class ZlibCompressionStream_pimpl;
00050 class ZlibDecompressionStream_pimpl;
00051
00053 class ZlibCompressionStream : public OverlayStream
00054 {
00055 private:
00056 scoped_ptr<ZlibCompressionStream_pimpl> pimpl;
00057
00058 public:
00059 ZlibCompressionStream(Stream *a_Stream, int Level = ZLIB_DEFAULT_LEVEL, int WindowBits = 15);
00060 virtual ~ZlibCompressionStream();
00061
00062
00063
00064 virtual void Write(const void *Data, size_t Size);
00066 virtual void Flush();
00067
00069 static size_t CompressLength(size_t DataLength);
00071
00076 static size_t Compress(void *OutData, size_t BufLength, const void *Data, size_t DataLength, int Level = ZLIB_DEFAULT_LEVEL);
00077 };
00078
00080
00081 class GzipCompressionStream : public OverlayStream
00082 {
00083 private:
00084 scoped_ptr<ZlibCompressionStream_pimpl> pimpl;
00085
00086 public:
00091 GzipCompressionStream(Stream *a_Stream, const string *FileName, const string *Comment, int Level = ZLIB_DEFAULT_LEVEL, int WindowBits = 15);
00092 virtual ~GzipCompressionStream();
00093
00094
00095
00096 virtual void Write(const void *Data, size_t Size);
00097 virtual void Flush();
00098 };
00099
00101 class ZlibDecompressionStream : public OverlayStream
00102 {
00103 private:
00104 scoped_ptr<ZlibDecompressionStream_pimpl> pimpl;
00105
00106 public:
00107 ZlibDecompressionStream(Stream *a_Stream, int WindowBits = 15);
00108 virtual ~ZlibDecompressionStream();
00109
00110
00111
00112 virtual size_t Read(void *Out, size_t MaxLength);
00113 virtual bool End();
00114
00116
00121 static size_t Decompress(void *OutData, size_t BufLength, const void *Data, size_t DataLength);
00122 };
00123
00125
00126 class GzipDecompressionStream : public OverlayStream
00127 {
00128 private:
00129 scoped_ptr<ZlibDecompressionStream_pimpl> pimpl;
00130
00131 public:
00132 GzipDecompressionStream(Stream *a_Stream, int WindowBits = 15);
00133 virtual ~GzipDecompressionStream();
00134
00135
00136
00137 virtual size_t Read(void *Out, size_t MaxLength);
00138 virtual bool End();
00139
00145 bool GetHeaderFileName(string *OutFileName);
00146 bool GetHeaderComment(string *OutComment);
00148 };
00149
00151 enum GZIP_FILE_MODE
00152 {
00153 GZFM_WRITE,
00154 GZFM_READ,
00155 };
00156
00158 class GzipFileStream_pimpl;
00159
00161 class GzipFileStream : public Stream
00162 {
00163 private:
00164 scoped_ptr<GzipFileStream_pimpl> pimpl;
00165
00166 public:
00168 GzipFileStream(const string &FileName, GZIP_FILE_MODE Mode, int Level = ZLIB_DEFAULT_LEVEL);
00169 virtual ~GzipFileStream();
00170
00171
00172
00173 virtual void Write(const void *Data, size_t Size);
00174 virtual void Flush();
00175
00176 virtual size_t Read(void *Out, size_t MaxLength);
00177 virtual bool End();
00178 };
00179
00181
00182
00183 }
00184
00185 #endif