196 lines
9.2 KiB
C++
196 lines
9.2 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
||
// This source file is part of the ZipArchive library source distribution and
|
||
// is Copyrighted 2000 - 2012 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 (it should never happen).
|
||
*/
|
||
void EmptyPtrList();
|
||
|
||
/**
|
||
Checks whether \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 whether \a iErr value is an error code and throws an exception if it is.
|
||
|
||
\param iErr
|
||
The error code.
|
||
|
||
*/
|
||
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 of 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
|