Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Compress/XzEncoder.cpp')
-rw-r--r--CPP/7zip/Compress/XzEncoder.cpp190
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);
+ }
+}
+
+}}