1 // LzmaDecoder.h 2 3 #ifndef __LZMA_DECODER_H 4 #define __LZMA_DECODER_H 5 6 #include "../../../C/LzmaDec.h" 7 8 #include "../../Common/MyCom.h" 9 #include "../ICoder.h" 10 11 namespace NCompress { 12 namespace NLzma { 13 14 class CDecoder: 15 public ICompressCoder, 16 public ICompressSetDecoderProperties2, 17 public ICompressSetBufSize, 18 #ifndef NO_READ_FROM_CODER 19 public ICompressSetInStream, 20 public ICompressSetOutStreamSize, 21 public ISequentialInStream, 22 #endif 23 public CMyUnknownImp 24 { 25 CMyComPtr<ISequentialInStream> _inStream; 26 Byte *_inBuf; 27 UInt32 _inPos; 28 UInt32 _inSize; 29 CLzmaDec _state; 30 bool _propsWereSet; 31 bool _outSizeDefined; 32 UInt64 _outSize; 33 UInt64 _inSizeProcessed; 34 UInt64 _outSizeProcessed; 35 36 UInt32 _inBufSizeAllocated; 37 UInt32 _inBufSize; 38 UInt32 _outBufSize; 39 SizeT _wrPos; 40 41 HRESULT CreateInputBuffer(); 42 HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress); 43 void SetOutStreamSizeResume(const UInt64 *outSize); 44 45 public: 46 MY_QUERYINTERFACE_BEGIN2(ICompressCoder) 47 MY_QUERYINTERFACE_ENTRY(ICompressSetDecoderProperties2) 48 MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize) 49 #ifndef NO_READ_FROM_CODER 50 MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) 51 MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize) 52 MY_QUERYINTERFACE_ENTRY(ISequentialInStream) 53 #endif 54 MY_QUERYINTERFACE_END 55 MY_ADDREF_RELEASE 56 57 STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, 58 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); 59 STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); 60 STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); 61 STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); 62 STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); 63 64 #ifndef NO_READ_FROM_CODER 65 66 STDMETHOD(SetInStream)(ISequentialInStream *inStream); 67 STDMETHOD(ReleaseInStream)(); 68 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 69 70 HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress); 71 HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize); 72 UInt64 GetInputProcessedSize() const { return _inSizeProcessed; } 73 74 #endif 75 76 bool FinishStream; // set it before decoding, if you need to decode full LZMA stream 77 78 bool NeedMoreInput; // it's set by decoder, if it needs more input data to decode stream 79 80 CDecoder(); 81 virtual ~CDecoder(); 82 83 UInt64 GetOutputProcessedSize() const { return _outSizeProcessed; } 84 }; 85 86 }} 87 88 #endif 89