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