annotate src/win32/7zip/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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 }}