// Rar1Decoder.h // According to unRAR license, this code may not be used to develop // a program that creates RAR archives #ifndef __COMPRESS_RAR1_DECODER_H #define __COMPRESS_RAR1_DECODER_H #include "../../Common/MyCom.h" #include "../ICoder.h" #include "../Common/InBuffer.h" #include "BitmDecoder.h" #include "HuffmanDecoder.h" #include "LzOutWindow.h" namespace NCompress { namespace NRar1 { const UInt32 kNumRepDists = 4; typedef NBitm::CDecoder CBitDecoder; class CDecoder : public ICompressCoder, public ICompressSetDecoderProperties2, public CMyUnknownImp { public: CLzOutWindow m_OutWindowStream; CBitDecoder m_InBitStream; UInt32 m_RepDists[kNumRepDists]; UInt32 m_RepDistPtr; UInt32 LastDist; UInt32 LastLength; Int64 m_UnpackSize; bool m_IsSolid; UInt32 ReadBits(int numBits); HRESULT CopyBlock(UInt32 distance, UInt32 len); UInt32 DecodeNum(const UInt32 *posTab); HRESULT ShortLZ(); HRESULT LongLZ(); HRESULT HuffDecode(); void GetFlagsBuf(); void InitData(); void InitHuff(); void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace); void OldUnpWriteBuf(); UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256]; UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256]; UInt32 NToPl[256],NToPlB[256],NToPlC[256]; UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3; int Buf60,NumHuf,StMode,LCount,FlagsCnt; UInt32 Nhfb,Nlzb,MaxDist3; void InitStructures(); HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); public: CDecoder(); MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2) void ReleaseStreams() { m_OutWindowStream.ReleaseStream(); m_InBitStream.ReleaseStream(); } STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); }; }} #endif