// XzDecoder.h #ifndef __XZ_DECODER_H #define __XZ_DECODER_H #include "../../../C/Xz.h" #include "../../Common/MyCom.h" #include "../ICoder.h" namespace NCompress { namespace NXz { struct CDecoder { CXzDecMtHandle xz; int _tryMt; UInt32 _numThreads; UInt64 _memUsage; SRes MainDecodeSRes; // it's not HRESULT bool MainDecodeSRes_wasUsed; CXzStatInfo Stat; CDecoder(): xz(NULL), _tryMt(True), _numThreads(1), _memUsage((UInt64)(sizeof(size_t)) << 28), MainDecodeSRes(SZ_OK), MainDecodeSRes_wasUsed(false) {} ~CDecoder() { if (xz) XzDecMt_Destroy(xz); } /* Decode() can return ERROR code only if there is progress or stream error. Decode() returns S_OK in case of xz decoding error, but DecodeRes and CStatInfo contain error information */ HRESULT Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream, const UInt64 *outSizeLimit, bool finishStream, ICompressProgressInfo *compressProgress); }; class CComDecoder: public ICompressCoder, public ICompressSetFinishMode, public ICompressGetInStreamProcessedSize, #ifndef _7ZIP_ST public ICompressSetCoderMt, public ICompressSetMemLimit, #endif public CMyUnknownImp, public CDecoder { bool _finishStream; public: MY_QUERYINTERFACE_BEGIN2(ICompressCoder) MY_QUERYINTERFACE_ENTRY(ICompressSetFinishMode) MY_QUERYINTERFACE_ENTRY(ICompressGetInStreamProcessedSize) #ifndef _7ZIP_ST MY_QUERYINTERFACE_ENTRY(ICompressSetCoderMt) MY_QUERYINTERFACE_ENTRY(ICompressSetMemLimit) #endif MY_QUERYINTERFACE_END MY_ADDREF_RELEASE STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); STDMETHOD(SetFinishMode)(UInt32 finishMode); STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); #ifndef _7ZIP_ST STDMETHOD(SetNumberOfThreads)(UInt32 numThreads); STDMETHOD(SetMemLimit)(UInt64 memUsage); #endif CComDecoder(): _finishStream(false) {} }; }} #endif