xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/DeflateDecoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // DeflateDecoder.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_DEFLATE_DECODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_DEFLATE_DECODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../Common/InBuffer.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "BitlDecoder.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "DeflateConst.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "LzOutWindow.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
18*f6dc9357SAndroid Build Coastguard Worker namespace NDeflate {
19*f6dc9357SAndroid Build Coastguard Worker namespace NDecoder {
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker const int kLenIdFinished = -1;
22*f6dc9357SAndroid Build Coastguard Worker const int kLenIdNeedInit = -2;
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Main = 10;
25*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Dist = 6;
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker class CCoder:
28*f6dc9357SAndroid Build Coastguard Worker   public ICompressCoder,
29*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetFinishMode,
30*f6dc9357SAndroid Build Coastguard Worker   public ICompressGetInStreamProcessedSize,
31*f6dc9357SAndroid Build Coastguard Worker   public ICompressReadUnusedFromInBuf,
32*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetInStream,
33*f6dc9357SAndroid Build Coastguard Worker   public ICompressSetOutStreamSize,
34*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER
35*f6dc9357SAndroid Build Coastguard Worker   public ISequentialInStream,
36*f6dc9357SAndroid Build Coastguard Worker #endif
37*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN2(ICompressCoder)
40*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetFinishMode)
41*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize)
42*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressReadUnusedFromInBuf)
43*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetInStream)
44*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressSetOutStreamSize)
45*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER
46*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ISequentialInStream)
47*f6dc9357SAndroid Build Coastguard Worker #endif
48*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END
49*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressCoder)
52*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetFinishMode)
53*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize)
54*f6dc9357SAndroid Build Coastguard Worker public:
55*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressReadUnusedFromInBuf)
56*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetInStream)
57*f6dc9357SAndroid Build Coastguard Worker private:
58*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize)
59*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER
60*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ISequentialInStream)
61*f6dc9357SAndroid Build Coastguard Worker #endif
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   CLzOutWindow m_OutWindowStream;
64*f6dc9357SAndroid Build Coastguard Worker   NBitl::CDecoder<CInBuffer> m_InBitStream;
65*f6dc9357SAndroid Build Coastguard Worker   NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize, kNumTableBits_Main> m_MainDecoder;
66*f6dc9357SAndroid Build Coastguard Worker   NCompress::NHuffman::CDecoder256<kNumHuffmanBits, kFixedDistTableSize, kNumTableBits_Dist> m_DistDecoder;
67*f6dc9357SAndroid Build Coastguard Worker   NCompress::NHuffman::CDecoder7b<kLevelTableSize> m_LevelDecoder;
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker   UInt32 m_StoredBlockSize;
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   unsigned _numDistLevels;
72*f6dc9357SAndroid Build Coastguard Worker   bool m_FinalBlock;
73*f6dc9357SAndroid Build Coastguard Worker   bool m_StoredMode;
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker   bool _deflateNSIS;
76*f6dc9357SAndroid Build Coastguard Worker   bool _deflate64Mode;
77*f6dc9357SAndroid Build Coastguard Worker   bool _keepHistory;
78*f6dc9357SAndroid Build Coastguard Worker   bool _needFinishInput;
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker   bool _needInitInStream;
81*f6dc9357SAndroid Build Coastguard Worker   bool _needReadTable;
82*f6dc9357SAndroid Build Coastguard Worker   Int32 _remainLen;
83*f6dc9357SAndroid Build Coastguard Worker   UInt32 _rep0;
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker   bool _outSizeDefined;
86*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> m_InStreamRef;
87*f6dc9357SAndroid Build Coastguard Worker   UInt64 _outSize;
88*f6dc9357SAndroid Build Coastguard Worker   UInt64 _outStartPos;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker   void SetOutStreamSizeResume(const UInt64 *outSize);
GetOutProcessedCur()91*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetOutProcessedCur() const { return m_OutWindowStream.GetProcessedSize() - _outStartPos; }
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadBits(unsigned numBits);
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   bool DecodeLevels(Byte *levels, unsigned numSymbols);
96*f6dc9357SAndroid Build Coastguard Worker   bool ReadTables();
97*f6dc9357SAndroid Build Coastguard Worker 
Flush()98*f6dc9357SAndroid Build Coastguard Worker   HRESULT Flush() { return m_OutWindowStream.Flush(); }
99*f6dc9357SAndroid Build Coastguard Worker   class CCoderReleaser
100*f6dc9357SAndroid Build Coastguard Worker   {
101*f6dc9357SAndroid Build Coastguard Worker     CCoder *_coder;
102*f6dc9357SAndroid Build Coastguard Worker   public:
103*f6dc9357SAndroid Build Coastguard Worker     bool NeedFlush;
CCoderReleaser(CCoder * coder)104*f6dc9357SAndroid Build Coastguard Worker     CCoderReleaser(CCoder *coder): _coder(coder), NeedFlush(true) {}
~CCoderReleaser()105*f6dc9357SAndroid Build Coastguard Worker     ~CCoderReleaser()
106*f6dc9357SAndroid Build Coastguard Worker     {
107*f6dc9357SAndroid Build Coastguard Worker       if (NeedFlush)
108*f6dc9357SAndroid Build Coastguard Worker         _coder->Flush();
109*f6dc9357SAndroid Build Coastguard Worker     }
110*f6dc9357SAndroid Build Coastguard Worker   };
111*f6dc9357SAndroid Build Coastguard Worker   friend class CCoderReleaser;
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeSpec(UInt32 curSize, bool finishInputStream, UInt32 inputProgressLimit = 0);
114*f6dc9357SAndroid Build Coastguard Worker public:
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker   CCoder(bool deflate64Mode);
~CCoder()117*f6dc9357SAndroid Build Coastguard Worker   virtual ~CCoder() {}
118*f6dc9357SAndroid Build Coastguard Worker 
SetNsisMode(bool nsisMode)119*f6dc9357SAndroid Build Coastguard Worker   void SetNsisMode(bool nsisMode) { _deflateNSIS = nsisMode; }
120*f6dc9357SAndroid Build Coastguard Worker 
Set_KeepHistory(bool keepHistory)121*f6dc9357SAndroid Build Coastguard Worker   void Set_KeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
Set_NeedFinishInput(bool needFinishInput)122*f6dc9357SAndroid Build Coastguard Worker   void Set_NeedFinishInput(bool needFinishInput) { _needFinishInput = needFinishInput; }
123*f6dc9357SAndroid Build Coastguard Worker 
IsFinished()124*f6dc9357SAndroid Build Coastguard Worker   bool IsFinished() const { return _remainLen == kLenIdFinished; }
IsFinalBlock()125*f6dc9357SAndroid Build Coastguard Worker   bool IsFinalBlock() const { return m_FinalBlock; }
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeReal(ISequentialOutStream *outStream, ICompressProgressInfo *progress);
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker public:
130*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
131*f6dc9357SAndroid Build Coastguard Worker   HRESULT InitInStream(bool needInit);
132*f6dc9357SAndroid Build Coastguard Worker 
AlignToByte()133*f6dc9357SAndroid Build Coastguard Worker   void AlignToByte() { m_InBitStream.AlignToByte(); }
134*f6dc9357SAndroid Build Coastguard Worker   Byte ReadAlignedByte();
ReadAligned_UInt16()135*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadAligned_UInt16() // aligned for Byte range
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     const UInt32 v = m_InBitStream.ReadAlignedByte();
138*f6dc9357SAndroid Build Coastguard Worker     return v | ((UInt32)m_InBitStream.ReadAlignedByte() << 8);
139*f6dc9357SAndroid Build Coastguard Worker   }
InputEofError()140*f6dc9357SAndroid Build Coastguard Worker   bool InputEofError() const { return m_InBitStream.ExtraBitsWereRead(); }
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   // size of used real data from input stream
GetStreamSize()143*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetStreamSize() const { return m_InBitStream.GetStreamSize(); }
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker   // size of virtual input stream processed
GetInputProcessedSize()146*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetInputProcessedSize() const { return m_InBitStream.GetProcessedSize(); }
147*f6dc9357SAndroid Build Coastguard Worker };
148*f6dc9357SAndroid Build Coastguard Worker 
CCOMCoder()149*f6dc9357SAndroid Build Coastguard Worker class CCOMCoder     : public CCoder { public: CCOMCoder(): CCoder(false) {} };
CCOMCoder64()150*f6dc9357SAndroid Build Coastguard Worker class CCOMCoder64   : public CCoder { public: CCOMCoder64(): CCoder(true) {} };
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker }}}
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker #endif
155