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);
GetInputProcessedSize()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 
GetOutputProcessedSize()83   UInt64 GetOutputProcessedSize() const { return _outSizeProcessed; }
84 };
85 
86 }}
87 
88 #endif
89