rlm@1
|
1 // DeflateDecoder.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __DEFLATE_DECODER_H
|
rlm@1
|
4 #define __DEFLATE_DECODER_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../../Common/MyCom.h"
|
rlm@1
|
7
|
rlm@1
|
8 #include "../ICoder.h"
|
rlm@1
|
9
|
rlm@1
|
10 #include "../Common/InBuffer.h"
|
rlm@1
|
11
|
rlm@1
|
12 #include "BitlDecoder.h"
|
rlm@1
|
13 #include "DeflateConst.h"
|
rlm@1
|
14 #include "HuffmanDecoder.h"
|
rlm@1
|
15 #include "LzOutWindow.h"
|
rlm@1
|
16
|
rlm@1
|
17 namespace NCompress {
|
rlm@1
|
18 namespace NDeflate {
|
rlm@1
|
19 namespace NDecoder {
|
rlm@1
|
20
|
rlm@1
|
21 class CCoder:
|
rlm@1
|
22 public ICompressCoder,
|
rlm@1
|
23 public ICompressGetInStreamProcessedSize,
|
rlm@1
|
24 #ifndef NO_READ_FROM_CODER
|
rlm@1
|
25 public ICompressSetInStream,
|
rlm@1
|
26 public ICompressSetOutStreamSize,
|
rlm@1
|
27 public ISequentialInStream,
|
rlm@1
|
28 #endif
|
rlm@1
|
29 public CMyUnknownImp
|
rlm@1
|
30 {
|
rlm@1
|
31 CLzOutWindow m_OutWindowStream;
|
rlm@1
|
32 NBitl::CDecoder<CInBuffer> m_InBitStream;
|
rlm@1
|
33 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize> m_MainDecoder;
|
rlm@1
|
34 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedDistTableSize> m_DistDecoder;
|
rlm@1
|
35 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
|
rlm@1
|
36
|
rlm@1
|
37 UInt32 m_StoredBlockSize;
|
rlm@1
|
38
|
rlm@1
|
39 bool m_FinalBlock;
|
rlm@1
|
40 bool m_StoredMode;
|
rlm@1
|
41 UInt32 _numDistLevels;
|
rlm@1
|
42
|
rlm@1
|
43
|
rlm@1
|
44 bool _deflateNSIS;
|
rlm@1
|
45 bool _deflate64Mode;
|
rlm@1
|
46 bool _keepHistory;
|
rlm@1
|
47 Int32 _remainLen;
|
rlm@1
|
48 UInt32 _rep0;
|
rlm@1
|
49 bool _needReadTable;
|
rlm@1
|
50
|
rlm@1
|
51 UInt32 ReadBits(int numBits);
|
rlm@1
|
52
|
rlm@1
|
53 bool DeCodeLevelTable(Byte *values, int numSymbols);
|
rlm@1
|
54 bool ReadTables();
|
rlm@1
|
55
|
rlm@1
|
56 void ReleaseStreams()
|
rlm@1
|
57 {
|
rlm@1
|
58 m_OutWindowStream.ReleaseStream();
|
rlm@1
|
59 ReleaseInStream();
|
rlm@1
|
60 }
|
rlm@1
|
61
|
rlm@1
|
62 HRESULT Flush() { return m_OutWindowStream.Flush(); }
|
rlm@1
|
63 class CCoderReleaser
|
rlm@1
|
64 {
|
rlm@1
|
65 CCoder *m_Coder;
|
rlm@1
|
66 public:
|
rlm@1
|
67 bool NeedFlush;
|
rlm@1
|
68 CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
|
rlm@1
|
69 ~CCoderReleaser()
|
rlm@1
|
70 {
|
rlm@1
|
71 if (NeedFlush)
|
rlm@1
|
72 m_Coder->Flush();
|
rlm@1
|
73 m_Coder->ReleaseStreams();
|
rlm@1
|
74 }
|
rlm@1
|
75 };
|
rlm@1
|
76 friend class CCoderReleaser;
|
rlm@1
|
77
|
rlm@1
|
78 HRESULT CodeSpec(UInt32 curSize);
|
rlm@1
|
79 public:
|
rlm@1
|
80 bool ZlibMode;
|
rlm@1
|
81 Byte ZlibFooter[4];
|
rlm@1
|
82
|
rlm@1
|
83 CCoder(bool deflate64Mode, bool deflateNSIS = false);
|
rlm@1
|
84 void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
|
rlm@1
|
85
|
rlm@1
|
86 HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
|
rlm@1
|
87 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
|
rlm@1
|
88
|
rlm@1
|
89 #ifndef NO_READ_FROM_CODER
|
rlm@1
|
90 MY_UNKNOWN_IMP4(
|
rlm@1
|
91 ICompressGetInStreamProcessedSize,
|
rlm@1
|
92 ICompressSetInStream,
|
rlm@1
|
93 ICompressSetOutStreamSize,
|
rlm@1
|
94 ISequentialInStream
|
rlm@1
|
95 )
|
rlm@1
|
96 #else
|
rlm@1
|
97 MY_UNKNOWN_IMP1(
|
rlm@1
|
98 ICompressGetInStreamProcessedSize)
|
rlm@1
|
99 #endif
|
rlm@1
|
100
|
rlm@1
|
101 STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
|
rlm@1
|
102 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
|
rlm@1
|
103
|
rlm@1
|
104 STDMETHOD(SetInStream)(ISequentialInStream *inStream);
|
rlm@1
|
105 STDMETHOD(ReleaseInStream)();
|
rlm@1
|
106 STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
|
rlm@1
|
107
|
rlm@1
|
108 #ifndef NO_READ_FROM_CODER
|
rlm@1
|
109 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
|
rlm@1
|
110 #endif
|
rlm@1
|
111
|
rlm@1
|
112 // IGetInStreamProcessedSize
|
rlm@1
|
113 STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
|
rlm@1
|
114 };
|
rlm@1
|
115
|
rlm@1
|
116 class CCOMCoder : public CCoder
|
rlm@1
|
117 {
|
rlm@1
|
118 public:
|
rlm@1
|
119 CCOMCoder(): CCoder(false) {}
|
rlm@1
|
120 };
|
rlm@1
|
121
|
rlm@1
|
122 class CNsisCOMCoder : public CCoder
|
rlm@1
|
123 {
|
rlm@1
|
124 public:
|
rlm@1
|
125 CNsisCOMCoder(): CCoder(false, true) {}
|
rlm@1
|
126 };
|
rlm@1
|
127
|
rlm@1
|
128 class CCOMCoder64 : public CCoder
|
rlm@1
|
129 {
|
rlm@1
|
130 public:
|
rlm@1
|
131 CCOMCoder64(): CCoder(true) {}
|
rlm@1
|
132 };
|
rlm@1
|
133
|
rlm@1
|
134 }}}
|
rlm@1
|
135
|
rlm@1
|
136 #endif
|