1*f6dc9357SAndroid Build Coastguard Worker // ZlibDecoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ZLIB_DECODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ZLIB_DECODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "DeflateDecoder.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 9*f6dc9357SAndroid Build Coastguard Worker namespace NZlib { 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker const UInt32 ADLER_INIT_VAL = 1; 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1( 14*f6dc9357SAndroid Build Coastguard Worker COutStreamWithAdler 15*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 16*f6dc9357SAndroid Build Coastguard Worker ) 17*f6dc9357SAndroid Build Coastguard Worker UInt32 _adler; 18*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _stream; 19*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 20*f6dc9357SAndroid Build Coastguard Worker public: SetStream(ISequentialOutStream * stream)21*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } ReleaseStream()22*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } Init()23*f6dc9357SAndroid Build Coastguard Worker void Init() { _adler = ADLER_INIT_VAL; _size = 0; } GetAdler()24*f6dc9357SAndroid Build Coastguard Worker UInt32 GetAdler() const { return _adler; } GetSize()25*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; } 26*f6dc9357SAndroid Build Coastguard Worker }; 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1( 29*f6dc9357SAndroid Build Coastguard Worker CDecoder 30*f6dc9357SAndroid Build Coastguard Worker , ICompressCoder 31*f6dc9357SAndroid Build Coastguard Worker ) 32*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2<ISequentialOutStream, COutStreamWithAdler> AdlerStream; 33*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2<ICompressCoder, NDeflate::NDecoder::CCOMCoder> DeflateDecoder; 34*f6dc9357SAndroid Build Coastguard Worker Int32 _inputProcessedSize_Additional; 35*f6dc9357SAndroid Build Coastguard Worker public: 36*f6dc9357SAndroid Build Coastguard Worker bool IsAdlerOptional; 37*f6dc9357SAndroid Build Coastguard Worker CDecoder()38*f6dc9357SAndroid Build Coastguard Worker CDecoder(): IsAdlerOptional(false) {} GetInputProcessedSize()39*f6dc9357SAndroid Build Coastguard Worker UInt64 GetInputProcessedSize() const 40*f6dc9357SAndroid Build Coastguard Worker { 41*f6dc9357SAndroid Build Coastguard Worker return (UInt64)( 42*f6dc9357SAndroid Build Coastguard Worker (Int64)DeflateDecoder->GetInputProcessedSize() + 43*f6dc9357SAndroid Build Coastguard Worker (Int64)_inputProcessedSize_Additional); 44*f6dc9357SAndroid Build Coastguard Worker } GetOutputProcessedSize()45*f6dc9357SAndroid Build Coastguard Worker UInt64 GetOutputProcessedSize() const { return AdlerStream->GetSize(); } 46*f6dc9357SAndroid Build Coastguard Worker }; 47*f6dc9357SAndroid Build Coastguard Worker IsZlib(const Byte * p)48*f6dc9357SAndroid Build Coastguard Workerstatic bool inline IsZlib(const Byte *p) 49*f6dc9357SAndroid Build Coastguard Worker { 50*f6dc9357SAndroid Build Coastguard Worker if ((p[0] & 0xF) != 8) // method 51*f6dc9357SAndroid Build Coastguard Worker return false; 52*f6dc9357SAndroid Build Coastguard Worker if (((unsigned)p[0] >> 4) > 7) // logar_window_size minus 8. 53*f6dc9357SAndroid Build Coastguard Worker return false; 54*f6dc9357SAndroid Build Coastguard Worker if ((p[1] & 0x20) != 0) // dictPresent 55*f6dc9357SAndroid Build Coastguard Worker return false; 56*f6dc9357SAndroid Build Coastguard Worker if ((((UInt32)p[0] << 8) + p[1]) % 31 != 0) 57*f6dc9357SAndroid Build Coastguard Worker return false; 58*f6dc9357SAndroid Build Coastguard Worker return true; 59*f6dc9357SAndroid Build Coastguard Worker } 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker // IsZlib_3bytes checks 2 bytes of zlib header and starting byte of Deflate stream 62*f6dc9357SAndroid Build Coastguard Worker IsZlib_3bytes(const Byte * p)63*f6dc9357SAndroid Build Coastguard Workerstatic bool inline IsZlib_3bytes(const Byte *p) 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker if (!IsZlib(p)) 66*f6dc9357SAndroid Build Coastguard Worker return false; 67*f6dc9357SAndroid Build Coastguard Worker const unsigned val = p[2]; 68*f6dc9357SAndroid Build Coastguard Worker const unsigned blockType = (val >> 1) & 0x3; 69*f6dc9357SAndroid Build Coastguard Worker if (blockType == 3) // unsupported block type for deflate 70*f6dc9357SAndroid Build Coastguard Worker return false; 71*f6dc9357SAndroid Build Coastguard Worker if (blockType == NCompress::NDeflate::NBlockType::kStored && (val >> 3) != 0) 72*f6dc9357SAndroid Build Coastguard Worker return false; 73*f6dc9357SAndroid Build Coastguard Worker return true; 74*f6dc9357SAndroid Build Coastguard Worker } 75*f6dc9357SAndroid Build Coastguard Worker 76*f6dc9357SAndroid Build Coastguard Worker }} 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker #endif 79