From 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 8 Jun 2008 11:04:43 +0200 Subject: Initial commit --- zip/ZipArchive/BaseLibCompressor.h | 198 +++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 zip/ZipArchive/BaseLibCompressor.h (limited to 'zip/ZipArchive/BaseLibCompressor.h') diff --git a/zip/ZipArchive/BaseLibCompressor.h b/zip/ZipArchive/BaseLibCompressor.h new file mode 100644 index 0000000..4bda925 --- /dev/null +++ b/zip/ZipArchive/BaseLibCompressor.h @@ -0,0 +1,198 @@ +//////////////////////////////////////////////////////////////////////////////// +// This source file is part of the ZipArchive library source distribution and +// is Copyrighted 2000 - 2007 by Artpol Software - Tadeusz Dracz +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// For the licensing details refer to the License.txt file. +// +// Web Site: http://www.artpol-software.com +//////////////////////////////////////////////////////////////////////////////// + +/** +* \file BaseLibCompressor.h +* Includes the ZipArchiveLib::CBaseLibCompressor class. +* +*/ + +#if !defined(ZIPARCHIVE_BASELIBCOMPRESSOR_DOT_H) +#define ZIPARCHIVE_BASELIBCOMPRESSOR_DOT_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "ZipExport.h" +#include "ZipCompressor.h" +#include "ZipCollections.h" +#include "ZipException.h" + +namespace ZipArchiveLib +{ + +/** + A base class for compressors that use external libraries, such as zlib or bzip2. +*/ +class ZIP_API CBaseLibCompressor : public CZipCompressor +{ +public: + /** + Represents options of compressors that use external libraries. + + \see + 0610231446|options + \see + CZipArchive::SetCompressionOptions + */ + struct ZIP_API COptions : CZipCompressor::COptions + { + COptions() + { + m_bDetectLibMemoryLeaks = true; + } + + /** + \c true, if the ZipArchive Library should detect memory leaks in an external library; \c false otherwise. + Recommended to be set to \c true. + */ + bool m_bDetectLibMemoryLeaks; + }; + + /** + Initializes a new instance of the CBaseLibCompressor class. + + \param pStorage + The current storage object. + */ + CBaseLibCompressor(CZipStorage* pStorage) + :CZipCompressor(pStorage) + { + } + + void InitDecompression(CZipFileHeader* pFile, CZipCryptograph* pCryptograph) + { + CZipCompressor::InitDecompression(pFile, pCryptograph); + m_bDecompressionDone = false; + } + + ~CBaseLibCompressor() + { + EmptyPtrList(); + } +protected: + + /** + A memory allocation method called by an external library. + + \param opaque + Internal data. + + \param items + The number of blocks to allocate. + + \param size + The size of each block to allocate. + + \return + The address of a newly allocated memory. + */ + static void* _zipalloc(void* opaque, UINT items, UINT size) + { + void* p = new char[size * items]; + if (opaque) + { + CZipPtrList* list = (CZipPtrList*) opaque; + list->AddTail(p); + } + return p; + } + + /** + A memory deallocation method called by an external library. + + \param opaque + Internal data. + + \param address + Memory address to free. + */ + static void _zipfree(void* opaque, void* address) + { + if (opaque) + { + CZipPtrList* list = (CZipPtrList*) opaque; + CZipPtrListIter iter = list->Find(address); + if (list->IteratorValid(iter)) + list->RemoveAt(iter); + } + delete[] (char*) address; + } + + /** + Frees the memory allocated by an external library that hasn't been freed + due to an error in the library (usually never happens). + */ + void EmptyPtrList(); + + /** + Checks, if \a iErr value is an error code. + + \param iErr + The code to check. + + \return + \c true, if \a iErr is an error code; \c false otherwise. + */ + virtual bool IsCodeErrorOK(int iErr) const = 0; + + /** + Checks, if \a iErr value is an error code and throws an exception, if it is. + + \param iErr + The error code. + + \note + Throws exceptions. + */ + void CheckForError(int iErr) + { + if (!IsCodeErrorOK(iErr)) + ThrowError(iErr, true); + } + + /** + Sets an address of internal data used in ZipArchive Library memory allocation and deallocation methods. + + \param opaque + Receives an address on the internal data. + \param pOptions + The current decompressor options. + */ + void SetOpaque(void** opaque, const COptions* pOptions); + + /** + Signalizes, that the decompression process reached the end of the compressed data. It is internally set by derived classes. + */ + bool m_bDecompressionDone; +private: + typedef CZipPtrList::iterator CZipPtrListIter; + +#if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL) + #pragma warning (push) + #pragma warning( disable : 4251 ) // needs to have dll-interface to be used by clients of class +#endif + + CZipPtrList m_list; ///< A list holding pointers to the memory areas allocated by an external library. + +#if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL) + #pragma warning( pop) +#endif + +}; + +} // namespace + +#endif -- cgit v1.2.3