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