Source code
Revision control
Copy as Markdown
Other Tools
// XzDecoder.cpp↩
↩
#include "StdAfx.h"↩
↩
#include "../../../C/Alloc.h"↩
↩
#include "../Common/CWrappers.h"↩
↩
#include "XzDecoder.h"↩
↩
namespace NCompress {↩
namespace NXz {↩
↩
#define RET_IF_WRAP_ERROR_CONFIRMED(wrapRes, sRes, sResErrorCode) \↩
if (wrapRes != S_OK && sRes == sResErrorCode) return wrapRes;↩
↩
#define RET_IF_WRAP_ERROR(wrapRes, sRes, sResErrorCode) \↩
if (wrapRes != S_OK /* && (sRes == SZ_OK || sRes == sResErrorCode) */) return wrapRes;↩
↩
static HRESULT SResToHRESULT_Code(SRes res) throw()↩
{↩
if (res < 0)↩
return res;↩
switch (res)↩
{↩
case SZ_OK: return S_OK;↩
case SZ_ERROR_MEM: return E_OUTOFMEMORY;↩
case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;↩
}↩
return S_FALSE;↩
}↩
↩
↩
HRESULT CDecoder::Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream,↩
const UInt64 *outSizeLimit, bool finishStream, ICompressProgressInfo *progress)↩
{↩
MainDecodeSRes = S_OK;↩
MainDecodeSRes_wasUsed = false;↩
XzStatInfo_Clear(&Stat);↩
↩
if (!xz)↩
{↩
xz = XzDecMt_Create(&g_Alloc, &g_MidAlloc);↩
if (!xz)↩
return E_OUTOFMEMORY;↩
}↩
↩
CXzDecMtProps props;↩
XzDecMtProps_Init(&props);↩
↩
int isMT = False;↩
↩
#ifndef _7ZIP_ST↩
{↩
props.numThreads = 1;↩
UInt32 numThreads = _numThreads;↩
↩
if (_tryMt && numThreads > 1)↩
{↩
size_t memUsage = (size_t)_memUsage;↩
if (memUsage != _memUsage)↩
memUsage = (size_t)0 - 1;↩
props.memUseMax = memUsage;↩
isMT = (numThreads > 1);↩
}↩
↩
props.numThreads = numThreads;↩
}↩
#endif↩
↩
CSeqInStreamWrap inWrap;↩
CSeqOutStreamWrap outWrap;↩
CCompressProgressWrap progressWrap;↩
↩
inWrap.Init(seqInStream);↩
outWrap.Init(outStream);↩
progressWrap.Init(progress);↩
↩
SRes res = XzDecMt_Decode(xz,↩
&props,↩
outSizeLimit, finishStream,↩
&outWrap.vt,↩
&inWrap.vt,↩
&Stat,↩
&isMT,↩
progress ? &progressWrap.vt : NULL);↩
↩
MainDecodeSRes = res;↩
↩
#ifndef _7ZIP_ST↩
// _tryMt = isMT;↩
#endif↩
↩
RET_IF_WRAP_ERROR(outWrap.Res, res, SZ_ERROR_WRITE)↩
RET_IF_WRAP_ERROR(progressWrap.Res, res, SZ_ERROR_PROGRESS)↩
RET_IF_WRAP_ERROR_CONFIRMED(inWrap.Res, res, SZ_ERROR_READ)↩
↩
// return E_OUTOFMEMORY;↩
↩
MainDecodeSRes_wasUsed = true;↩
↩
if (res == SZ_OK && finishStream)↩
{↩
/*↩
if (inSize && *inSize != Stat.PhySize)↩
res = SZ_ERROR_DATA;↩
*/↩
if (outSizeLimit && *outSizeLimit != outWrap.Processed)↩
res = SZ_ERROR_DATA;↩
}↩
↩
return SResToHRESULT_Code(res);↩
}↩
↩
↩
HRESULT CComDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,↩
const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)↩
{↩
return Decode(inStream, outStream, outSize, _finishStream, progress);↩
}↩
↩
STDMETHODIMP CComDecoder::SetFinishMode(UInt32 finishMode)↩
{↩
_finishStream = (finishMode != 0);↩
return S_OK;↩
}↩
↩
STDMETHODIMP CComDecoder::GetInStreamProcessedSize(UInt64 *value)↩
{↩
*value = Stat.InSize;↩
return S_OK;↩
}↩
↩
#ifndef _7ZIP_ST↩
↩
STDMETHODIMP CComDecoder::SetNumberOfThreads(UInt32 numThreads)↩
{↩
_numThreads = numThreads;↩
return S_OK;↩
}↩
↩
STDMETHODIMP CComDecoder::SetMemLimit(UInt64 memUsage)↩
{↩
_memUsage = memUsage;↩
return S_OK;↩
}↩
↩
#endif↩
↩
}}↩