LzmaDecoder.h revision baa3858d3f5d128a5c8466b700098109edcad5f2
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// LzmaDecoder.h
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant#ifndef __LZMA_DECODER_H
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define __LZMA_DECODER_H
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant#include "../../../C/LzmaDec.h"
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../Common/MyCom.h"
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../ICoder.h"
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace NCompress {
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace NLzma {
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass CDecoder:
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public ICompressCoder,
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public ICompressSetDecoderProperties2,
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public ICompressSetBufSize,
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  #ifndef NO_READ_FROM_CODER
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public ICompressSetInStream,
2083e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow  public ICompressSetOutStreamSize,
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public ISequentialInStream,
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  #endif
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  public CMyUnknownImp
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  CMyComPtr<ISequentialInStream> _inStream;
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  Byte *_inBuf;
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt32 _inPos;
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt32 _inSize;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  CLzmaDec _state;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool _propsWereSet;
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool _outSizeDefined;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt64 _outSize;
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt64 _inSizeProcessed;
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt64 _outSizeProcessed;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt32 _inBufSizeAllocated;
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt32 _inBufSize;
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  UInt32 _outBufSize;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  SizeT _wrPos;
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  HRESULT CreateInputBuffer();
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress);
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void SetOutStreamSizeResume(const UInt64 *outSize);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  MY_QUERYINTERFACE_ENTRY(ICompressSetDecoderProperties2)
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize)
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  #ifndef NO_READ_FROM_CODER
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
52  MY_QUERYINTERFACE_ENTRY(ISequentialInStream)
53  #endif
54  MY_QUERYINTERFACE_END
55  MY_ADDREF_RELEASE
56
57  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
58      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
59  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
60  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
61  STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
62  STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
63
64  #ifndef NO_READ_FROM_CODER
65
66  STDMETHOD(SetInStream)(ISequentialInStream *inStream);
67  STDMETHOD(ReleaseInStream)();
68  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
69
70  HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
71  HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize);
72  UInt64 GetInputProcessedSize() const { return _inSizeProcessed; }
73
74  #endif
75
76  bool FinishStream;
77
78  CDecoder();
79  virtual ~CDecoder();
80};
81
82}}
83
84#endif
85