|
|
// TXINST.h -- Class definition for CTransformInstance based on ITransformInstance
//#include <stdio.h>
#ifndef __TXINST_H__
#define __TXINST_H__
const DWORD LZX_Current_Version = 2;
#define SOURCE_CHUNK (32*1024)
// Defaults for the control parameters:
#define WINDOW_SIZE 4 //128*1024
#define SECOND_PARTITION_SIZE 2 //64*1024
#define RESET_BLOCK_SIZE 4 //32*1024
#define SOURCE_SIZE (32*1024)
#define LXZ_DEF_OPT_FLAGS 0 // See OPT_FLAG_XXX series below
#define OPT_FLAG_EXE 0x00000001 // Optimizes x86 machine code, but adds overhead
// These counters are reported at the end of debug runs.
extern ULONG cLZXResetDecompressor; // Number of times the decompression state has been reset
extern ULONG cLZXReadFromBuffer; // Number of times we got data from this history window or
// the decoding buffer.
extern ULONG cLZXReadFromCurrentSpan; // Number of times we could continue decoding the current
// reset interval.
extern ULONG cLZXReadFromOtherSpan; // Number of times we had to abandon the current reset
// interval.
#ifdef _DEBUG
void DumpLZXCounts(); #endif // _DEBUG
class CXResetData;
extern CBuffer *pBufferForCompressedData; // Used to read compressed data from next transform
class CTransformInstance : public CITUnknown { public: // Destructor:
~CTransformInstance(void);
// Creator:
static HRESULT Create(ITransformInstance *pITxInst, ULARGE_INTEGER cbUntransformedSize, // Untransformed size of data
PXformControlData pXFCD, // Control data for this instance
const CLSID *rclsidXForm, // Transform Class ID
const WCHAR *pwszDataSpaceName, // Data space name for this instance
ITransformServices *pXformServices, // Utility routines
IKeyInstance *pKeyManager, // Interface to get encipheri);
ITransformInstance **ppTransformInstance // Where to return interface pointer
);
private:
CTransformInstance(IUnknown *punkOuter); class CImpITransformInstance : public IITTransformInstance { public:
CImpITransformInstance(CTransformInstance *pBackObj, IUnknown *punkOuter); ~CImpITransformInstance(void);
//Intialization methods
HRESULT InitTransformInstance(ITransformInstance *pITxInst, ULARGE_INTEGER cbUntransformedSize, // Untransformed size of data
PXformControlData pXFCD, // Control data for this instance
const CLSID *rclsidXForm, // Transform Class ID
const WCHAR *pwszDataSpaceName, // Data space name for this instance
ITransformServices *pXformServices, // Utility routines
IKeyInstance *pKeyManager); // Interface to get encipheri
//static transform specific methods
static MI_MEMORY __cdecl MyAlloc(ULONG); static void __cdecl MyFree(MI_MEMORY); static int __cdecl lzx_output_callback( void *pfol, unsigned char *compressed_data, long compressed_size, long uncompressed_size ); //ITransformInstance methods
HRESULT STDMETHODCALLTYPE ReadAt( /* [in] */ ULARGE_INTEGER ulOffset, /* [length_is][size_is][out] */ void *pv, /* [in] */ ULONG cb, /* [out] */ ULONG *pcbRead, /* [in] */ ImageSpan *pSpan);
HRESULT STDMETHODCALLTYPE WriteAt( /* [in] */ ULARGE_INTEGER ulOffset, /* [size_is][in] */ const void *pv, /* [in] */ ULONG cb, /* [out] */ ULONG *pcbWritten, /* [out] */ImageSpan *pSpan);
STDMETHODIMP SpaceSize(ULARGE_INTEGER *puliSize); STDMETHODIMP Flush(void);
private:
typedef struct _t_context { LCI_CONTEXT_HANDLE cHandle; /* compression context handle */ LDI_CONTEXT_HANDLE dHandle; /* decompression context handle */ LZXCONFIGURATION lcfg; LZXDECOMPRESS ldec; ULONG cbResetBlkSize; UINT cbMaxUncomBufSize; UINT cbMaxComBufSize; HRESULT hr; #if 0 //test code
FILE *m_file; #endif
} t_context;
HRESULT DeInitTransform(); int GetMulFactor() { return (m_context.cbResetBlkSize + m_context.cbMaxUncomBufSize - 1) / m_context.cbMaxUncomBufSize;
// int N = m_context.cbResetBlkSize / m_context.cbMaxUncomBufSize;
// if (N == 0)
// N = 1;
// return N;
}
HRESULT Commit(void); HRESULT Write(LPBYTE pbunXBuf, ULONG cbunXBuf); HRESULT ReconstructCompressionState(PBYTE pbWriteQueueBuffer); void CopyFromWindow(PBYTE pbDest, ULONG offStart, ULONG cb);
HRESULT HandleReadResidue(PBYTE pb, ULONG *pcbRead, BOOL fEOS, ImageSpan *pSpan, CULINT ullBase, CULINT ullLimit, CULINT ullXferBase, CULINT ullXferLimit ); HRESULT FlushQueuedOutput();
ITransformInstance *m_pITxNextInst;
LZX_Control_Data m_ControlData; const CLSID *m_rclsidXForm; const WCHAR *m_pwszDataSpaceName; ITransformServices *m_pXformServices; IKeyInstance *m_pKeyManager; ImageSpan m_ImageSpan; ImageSpan m_ImageSpanX; ULONG m_cbUnFlushedBuf; //number of bytes in unflushed buffer
ULONG m_cbResetSpan; //number of bytes in Reset span (X+Unx - not written to disk)
CBuffer m_buffReadCache; // Used when X86 machine code decompression is active.
CBuffer m_buffWriteQueue; // Used to queue up full write blocks for compression.
IStreamITEx *m_pStrmReconstruction; // Stream used to reconstruct the compression
// state for a file we've reloaded.
t_context m_context; CXResetData *m_pResetData; BOOL m_fDirty; BOOL m_fCompressionInitialed; BOOL m_fInitialed; // True => Initialing completed
BOOL m_fCompressionActive; BOOL m_fDecompressionActive; CULINT m_ullResetBase; CULINT m_ullResetLimit; CULINT m_ullBuffBase; CULINT m_ullReadCursor; CULINT m_ullWindowBase; PBYTE m_pbHistoryWindow; LONG m_cbHistoryWindow; };
CImpITransformInstance m_ImpITxInst; };
typedef CTransformInstance *PCTransformInstance;
inline CTransformInstance::CTransformInstance(IUnknown *pUnkOuter) : m_ImpITxInst(this, pUnkOuter), CITUnknown(&IID_ITransformInstance, 1, &m_ImpITxInst) {
}
inline CTransformInstance::~CTransformInstance(void) { }
#endif // __TXINST_H__
|