1*f6dc9357SAndroid Build Coastguard Worker // Rar5Decoder.h 2*f6dc9357SAndroid Build Coastguard Worker // According to unRAR license, this code may not be used to develop 3*f6dc9357SAndroid Build Coastguard Worker // a program that creates RAR archives 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_RAR5_DECODER_H 6*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_RAR5_DECODER_H 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer2.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h" 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 16*f6dc9357SAndroid Build Coastguard Worker namespace NRar5 { 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker class CBitDecoder; 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker struct CFilter 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker Byte Type; 23*f6dc9357SAndroid Build Coastguard Worker Byte Channels; 24*f6dc9357SAndroid Build Coastguard Worker UInt32 Size; 25*f6dc9357SAndroid Build Coastguard Worker UInt64 Start; 26*f6dc9357SAndroid Build Coastguard Worker }; 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumReps = 4; 30*f6dc9357SAndroid Build Coastguard Worker const unsigned kLenTableSize = 11 * 4; 31*f6dc9357SAndroid Build Coastguard Worker const unsigned kMainTableSize = 256 + 1 + 1 + kNumReps + kLenTableSize; 32*f6dc9357SAndroid Build Coastguard Worker const unsigned kExtraDistSymbols_v7 = 16; 33*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize_v6 = 64; 34*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize_MAX = 64 + kExtraDistSymbols_v7; 35*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumAlignBits = 4; 36*f6dc9357SAndroid Build Coastguard Worker const unsigned kAlignTableSize = 1 << kNumAlignBits; 37*f6dc9357SAndroid Build Coastguard Worker 38*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumHufBits = 15; 39*f6dc9357SAndroid Build Coastguard Worker 40*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Main = 10; 41*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Dist = 7; 42*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Len = 7; 43*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Align = 6; 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker const unsigned DICT_SIZE_BITS_MAX = 40; 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_2( 48*f6dc9357SAndroid Build Coastguard Worker CDecoder 49*f6dc9357SAndroid Build Coastguard Worker , ICompressCoder 50*f6dc9357SAndroid Build Coastguard Worker , ICompressSetDecoderProperties2 51*f6dc9357SAndroid Build Coastguard Worker ) 52*f6dc9357SAndroid Build Coastguard Worker bool _useAlignBits; 53*f6dc9357SAndroid Build Coastguard Worker bool _isLastBlock; 54*f6dc9357SAndroid Build Coastguard Worker bool _unpackSize_Defined; 55*f6dc9357SAndroid Build Coastguard Worker // bool _packSize_Defined; 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker bool _unsupportedFilter; 58*f6dc9357SAndroid Build Coastguard Worker Byte _lzError; 59*f6dc9357SAndroid Build Coastguard Worker bool _writeError; 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker bool _isSolid; 62*f6dc9357SAndroid Build Coastguard Worker // bool _solidAllowed; 63*f6dc9357SAndroid Build Coastguard Worker bool _is_v7; 64*f6dc9357SAndroid Build Coastguard Worker bool _tableWasFilled; 65*f6dc9357SAndroid Build Coastguard Worker bool _wasInit; 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker Byte _exitType; 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker // Byte _dictSizeLog; 70*f6dc9357SAndroid Build Coastguard Worker size_t _dictSize; 71*f6dc9357SAndroid Build Coastguard Worker Byte *_window; 72*f6dc9357SAndroid Build Coastguard Worker size_t _winPos; 73*f6dc9357SAndroid Build Coastguard Worker size_t _winSize; 74*f6dc9357SAndroid Build Coastguard Worker size_t _dictSize_forCheck; 75*f6dc9357SAndroid Build Coastguard Worker size_t _limit; 76*f6dc9357SAndroid Build Coastguard Worker const Byte *_buf_Res; 77*f6dc9357SAndroid Build Coastguard Worker UInt64 _lzSize; 78*f6dc9357SAndroid Build Coastguard Worker size_t _reps[kNumReps]; 79*f6dc9357SAndroid Build Coastguard Worker unsigned _bitPos_Res; 80*f6dc9357SAndroid Build Coastguard Worker UInt32 _lastLen; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker // unsigned _numCorrectDistSymbols; 83*f6dc9357SAndroid Build Coastguard Worker unsigned _numUnusedFilters; 84*f6dc9357SAndroid Build Coastguard Worker unsigned _numFilters; 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker UInt64 _lzWritten; 87*f6dc9357SAndroid Build Coastguard Worker UInt64 _lzFileStart; 88*f6dc9357SAndroid Build Coastguard Worker UInt64 _unpackSize; 89*f6dc9357SAndroid Build Coastguard Worker // UInt64 _packSize; 90*f6dc9357SAndroid Build Coastguard Worker UInt64 _lzEnd; 91*f6dc9357SAndroid Build Coastguard Worker UInt64 _writtenFileSize; 92*f6dc9357SAndroid Build Coastguard Worker UInt64 _filterEnd; 93*f6dc9357SAndroid Build Coastguard Worker UInt64 _progress_Pack; 94*f6dc9357SAndroid Build Coastguard Worker UInt64 _progress_Unpack; 95*f6dc9357SAndroid Build Coastguard Worker CAlignedBuffer _filterSrc; 96*f6dc9357SAndroid Build Coastguard Worker CAlignedBuffer _filterDst; 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker CFilter *_filters; 99*f6dc9357SAndroid Build Coastguard Worker size_t _winSize_Allocated; 100*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *_inStream; 101*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream *_outStream; 102*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *_progress; 103*f6dc9357SAndroid Build Coastguard Worker Byte *_inputBuf; 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder<kNumHufBits, kMainTableSize, k_NumHufTableBits_Main> m_MainDecoder; 106*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder256<kNumHufBits, kDistTableSize_MAX, k_NumHufTableBits_Dist> m_DistDecoder; 107*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder256<kNumHufBits, kAlignTableSize, k_NumHufTableBits_Align> m_AlignDecoder; 108*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder256<kNumHufBits, kLenTableSize, k_NumHufTableBits_Len> m_LenDecoder; 109*f6dc9357SAndroid Build Coastguard Worker Byte m_LenPlusTable[DICT_SIZE_BITS_MAX]; 110*f6dc9357SAndroid Build Coastguard Worker InitFilters()111*f6dc9357SAndroid Build Coastguard Worker void InitFilters() 112*f6dc9357SAndroid Build Coastguard Worker { 113*f6dc9357SAndroid Build Coastguard Worker _numUnusedFilters = 0; 114*f6dc9357SAndroid Build Coastguard Worker _numFilters = 0; 115*f6dc9357SAndroid Build Coastguard Worker } 116*f6dc9357SAndroid Build Coastguard Worker void DeleteUnusedFilters(); 117*f6dc9357SAndroid Build Coastguard Worker HRESULT WriteData(const Byte *data, size_t size); 118*f6dc9357SAndroid Build Coastguard Worker HRESULT ExecuteFilter(const CFilter &f); 119*f6dc9357SAndroid Build Coastguard Worker HRESULT WriteBuf(); 120*f6dc9357SAndroid Build Coastguard Worker HRESULT AddFilter(CBitDecoder &_bitStream); 121*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadTables(CBitDecoder &_bitStream); 122*f6dc9357SAndroid Build Coastguard Worker HRESULT DecodeLZ2(const CBitDecoder &_bitStream) throw(); 123*f6dc9357SAndroid Build Coastguard Worker HRESULT DecodeLZ(); 124*f6dc9357SAndroid Build Coastguard Worker HRESULT CodeReal(); 125*f6dc9357SAndroid Build Coastguard Worker public: 126*f6dc9357SAndroid Build Coastguard Worker CDecoder(); 127*f6dc9357SAndroid Build Coastguard Worker ~CDecoder(); 128*f6dc9357SAndroid Build Coastguard Worker }; 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker }} 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker #endif 133