5 #include "NsisDecode.h"
\r
7 #include "../../Common/StreamUtils.h"
\r
9 #include "../../Common/MethodId.h"
\r
11 #include "../../Compress/BZip2Decoder.h"
\r
12 #include "../../Compress/DeflateDecoder.h"
\r
13 #include "../../Compress/LzmaDecoder.h"
\r
15 namespace NArchive {
\r
18 static const CMethodId k_BCJ_X86 = 0x03030103;
\r
20 HRESULT CDecoder::Init(
\r
21 DECL_EXTERNAL_CODECS_LOC_VARS
\r
22 IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter)
\r
25 CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;
\r
27 if (_decoderInStream)
\r
28 if (method != _method)
\r
31 if (!_codecInStream)
\r
35 // case NMethodType::kCopy: return E_NOTIMPL;
\r
36 case NMethodType::kDeflate: _codecInStream = new NCompress::NDeflate::NDecoder::CNsisCOMCoder(); break;
\r
37 case NMethodType::kBZip2: _codecInStream = new NCompress::NBZip2::CNsisDecoder(); break;
\r
38 case NMethodType::kLZMA: _codecInStream = new NCompress::NLzma::CDecoder(); break;
\r
39 default: return E_NOTIMPL;
\r
43 if (thereIsFilterFlag)
\r
45 UInt32 processedSize;
\r
47 RINOK(inStream->Read(&flag, 1, &processedSize));
\r
48 if (processedSize != 1)
\r
52 useFilter = (flag != 0);
\r
57 if (!_filterInStream)
\r
59 CMyComPtr<ICompressCoder> coder;
\r
61 EXTERNAL_CODECS_LOC_VARS
\r
62 k_BCJ_X86, coder, false));
\r
65 coder.QueryInterface(IID_ISequentialInStream, &_filterInStream);
\r
66 if (!_filterInStream)
\r
69 CMyComPtr<ICompressSetInStream> setInStream;
\r
70 _filterInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
\r
73 RINOK(setInStream->SetInStream(_codecInStream));
\r
74 _decoderInStream = _filterInStream;
\r
77 _decoderInStream = _codecInStream;
\r
79 if (method == NMethodType::kLZMA)
\r
81 CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
\r
82 _codecInStream.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
\r
83 if (setDecoderProperties)
\r
85 static const UInt32 kPropertiesSize = 5;
\r
86 BYTE properties[kPropertiesSize];
\r
87 UInt32 processedSize;
\r
88 RINOK(inStream->Read(properties, kPropertiesSize, &processedSize));
\r
89 if (processedSize != kPropertiesSize)
\r
91 RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, kPropertiesSize));
\r
96 CMyComPtr<ICompressSetInStream> setInStream;
\r
97 _codecInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
\r
100 RINOK(setInStream->SetInStream(inStream));
\r
104 CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
\r
105 _codecInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
\r
106 if (!setOutStreamSize)
\r
108 RINOK(setOutStreamSize->SetOutStreamSize(NULL));
\r
114 CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
\r
115 _filterInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
\r
116 if (!setOutStreamSize)
\r
118 RINOK(setOutStreamSize->SetOutStreamSize(NULL));
\r
125 HRESULT CDecoder::Read(void *data, size_t *processedSize)
\r
127 return ReadStream(_decoderInStream, data, processedSize);;
\r