1*f6dc9357SAndroid Build Coastguard Worker // NsisDecode.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_NSIS_DECODE_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_NSIS_DECODE_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/FilterCoder.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamUtils.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/BZip2Decoder.h" 12*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/DeflateDecoder.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/LzmaDecoder.h" 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 16*f6dc9357SAndroid Build Coastguard Worker namespace NNsis { 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker namespace NMethodType 19*f6dc9357SAndroid Build Coastguard Worker { 20*f6dc9357SAndroid Build Coastguard Worker enum EEnum 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker kCopy, 23*f6dc9357SAndroid Build Coastguard Worker kDeflate, 24*f6dc9357SAndroid Build Coastguard Worker kBZip2, 25*f6dc9357SAndroid Build Coastguard Worker kLZMA 26*f6dc9357SAndroid Build Coastguard Worker }; 27*f6dc9357SAndroid Build Coastguard Worker } 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker /* 7-Zip installers 4.38 - 9.08 used modified version of NSIS that 30*f6dc9357SAndroid Build Coastguard Worker supported BCJ filter for better compression ratio. 31*f6dc9357SAndroid Build Coastguard Worker We support such modified NSIS archives. */ 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker class CDecoder 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker NMethodType::EEnum _curMethod; // method of created decoder 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker CFilterCoder *_filter; 38*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> _filterInStream; 39*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> _codecInStream; 40*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> _decoderInStream; 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker NCompress::NBZip2::CNsisDecoder *_bzDecoder; 43*f6dc9357SAndroid Build Coastguard Worker NCompress::NDeflate::NDecoder::CCOMCoder *_deflateDecoder; 44*f6dc9357SAndroid Build Coastguard Worker NCompress::NLzma::CDecoder *_lzmaDecoder; 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker public: 47*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> InputStream; // for non-solid 48*f6dc9357SAndroid Build Coastguard Worker UInt64 StreamPos; // the pos in unpacked for solid, the pos in Packed for non-solid 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker NMethodType::EEnum Method; 51*f6dc9357SAndroid Build Coastguard Worker bool FilterFlag; 52*f6dc9357SAndroid Build Coastguard Worker bool Solid; 53*f6dc9357SAndroid Build Coastguard Worker bool IsNsisDeflate; 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Buffer; // temp buf 56*f6dc9357SAndroid Build Coastguard Worker CDecoder()57*f6dc9357SAndroid Build Coastguard Worker CDecoder(): 58*f6dc9357SAndroid Build Coastguard Worker FilterFlag(false), 59*f6dc9357SAndroid Build Coastguard Worker Solid(true), 60*f6dc9357SAndroid Build Coastguard Worker IsNsisDeflate(true) 61*f6dc9357SAndroid Build Coastguard Worker { 62*f6dc9357SAndroid Build Coastguard Worker _bzDecoder = NULL; 63*f6dc9357SAndroid Build Coastguard Worker _deflateDecoder = NULL; 64*f6dc9357SAndroid Build Coastguard Worker _lzmaDecoder = NULL; 65*f6dc9357SAndroid Build Coastguard Worker } 66*f6dc9357SAndroid Build Coastguard Worker Release()67*f6dc9357SAndroid Build Coastguard Worker void Release() 68*f6dc9357SAndroid Build Coastguard Worker { 69*f6dc9357SAndroid Build Coastguard Worker _filterInStream.Release(); 70*f6dc9357SAndroid Build Coastguard Worker _codecInStream.Release(); 71*f6dc9357SAndroid Build Coastguard Worker _decoderInStream.Release(); 72*f6dc9357SAndroid Build Coastguard Worker InputStream.Release(); 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker _bzDecoder = NULL; 75*f6dc9357SAndroid Build Coastguard Worker _deflateDecoder = NULL; 76*f6dc9357SAndroid Build Coastguard Worker _lzmaDecoder = NULL; 77*f6dc9357SAndroid Build Coastguard Worker } 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker UInt64 GetInputProcessedSize() const; 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker HRESULT Init(ISequentialInStream *inStream, bool &useFilter); 82*f6dc9357SAndroid Build Coastguard Worker Read(void * data,size_t * processedSize)83*f6dc9357SAndroid Build Coastguard Worker HRESULT Read(void *data, size_t *processedSize) 84*f6dc9357SAndroid Build Coastguard Worker { 85*f6dc9357SAndroid Build Coastguard Worker return ReadStream(_decoderInStream, data, processedSize); 86*f6dc9357SAndroid Build Coastguard Worker } 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker 89*f6dc9357SAndroid Build Coastguard Worker HRESULT SetToPos(UInt64 pos, ICompressProgressInfo *progress); // for solid 90*f6dc9357SAndroid Build Coastguard Worker HRESULT Decode(CByteBuffer *outBuf, bool unpackSizeDefined, UInt32 unpackSize, 91*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream *realOutStream, ICompressProgressInfo *progress, 92*f6dc9357SAndroid Build Coastguard Worker UInt32 &packSizeRes, UInt32 &unpackSizeRes); 93*f6dc9357SAndroid Build Coastguard Worker }; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker }} 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker #endif 98