mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 13:15:04 -06:00
191 lines
4.4 KiB
C++
191 lines
4.4 KiB
C++
// XzEncoder.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "../../../C/Alloc.h"
|
|
|
|
#include "../Common/CWrappers.h"
|
|
#include "../Common/StreamUtils.h"
|
|
|
|
#include "XzEncoder.h"
|
|
|
|
namespace NCompress {
|
|
|
|
namespace NLzma2 {
|
|
|
|
HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props);
|
|
|
|
}
|
|
|
|
namespace NXz {
|
|
|
|
extern "C" {
|
|
|
|
static void *SzBigAlloc(ISzAllocPtr, size_t size) { return BigAlloc(size); }
|
|
static void SzBigFree(ISzAllocPtr, void *address) { BigFree(address); }
|
|
static const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
|
|
|
|
static void *SzAlloc(ISzAllocPtr, size_t size) { return MyAlloc(size); }
|
|
static void SzFree(ISzAllocPtr, void *address) { MyFree(address); }
|
|
static const ISzAlloc g_Alloc = { SzAlloc, SzFree };
|
|
|
|
}
|
|
|
|
void CEncoder::InitCoderProps()
|
|
{
|
|
Lzma2EncProps_Init(&_lzma2Props);
|
|
XzProps_Init(&xzProps);
|
|
XzFilterProps_Init(&filter);
|
|
|
|
xzProps.lzma2Props = &_lzma2Props;
|
|
// xzProps.filterProps = (_filterId != 0 ? &filter : NULL);
|
|
xzProps.filterProps = NULL;
|
|
}
|
|
|
|
CEncoder::CEncoder()
|
|
{
|
|
InitCoderProps();
|
|
}
|
|
|
|
CEncoder::~CEncoder()
|
|
{
|
|
}
|
|
|
|
|
|
HRESULT CEncoder::SetCoderProp(PROPID propID, const PROPVARIANT &prop)
|
|
{
|
|
return NLzma2::SetLzma2Prop(propID, prop, _lzma2Props);
|
|
}
|
|
|
|
STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
|
|
const PROPVARIANT *coderProps, UInt32 numProps)
|
|
{
|
|
Lzma2EncProps_Init(&_lzma2Props);
|
|
|
|
for (UInt32 i = 0; i < numProps; i++)
|
|
{
|
|
RINOK(SetCoderProp(propIDs[i], coderProps[i]));
|
|
}
|
|
return S_OK;
|
|
// return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream,
|
|
ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 * /* outSize */,
|
|
ICompressProgressInfo *progress)
|
|
{
|
|
CSeqOutStreamWrap seqOutStream;
|
|
|
|
seqOutStream.Init(outStream);
|
|
|
|
// if (IntToBool(newData))
|
|
{
|
|
/*
|
|
UInt64 size;
|
|
{
|
|
NCOM::CPropVariant prop;
|
|
RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
|
|
if (prop.vt != VT_UI8)
|
|
return E_INVALIDARG;
|
|
size = prop.uhVal.QuadPart;
|
|
RINOK(updateCallback->SetTotal(size));
|
|
}
|
|
*/
|
|
|
|
/*
|
|
CLzma2EncProps lzma2Props;
|
|
Lzma2EncProps_Init(&lzma2Props);
|
|
|
|
lzma2Props.lzmaProps.level = GetLevel();
|
|
*/
|
|
|
|
CSeqInStreamWrap seqInStream;
|
|
|
|
seqInStream.Init(inStream);
|
|
|
|
|
|
/*
|
|
{
|
|
NCOM::CPropVariant prop = (UInt64)size;
|
|
RINOK(NCompress::NLzma2::SetLzma2Prop(NCoderPropID::kReduceSize, prop, lzma2Props));
|
|
}
|
|
|
|
FOR_VECTOR (i, _methods)
|
|
{
|
|
COneMethodInfo &m = _methods[i];
|
|
SetGlobalLevelAndThreads(m
|
|
#ifndef _7ZIP_ST
|
|
, _numThreads
|
|
#endif
|
|
);
|
|
{
|
|
FOR_VECTOR (j, m.Props)
|
|
{
|
|
const CProp &prop = m.Props[j];
|
|
RINOK(NCompress::NLzma2::SetLzma2Prop(prop.Id, prop.Value, lzma2Props));
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifndef _7ZIP_ST
|
|
lzma2Props.numTotalThreads = _numThreads;
|
|
#endif
|
|
|
|
*/
|
|
|
|
CCompressProgressWrap progressWrap;
|
|
|
|
progressWrap.Init(progress);
|
|
|
|
xzProps.checkId = XZ_CHECK_CRC32;
|
|
// xzProps.checkId = XZ_CHECK_CRC64;
|
|
/*
|
|
CXzProps xzProps;
|
|
CXzFilterProps filter;
|
|
XzProps_Init(&xzProps);
|
|
XzFilterProps_Init(&filter);
|
|
xzProps.lzma2Props = &_lzma2Props;
|
|
*/
|
|
/*
|
|
xzProps.filterProps = (_filterId != 0 ? &filter : NULL);
|
|
switch (_crcSize)
|
|
{
|
|
case 0: xzProps.checkId = XZ_CHECK_NO; break;
|
|
case 4: xzProps.checkId = XZ_CHECK_CRC32; break;
|
|
case 8: xzProps.checkId = XZ_CHECK_CRC64; break;
|
|
case 32: xzProps.checkId = XZ_CHECK_SHA256; break;
|
|
default: return E_INVALIDARG;
|
|
}
|
|
filter.id = _filterId;
|
|
if (_filterId == XZ_ID_Delta)
|
|
{
|
|
bool deltaDefined = false;
|
|
FOR_VECTOR (j, _filterMethod.Props)
|
|
{
|
|
const CProp &prop = _filterMethod.Props[j];
|
|
if (prop.Id == NCoderPropID::kDefaultProp && prop.Value.vt == VT_UI4)
|
|
{
|
|
UInt32 delta = (UInt32)prop.Value.ulVal;
|
|
if (delta < 1 || delta > 256)
|
|
return E_INVALIDARG;
|
|
filter.delta = delta;
|
|
deltaDefined = true;
|
|
}
|
|
}
|
|
if (!deltaDefined)
|
|
return E_INVALIDARG;
|
|
}
|
|
*/
|
|
SRes res = Xz_Encode(&seqOutStream.vt, &seqInStream.vt, &xzProps, progress ? &progressWrap.vt : NULL);
|
|
/*
|
|
if (res == SZ_OK)
|
|
return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
|
|
*/
|
|
return SResToHRESULT(res);
|
|
}
|
|
}
|
|
|
|
}}
|