| // 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<ISequentialInStream> _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 |