deflatedecoder.h

来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 135 行

H
135
字号
// DeflateDecoder.h#ifndef __DEFLATE_DECODER_H#define __DEFLATE_DECODER_H#include "../../../Common/MyCom.h"#include "../../ICoder.h"#include "../../Common/LSBFDecoder.h"#include "../../Common/InBuffer.h"#include "../LZ/LZOutWindow.h"#include "../Huffman/HuffmanDecoder.h"#include "DeflateConst.h"namespace NCompress {namespace NDeflate {namespace NDecoder {class CCoder:  public ICompressCoder,  public ICompressGetInStreamProcessedSize,  #ifdef _ST_MODE  public ICompressSetInStream,  public ICompressSetOutStreamSize,  public ISequentialInStream,  #endif  public CMyUnknownImp{  CLZOutWindow m_OutWindowStream;  NStream::NLSBF::CDecoder<CInBuffer> m_InBitStream;  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize> m_MainDecoder;  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedDistTableSize> m_DistDecoder;  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;  UInt32 m_StoredBlockSize;  bool m_FinalBlock;  bool m_StoredMode;  UInt32 _numDistLevels;  bool _deflateNSIS;  bool _deflate64Mode;  bool _keepHistory;  Int32 _remainLen;  UInt32 _rep0;  bool _needReadTable;  UInt32 ReadBits(int numBits);  bool DeCodeLevelTable(Byte *values, int numSymbols);  bool ReadTables();    void ReleaseStreams()  {    m_OutWindowStream.ReleaseStream();    ReleaseInStream();  }  HRESULT Flush() { return m_OutWindowStream.Flush(); }  class CCoderReleaser  {    CCoder *m_Coder;  public:    bool NeedFlush;    CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}    ~CCoderReleaser()    {      if (NeedFlush)        m_Coder->Flush();      m_Coder->ReleaseStreams();    }  };  friend class CCoderReleaser;  HRESULT CodeSpec(UInt32 curSize);public:  CCoder(bool deflate64Mode, bool deflateNSIS = false);  void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }  HRESULT CodeReal(ISequentialInStream *inStream,      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,      ICompressProgressInfo *progress);  #ifdef _ST_MODE  MY_UNKNOWN_IMP4(      ICompressGetInStreamProcessedSize,      ICompressSetInStream,       ICompressSetOutStreamSize,      ISequentialInStream      )  #else  MY_UNKNOWN_IMP1(      ICompressGetInStreamProcessedSize)  #endif  STDMETHOD(Code)(ISequentialInStream *inStream,      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,      ICompressProgressInfo *progress);  STDMETHOD(SetInStream)(ISequentialInStream *inStream);  STDMETHOD(ReleaseInStream)();  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);    #ifdef _ST_MODE  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);  #endif  // IGetInStreamProcessedSize  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);};class CCOMCoder : public CCoder{public:  CCOMCoder(): CCoder(false) {}};class CNsisCOMCoder : public CCoder{public:  CNsisCOMCoder(): CCoder(false, true) {}};class CCOMCoder64 : public CCoder{public:  CCOMCoder64(): CCoder(true) {}};}}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?