diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-08 11:04:43 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-08 11:04:43 +0200 |
| commit | 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d (patch) | |
| tree | 3d22f54f7298f81b18ed66d05a62fa8bfab359ab /zip/ZipArchive/BaseLibCompressor.h | |
| download | tuxcmd-modules-16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d.tar.xz | |
Initial commitv0.6.36release-0.6.36-dev
Diffstat (limited to 'zip/ZipArchive/BaseLibCompressor.h')
| -rw-r--r-- | zip/ZipArchive/BaseLibCompressor.h | 198 |
1 files changed, 198 insertions, 0 deletions
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
+ <a href="kb">0610231446|options</a>
+ \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<void*>* list = (CZipPtrList<void*>*) 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<void*>* list = (CZipPtrList<void*>*) 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<void*>::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<void*> 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
|
