annotate src/win32/7zip/7z/CPP/7zip/Compress/DeflateDecoder.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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