00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014
00021 #if !defined(ZIPARCHIVE_ZIPCOMPRESSOR_DOT_H)
00022 #define ZIPARCHIVE_ZIPCOMPRESSOR_DOT_H
00023
00024 #if _MSC_VER > 1000
00025 #pragma once
00026 #pragma warning( push )
00027 #pragma warning (disable: 4100) // unreferenced formal parameter
00028 #pragma warning (disable: 4275) // non dll-interface class 'CObject' used as base for dll-interface class 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>'
00029 #endif
00030
00031 #include "ZipExport.h"
00032 #include "ZipAutoBuffer.h"
00033 #include "ZipFileHeader.h"
00034 #include "ZipStorage.h"
00035 #include "ZipCryptograph.h"
00036 #include "ZipException.h"
00037
00041 class ZIP_API CZipCompressor
00042 {
00043 protected:
00044 CZipStorage* m_pStorage;
00045 CZipAutoBuffer m_pBuffer;
00046 CZipCryptograph* m_pCryptograph;
00047 CZipFileHeader* m_pFile;
00048
00049
00056 CZipCompressor(CZipStorage* pStorage)
00057 :m_pStorage(pStorage)
00058 {
00059 m_pCryptograph = NULL;
00060 m_uUncomprLeft = 0;
00061 m_uComprLeft = 0;
00062 m_uCrc32 = 0;
00063 }
00064
00065 public:
00069 enum CompressorType
00070 {
00071 typeDeflate = 1,
00072 typeBzip2
00073 };
00074
00078 enum CompressionLevel
00079 {
00080 levelDefault = -1,
00081 levelStore = 0,
00082 levelFastest = 1,
00083 levelBest = 9
00084 };
00085
00089 enum CompressionMethod
00090 {
00091 methodStore = 0,
00092 methodDeflate = 8,
00093
00099 methodBzip2 = 12,
00109 methodWinZipAes = 99
00110 };
00111
00120 struct ZIP_API COptions
00121 {
00122
00126 enum Constants
00127 {
00131 cDefaultBufferSize = 2 * 65536
00132 };
00133
00134 COptions()
00135 {
00136 m_iBufferSize = cDefaultBufferSize;
00137 }
00138
00145 virtual int GetType() const = 0;
00146
00153 virtual COptions* Clone() const = 0;
00154
00163 int m_iBufferSize;
00164 virtual ~COptions()
00165 {
00166 }
00167 };
00168
00169
00176 class ZIP_API COptionsMap : public CZipMap<int, COptions*>
00177 {
00178 public:
00179 void Set(const COptions* pOptions);
00180 void Remove(int iType);
00181 COptions* Get(int iType) const;
00182 ~COptionsMap();
00183 };
00184
00194 static bool IsCompressionSupported(WORD uCompressionMethod)
00195 {
00196 return uCompressionMethod == methodStore || uCompressionMethod == methodDeflate
00197 ;
00198 }
00199
00200 ZIP_SIZE_TYPE m_uUncomprLeft;
00201 ZIP_SIZE_TYPE m_uComprLeft;
00202 DWORD m_uCrc32;
00203
00214 virtual bool CanProcess(WORD uMethod) = 0;
00215
00216
00234 virtual void InitCompression(int iLevel, CZipFileHeader* pFile, CZipCryptograph* pCryptograph)
00235 {
00236 InitBuffer();
00237 m_uComprLeft = 0;
00238 m_pFile = pFile;
00239 m_pCryptograph = pCryptograph;
00240 }
00241
00256 virtual void InitDecompression(CZipFileHeader* pFile, CZipCryptograph* pCryptograph)
00257 {
00258 InitBuffer();
00259 m_pFile = pFile;
00260 m_pCryptograph = pCryptograph;
00261
00262 m_uComprLeft = m_pFile->GetDataSize(true);
00263 m_uUncomprLeft = m_pFile->m_uUncomprSize;
00264 m_uCrc32 = 0;
00265 }
00266
00281 virtual void Compress(const void *pBuffer, DWORD uSize) = 0;
00282
00303 virtual DWORD Decompress(void *pBuffer, DWORD uSize) = 0;
00304
00316 virtual void FinishCompression(bool bAfterException){}
00317
00329 virtual void FinishDecompression(bool bAfterException){}
00330
00344 virtual const COptions* GetOptions() const
00345 {
00346 return NULL;
00347 }
00348
00361 void UpdateOptions(const COptionsMap& optionsMap);
00362
00363
00364 virtual ~CZipCompressor()
00365 {
00366 }
00367
00377 static CZipCompressor* CreateCompressor(WORD uMethod, CZipStorage* pStorage);
00378
00379
00380 protected:
00387 virtual void UpdateOptions(const COptions* pOptions)
00388 {
00389 }
00399 void UpdateFileCrc(const void *pBuffer, DWORD uSize);
00400
00410 void UpdateCrc(const void *pBuffer, DWORD uSize);
00411
00416 void FlushWriteBuffer()
00417 {
00418 if (m_pCryptograph)
00419 m_pCryptograph->Encode(m_pBuffer, (DWORD)m_uComprLeft);
00420 m_pStorage->Write(m_pBuffer, (DWORD)m_uComprLeft, false);
00421 m_uComprLeft = 0;
00422 }
00423
00430 void InitBuffer();
00431
00438 void ReleaseBuffer()
00439 {
00440 m_pBuffer.Release();
00441 }
00442
00452 virtual int ConvertInternalError(int iErr) const
00453 {
00454 return iErr;
00455 }
00456
00470 void ThrowError(int iErr, bool bInternal = false)
00471 {
00472 if (bInternal)
00473 iErr = ConvertInternalError(iErr);
00474 CZipException::Throw(iErr, m_pStorage->IsClosed(true) ? _T("") : (LPCTSTR)m_pStorage->m_pFile->GetFilePath());
00475 }
00476 };
00477
00478 #if _MSC_VER > 1000
00479 #pragma warning( pop )
00480 #endif
00481
00482 #endif