diff options
Diffstat (limited to 'CPP/7zip/Compress/XzEncoder.cpp')
-rw-r--r-- | CPP/7zip/Compress/XzEncoder.cpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/CPP/7zip/Compress/XzEncoder.cpp b/CPP/7zip/Compress/XzEncoder.cpp new file mode 100644 index 00000000..27194597 --- /dev/null +++ b/CPP/7zip/Compress/XzEncoder.cpp @@ -0,0 +1,190 @@ +// 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); + } +} + +}} |