rlm@1
|
1 // LzmaFiltersDecode.cpp
|
rlm@1
|
2
|
rlm@1
|
3 #include "StdAfx.h"
|
rlm@1
|
4
|
rlm@1
|
5 #include "LzmaFiltersDecode.h"
|
rlm@1
|
6
|
rlm@1
|
7 namespace NArchive {
|
rlm@1
|
8 namespace NLzma {
|
rlm@1
|
9
|
rlm@1
|
10 static const UInt64 k_LZMA = 0x030101;
|
rlm@1
|
11 static const UInt64 k_BCJ = 0x03030103;
|
rlm@1
|
12
|
rlm@1
|
13 HRESULT CDecoder::Code(
|
rlm@1
|
14 DECL_EXTERNAL_CODECS_LOC_VARS
|
rlm@1
|
15 const CHeader &block,
|
rlm@1
|
16 ISequentialInStream *inStream, ISequentialOutStream *outStream,
|
rlm@1
|
17 UInt64 *inProcessedSize, ICompressProgressInfo *progress)
|
rlm@1
|
18 {
|
rlm@1
|
19 *inProcessedSize = (UInt64)(Int64)-1;
|
rlm@1
|
20
|
rlm@1
|
21 if (block.FilterMethod > 1)
|
rlm@1
|
22 return E_NOTIMPL;
|
rlm@1
|
23
|
rlm@1
|
24 if (!_lzmaDecoder)
|
rlm@1
|
25 {
|
rlm@1
|
26 RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_LZMA, _lzmaDecoder, false));
|
rlm@1
|
27 if (_lzmaDecoder == 0)
|
rlm@1
|
28 return E_NOTIMPL;
|
rlm@1
|
29 }
|
rlm@1
|
30
|
rlm@1
|
31 {
|
rlm@1
|
32 CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
|
rlm@1
|
33 _lzmaDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
|
rlm@1
|
34 if (!setDecoderProperties)
|
rlm@1
|
35 return E_NOTIMPL;
|
rlm@1
|
36 RINOK(setDecoderProperties->SetDecoderProperties2(block.LzmaProps, 5));
|
rlm@1
|
37 }
|
rlm@1
|
38
|
rlm@1
|
39 bool filteredMode = (block.FilterMethod == 1);
|
rlm@1
|
40
|
rlm@1
|
41 CMyComPtr<ICompressSetOutStream> setOutStream;
|
rlm@1
|
42
|
rlm@1
|
43 if (filteredMode)
|
rlm@1
|
44 {
|
rlm@1
|
45 if (!_bcjStream)
|
rlm@1
|
46 {
|
rlm@1
|
47 CMyComPtr<ICompressCoder> coder;
|
rlm@1
|
48 RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_BCJ, coder, false));
|
rlm@1
|
49 if (!coder)
|
rlm@1
|
50 return E_NOTIMPL;
|
rlm@1
|
51 coder.QueryInterface(IID_ISequentialOutStream, &_bcjStream);
|
rlm@1
|
52 if (!_bcjStream)
|
rlm@1
|
53 return E_NOTIMPL;
|
rlm@1
|
54 }
|
rlm@1
|
55
|
rlm@1
|
56 _bcjStream.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
|
rlm@1
|
57 if (!setOutStream)
|
rlm@1
|
58 return E_NOTIMPL;
|
rlm@1
|
59 RINOK(setOutStream->SetOutStream(outStream));
|
rlm@1
|
60 outStream = _bcjStream;
|
rlm@1
|
61 }
|
rlm@1
|
62
|
rlm@1
|
63 const UInt64 *unpackSize = block.HasUnpackSize() ? &block.UnpackSize : NULL;
|
rlm@1
|
64 RINOK(_lzmaDecoder->Code(inStream, outStream, NULL, unpackSize, progress));
|
rlm@1
|
65
|
rlm@1
|
66 if (filteredMode)
|
rlm@1
|
67 {
|
rlm@1
|
68 CMyComPtr<IOutStreamFlush> flush;
|
rlm@1
|
69 _bcjStream.QueryInterface(IID_IOutStreamFlush, &flush);
|
rlm@1
|
70 if (flush)
|
rlm@1
|
71 {
|
rlm@1
|
72 RINOK(flush->Flush());
|
rlm@1
|
73 }
|
rlm@1
|
74 RINOK(setOutStream->ReleaseOutStream());
|
rlm@1
|
75 }
|
rlm@1
|
76
|
rlm@1
|
77 CMyComPtr<ICompressGetInStreamProcessedSize> getInStreamProcessedSize;
|
rlm@1
|
78 _lzmaDecoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, &getInStreamProcessedSize);
|
rlm@1
|
79 if (getInStreamProcessedSize)
|
rlm@1
|
80 {
|
rlm@1
|
81 RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(inProcessedSize));
|
rlm@1
|
82 }
|
rlm@1
|
83 return S_OK;
|
rlm@1
|
84 }
|
rlm@1
|
85
|
rlm@1
|
86 }}
|