// LzmaDecoder.h #ifndef ZIP7_INC_LZMA_DECODER_H #define ZIP7_INC_LZMA_DECODER_H // #include "../../../C/Alloc.h" #include "../../../C/LzmaDec.h" #include "../../Common/MyCom.h" #include "../ICoder.h" namespace NCompress { namespace NLzma { class CDecoder Z7_final: public ICompressCoder, public ICompressSetDecoderProperties2, public ICompressSetFinishMode, public ICompressGetInStreamProcessedSize, public ICompressSetBufSize, #ifndef Z7_NO_READ_FROM_CODER public ICompressSetInStream, public ICompressSetOutStreamSize, public ISequentialInStream, #endif public CMyUnknownImp { Z7_COM_QI_BEGIN2(ICompressCoder) Z7_COM_QI_ENTRY(ICompressSetDecoderProperties2) Z7_COM_QI_ENTRY(ICompressSetFinishMode) Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize) Z7_COM_QI_ENTRY(ICompressSetBufSize) #ifndef Z7_NO_READ_FROM_CODER Z7_COM_QI_ENTRY(ICompressSetInStream) Z7_COM_QI_ENTRY(ICompressSetOutStreamSize) Z7_COM_QI_ENTRY(ISequentialInStream) #endif Z7_COM_QI_END Z7_COM_ADDREF_RELEASE Z7_IFACE_COM7_IMP(ICompressCoder) public: Z7_IFACE_COM7_IMP(ICompressSetDecoderProperties2) private: Z7_IFACE_COM7_IMP(ICompressSetFinishMode) Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize) // Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize) Z7_IFACE_COM7_IMP(ICompressSetBufSize) #ifndef Z7_NO_READ_FROM_CODER public: Z7_IFACE_COM7_IMP(ICompressSetInStream) private: Z7_IFACE_COM7_IMP(ISequentialInStream) Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize) #else Z7_COM7F_IMF(SetOutStreamSize(const UInt64 *outSize)); #endif public: bool FinishStream; // set it before decoding, if you need to decode full LZMA stream private: bool _propsWereSet; bool _outSizeDefined; UInt32 _outStep; UInt32 _inBufSize; UInt32 _inBufSizeNew; ELzmaStatus _lzmaStatus; UInt32 _inPos; UInt32 _inLim; Byte *_inBuf; UInt64 _outSize; UInt64 _inProcessed; UInt64 _outProcessed; // CAlignOffsetAlloc _alloc; CLzmaDec _state; HRESULT CreateInputBuffer(); HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress); void SetOutStreamSizeResume(const UInt64 *outSize); #ifndef Z7_NO_READ_FROM_CODER private: CMyComPtr _inStream; public: HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress); HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize); #endif public: CDecoder(); ~CDecoder(); UInt64 GetInputProcessedSize() const { return _inProcessed; } UInt64 GetOutputProcessedSize() const { return _outProcessed; } bool NeedsMoreInput() const { return _lzmaStatus == LZMA_STATUS_NEEDS_MORE_INPUT; } bool CheckFinishStatus(bool withEndMark) const { return _lzmaStatus == (withEndMark ? LZMA_STATUS_FINISHED_WITH_MARK : LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK); } }; }} #endif