| // PpmdDecoder.h |
| // 2009-03-11 : Igor Pavlov : Public domain |
| |
| #ifndef __COMPRESS_PPMD_DECODER_H |
| #define __COMPRESS_PPMD_DECODER_H |
| |
| #include "../../../C/Ppmd7.h" |
| |
| #include "../../Common/MyCom.h" |
| |
| #include "../Common/CWrappers.h" |
| |
| #include "../ICoder.h" |
| |
| namespace NCompress { |
| namespace NPpmd { |
| |
| class CDecoder : |
| public ICompressCoder, |
| public ICompressSetDecoderProperties2, |
| #ifndef NO_READ_FROM_CODER |
| public ICompressSetInStream, |
| public ICompressSetOutStreamSize, |
| public ISequentialInStream, |
| #endif |
| public CMyUnknownImp |
| { |
| Byte *_outBuf; |
| CPpmd7z_RangeDec _rangeDec; |
| CByteInBufWrap _inStream; |
| CPpmd7 _ppmd; |
| |
| Byte _order; |
| bool _outSizeDefined; |
| int _status; |
| UInt64 _outSize; |
| UInt64 _processedSize; |
| |
| HRESULT CodeSpec(Byte *memStream, UInt32 size); |
| |
| public: |
| |
| #ifndef NO_READ_FROM_CODER |
| CMyComPtr<ISequentialInStream> InSeqStream; |
| MY_UNKNOWN_IMP4( |
| ICompressSetDecoderProperties2, |
| ICompressSetInStream, |
| ICompressSetOutStreamSize, |
| ISequentialInStream) |
| #else |
| MY_UNKNOWN_IMP1( |
| ICompressSetDecoderProperties2) |
| #endif |
| |
| STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, |
| const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); |
| STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); |
| STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); |
| |
| #ifndef NO_READ_FROM_CODER |
| STDMETHOD(SetInStream)(ISequentialInStream *inStream); |
| STDMETHOD(ReleaseInStream)(); |
| STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); |
| #endif |
| |
| CDecoder(): _outBuf(NULL), _outSizeDefined(false) |
| { |
| Ppmd7z_RangeDec_CreateVTable(&_rangeDec); |
| _rangeDec.Stream = &_inStream.p; |
| Ppmd7_Construct(&_ppmd); |
| } |
| |
| ~CDecoder(); |
| }; |
| |
| }} |
| |
| #endif |