xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/LzmaDecoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LzmaDecoder.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZMA_DECODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZMA_DECODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker // #include "../../../C/Alloc.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/LzmaDec.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
13*f6dc9357SAndroid Build Coastguard Worker namespace NLzma {
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker class CDecoder Z7_final:
16*f6dc9357SAndroid Build Coastguard Worker   public ICompressCoder,
17*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetDecoderProperties2,
18*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetFinishMode,
19*f6dc9357SAndroid Build Coastguard Worker   public ICompressGetInStreamProcessedSize,
20*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetBufSize,
21*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_READ_FROM_CODER
22*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetInStream,
23*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetOutStreamSize,
24*f6dc9357SAndroid Build Coastguard Worker   public ISequentialInStream,
25*f6dc9357SAndroid Build Coastguard Worker  #endif
26*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
27*f6dc9357SAndroid Build Coastguard Worker {
28*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN2(ICompressCoder)
29*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetDecoderProperties2)
30*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetFinishMode)
31*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize)
32*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetBufSize)
33*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_READ_FROM_CODER
34*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetInStream)
35*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetOutStreamSize)
36*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ISequentialInStream)
37*f6dc9357SAndroid Build Coastguard Worker  #endif
38*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END
39*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressCoder)
42*f6dc9357SAndroid Build Coastguard Worker public:
43*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetDecoderProperties2)
44*f6dc9357SAndroid Build Coastguard Worker private:
45*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetFinishMode)
46*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize)
47*f6dc9357SAndroid Build Coastguard Worker   // Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize)
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetBufSize)
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_READ_FROM_CODER
52*f6dc9357SAndroid Build Coastguard Worker public:
53*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetInStream)
54*f6dc9357SAndroid Build Coastguard Worker private:
55*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ISequentialInStream)
56*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize)
57*f6dc9357SAndroid Build Coastguard Worker  #else
58*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(SetOutStreamSize(const UInt64 *outSize));
59*f6dc9357SAndroid Build Coastguard Worker  #endif
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker public:
62*f6dc9357SAndroid Build Coastguard Worker   bool FinishStream; // set it before decoding, if you need to decode full LZMA stream
63*f6dc9357SAndroid Build Coastguard Worker private:
64*f6dc9357SAndroid Build Coastguard Worker   bool _propsWereSet;
65*f6dc9357SAndroid Build Coastguard Worker   bool _outSizeDefined;
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   UInt32 _outStep;
68*f6dc9357SAndroid Build Coastguard Worker   UInt32 _inBufSize;
69*f6dc9357SAndroid Build Coastguard Worker   UInt32 _inBufSizeNew;
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   ELzmaStatus _lzmaStatus;
72*f6dc9357SAndroid Build Coastguard Worker   UInt32 _inPos;
73*f6dc9357SAndroid Build Coastguard Worker   UInt32 _inLim;
74*f6dc9357SAndroid Build Coastguard Worker   Byte *_inBuf;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   UInt64 _outSize;
77*f6dc9357SAndroid Build Coastguard Worker   UInt64 _inProcessed;
78*f6dc9357SAndroid Build Coastguard Worker   UInt64 _outProcessed;
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker   // CAlignOffsetAlloc _alloc;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   CLzmaDec _state;
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateInputBuffer();
85*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress);
86*f6dc9357SAndroid Build Coastguard Worker   void SetOutStreamSizeResume(const UInt64 *outSize);
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_READ_FROM_CODER
89*f6dc9357SAndroid Build Coastguard Worker private:
90*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _inStream;
91*f6dc9357SAndroid Build Coastguard Worker public:
92*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
93*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize);
94*f6dc9357SAndroid Build Coastguard Worker  #endif
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker public:
97*f6dc9357SAndroid Build Coastguard Worker   CDecoder();
98*f6dc9357SAndroid Build Coastguard Worker   ~CDecoder();
99*f6dc9357SAndroid Build Coastguard Worker 
GetInputProcessedSize()100*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetInputProcessedSize() const { return _inProcessed; }
GetOutputProcessedSize()101*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetOutputProcessedSize() const { return _outProcessed; }
NeedsMoreInput()102*f6dc9357SAndroid Build Coastguard Worker   bool NeedsMoreInput() const { return _lzmaStatus == LZMA_STATUS_NEEDS_MORE_INPUT; }
CheckFinishStatus(bool withEndMark)103*f6dc9357SAndroid Build Coastguard Worker   bool CheckFinishStatus(bool withEndMark) const
104*f6dc9357SAndroid Build Coastguard Worker   {
105*f6dc9357SAndroid Build Coastguard Worker     return _lzmaStatus == (withEndMark ?
106*f6dc9357SAndroid Build Coastguard Worker         LZMA_STATUS_FINISHED_WITH_MARK :
107*f6dc9357SAndroid Build Coastguard Worker         LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK);
108*f6dc9357SAndroid Build Coastguard Worker   }
109*f6dc9357SAndroid Build Coastguard Worker };
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker }}
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker #endif
114