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