00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014
00021 #if !defined(ZIPARCHIVE_BASELIBCOMPRESSOR_DOT_H)
00022 #define ZIPARCHIVE_BASELIBCOMPRESSOR_DOT_H
00023
00024 #if _MSC_VER > 1000
00025 #pragma once
00026 #endif
00027
00028 #include "ZipExport.h"
00029 #include "ZipCompressor.h"
00030 #include "ZipCollections.h"
00031 #include "ZipException.h"
00032
00033 namespace ZipArchiveLib
00034 {
00035
00039 class ZIP_API CBaseLibCompressor : public CZipCompressor
00040 {
00041 public:
00050 struct ZIP_API COptions : CZipCompressor::COptions
00051 {
00052 COptions()
00053 {
00054 m_bDetectLibMemoryLeaks = true;
00055 }
00056
00061 bool m_bDetectLibMemoryLeaks;
00062 };
00063
00070 CBaseLibCompressor(CZipStorage* pStorage)
00071 :CZipCompressor(pStorage)
00072 {
00073 }
00074
00075 void InitDecompression(CZipFileHeader* pFile, CZipCryptograph* pCryptograph)
00076 {
00077 CZipCompressor::InitDecompression(pFile, pCryptograph);
00078 m_bDecompressionDone = false;
00079 }
00080
00081 ~CBaseLibCompressor()
00082 {
00083 EmptyPtrList();
00084 }
00085 protected:
00086
00102 static void* _zipalloc(void* opaque, UINT items, UINT size)
00103 {
00104 void* p = new char[size * items];
00105 if (opaque)
00106 {
00107 CZipPtrList<void*>* list = (CZipPtrList<void*>*) opaque;
00108 list->AddTail(p);
00109 }
00110 return p;
00111 }
00112
00122 static void _zipfree(void* opaque, void* address)
00123 {
00124 if (opaque)
00125 {
00126 CZipPtrList<void*>* list = (CZipPtrList<void*>*) opaque;
00127 CZipPtrListIter iter = list->Find(address);
00128 if (list->IteratorValid(iter))
00129 list->RemoveAt(iter);
00130 }
00131 delete[] (char*) address;
00132 }
00133
00138 void EmptyPtrList();
00139
00149 virtual bool IsCodeErrorOK(int iErr) const = 0;
00150
00158 void CheckForError(int iErr)
00159 {
00160 if (!IsCodeErrorOK(iErr))
00161 ThrowError(iErr, true);
00162 }
00163
00172 void SetOpaque(void** opaque, const COptions* pOptions);
00173
00177 bool m_bDecompressionDone;
00178 private:
00179 typedef CZipPtrList<void*>::iterator CZipPtrListIter;
00180
00181 #if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL)
00182 #pragma warning (push)
00183 #pragma warning( disable : 4251 ) // needs to have dll-interface to be used by clients of class
00184 #endif
00185
00186 CZipPtrList<void*> m_list;
00187
00188 #if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL)
00189 #pragma warning( pop)
00190 #endif
00191
00192 };
00193
00194 }
00195
00196 #endif