mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
95 lines
2.6 KiB
C++
95 lines
2.6 KiB
C++
|
// Lzma2Encoder.cpp
|
||
|
|
||
|
#include "StdAfx.h"
|
||
|
|
||
|
#include "../../../C/Alloc.h"
|
||
|
|
||
|
#include "../Common/CWrappers.h"
|
||
|
#include "../Common/StreamUtils.h"
|
||
|
|
||
|
#include "Lzma2Encoder.h"
|
||
|
|
||
|
namespace NCompress {
|
||
|
|
||
|
namespace NLzma {
|
||
|
|
||
|
HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
|
||
|
|
||
|
}
|
||
|
|
||
|
namespace NLzma2 {
|
||
|
|
||
|
static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
|
||
|
static void SzBigFree(void *, void *address) { BigFree(address); }
|
||
|
static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
|
||
|
|
||
|
static void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
|
||
|
static void SzFree(void *, void *address) { MyFree(address); }
|
||
|
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
|
||
|
|
||
|
CEncoder::CEncoder()
|
||
|
{
|
||
|
_encoder = 0;
|
||
|
_encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc);
|
||
|
if (_encoder == 0)
|
||
|
throw 1;
|
||
|
}
|
||
|
|
||
|
CEncoder::~CEncoder()
|
||
|
{
|
||
|
if (_encoder != 0)
|
||
|
Lzma2Enc_Destroy(_encoder);
|
||
|
}
|
||
|
|
||
|
HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props)
|
||
|
{
|
||
|
switch (propID)
|
||
|
{
|
||
|
case NCoderPropID::kBlockSize:
|
||
|
if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.blockSize = prop.ulVal; break;
|
||
|
case NCoderPropID::kNumThreads:
|
||
|
if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break;
|
||
|
default:
|
||
|
RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps));
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
|
||
|
const PROPVARIANT *coderProps, UInt32 numProps)
|
||
|
{
|
||
|
CLzma2EncProps lzma2Props;
|
||
|
Lzma2EncProps_Init(&lzma2Props);
|
||
|
|
||
|
for (UInt32 i = 0; i < numProps; i++)
|
||
|
{
|
||
|
RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props));
|
||
|
}
|
||
|
return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
|
||
|
{
|
||
|
Byte prop = Lzma2Enc_WriteProperties(_encoder);
|
||
|
return WriteStream(outStream, &prop, 1);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
|
||
|
const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
|
||
|
{
|
||
|
CSeqInStreamWrap inWrap(inStream);
|
||
|
CSeqOutStreamWrap outWrap(outStream);
|
||
|
CCompressProgressWrap progressWrap(progress);
|
||
|
|
||
|
SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL);
|
||
|
if (res == SZ_ERROR_READ && inWrap.Res != S_OK)
|
||
|
return inWrap.Res;
|
||
|
if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK)
|
||
|
return outWrap.Res;
|
||
|
if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK)
|
||
|
return progressWrap.Res;
|
||
|
return SResToHRESULT(res);
|
||
|
}
|
||
|
|
||
|
}}
|