1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Lzma2Encoder.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../C/Alloc.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/CWrappers.h"
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/StreamUtils.h"
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Lzma2Encoder.h"
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NCompress {
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NLzma {
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
16baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NLzma2 {
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
22baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
23baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void SzBigFree(void *, void *address) { BigFree(address); }
24baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
27baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void SzFree(void *, void *address) { MyFree(address); }
28baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
30baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCEncoder::CEncoder()
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _encoder = 0;
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc);
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_encoder == 0)
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    throw 1;
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
38baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCEncoder::~CEncoder()
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_encoder != 0)
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    Lzma2Enc_Destroy(_encoder);
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
44baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props)
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  switch (propID)
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case NCoderPropID::kBlockSize:
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.blockSize = prop.ulVal; break;
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case NCoderPropID::kNumThreads:
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break;
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    default:
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps));
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
58baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const PROPVARIANT *coderProps, UInt32 numProps)
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CLzma2EncProps lzma2Props;
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  Lzma2EncProps_Init(&lzma2Props);
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (UInt32 i = 0; i < numProps; i++)
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props));
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
71baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  Byte prop = Lzma2Enc_WriteProperties(_encoder);
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return WriteStream(outStream, &prop, 1);
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
77baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CSeqInStreamWrap inWrap(inStream);
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CSeqOutStreamWrap outWrap(outStream);
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CCompressProgressWrap progressWrap(progress);
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL);
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (res == SZ_ERROR_READ && inWrap.Res != S_OK)
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return inWrap.Res;
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK)
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return outWrap.Res;
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK)
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return progressWrap.Res;
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return SResToHRESULT(res);
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}}
95