// Bcj2Coder.h #ifndef ZIP7_INC_COMPRESS_BCJ2_CODER_H #define ZIP7_INC_COMPRESS_BCJ2_CODER_H #include "../../../C/Bcj2.h" #include "../../Common/MyCom.h" #include "../ICoder.h" namespace NCompress { namespace NBcj2 { class CBaseCoder { protected: Byte *_bufs[BCJ2_NUM_STREAMS + 1]; UInt32 _bufsSizes[BCJ2_NUM_STREAMS + 1]; UInt32 _bufsSizes_New[BCJ2_NUM_STREAMS + 1]; HRESULT Alloc(bool allocForOrig = true); public: CBaseCoder(); ~CBaseCoder(); }; #ifndef Z7_EXTRACT_ONLY class CEncoder Z7_final: public ICompressCoder2, public ICompressSetCoderProperties, public ICompressSetBufSize, public CMyUnknownImp, public CBaseCoder { Z7_IFACES_IMP_UNK_3( ICompressCoder2, ICompressSetCoderProperties, ICompressSetBufSize) UInt32 _relatLim; // UInt32 _excludeRangeBits; HRESULT CodeReal( ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, ICompressProgressInfo *progress); public: CEncoder(); ~CEncoder(); }; #endif class CBaseDecoder: public CBaseCoder { protected: HRESULT _readRes[BCJ2_NUM_STREAMS]; unsigned _extraSizes[BCJ2_NUM_STREAMS]; UInt64 _readSizes[BCJ2_NUM_STREAMS]; CBcj2Dec dec; UInt64 GetProcessedSize_ForInStream(unsigned i) const { return _readSizes[i] - ((size_t)(dec.lims[i] - dec.bufs[i]) + _extraSizes[i]); } void InitCommon(); void ReadInStream(ISequentialInStream *inStream); }; class CDecoder Z7_final: public ICompressCoder2, public ICompressSetFinishMode, public ICompressGetInStreamProcessedSize2, public ICompressSetBufSize, #ifndef Z7_NO_READ_FROM_CODER public ICompressSetInStream2, public ICompressSetOutStreamSize, public ISequentialInStream, #endif public CMyUnknownImp, public CBaseDecoder { Z7_COM_QI_BEGIN2(ICompressCoder2) Z7_COM_QI_ENTRY(ICompressSetFinishMode) Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize2) Z7_COM_QI_ENTRY(ICompressSetBufSize) #ifndef Z7_NO_READ_FROM_CODER Z7_COM_QI_ENTRY(ICompressSetInStream2) Z7_COM_QI_ENTRY(ICompressSetOutStreamSize) Z7_COM_QI_ENTRY(ISequentialInStream) #endif Z7_COM_QI_END Z7_COM_ADDREF_RELEASE Z7_IFACE_COM7_IMP(ICompressCoder2) Z7_IFACE_COM7_IMP(ICompressSetFinishMode) Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize2) Z7_IFACE_COM7_IMP(ICompressSetBufSize) #ifndef Z7_NO_READ_FROM_CODER Z7_IFACE_COM7_IMP(ICompressSetInStream2) Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize) Z7_IFACE_COM7_IMP(ISequentialInStream) #endif bool _finishMode; #ifndef Z7_NO_READ_FROM_CODER bool _outSizeDefined; UInt64 _outSize; UInt64 _outSize_Processed; CMyComPtr _inStreams[BCJ2_NUM_STREAMS]; #endif public: CDecoder(); }; }} #endif