~ubuntu-branches/ubuntu/precise/p7zip/precise-updates

« back to all changes in this revision

Viewing changes to CPP/7zip/Compress/DeflateDecoder.h

  • Committer: Bazaar Package Importer
  • Author(s): Mohammed Adnène Trojette
  • Date: 2009-02-14 20:12:27 UTC
  • mfrom: (1.1.11 upstream) (2.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20090214201227-go63qxm9ozfdma60
Tags: 4.65~dfsg.1-1
* New upstream release.
* Remove wx2.8 Build-Depends added by mistakes (7zG is not yet
  intended to be built).
* Use dh_clean without -k.

Show diffs side-by-side

added added

removed removed

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