1*f6dc9357SAndroid Build Coastguard Worker // MethodProps.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StringToInt.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "MethodProps.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
10*f6dc9357SAndroid Build Coastguard Worker
Calc_From_Val_Percents(UInt64 val,UInt64 percents)11*f6dc9357SAndroid Build Coastguard Worker UInt64 Calc_From_Val_Percents(UInt64 val, UInt64 percents)
12*f6dc9357SAndroid Build Coastguard Worker {
13*f6dc9357SAndroid Build Coastguard Worker // if (percents == 0) return 0;
14*f6dc9357SAndroid Build Coastguard Worker const UInt64 q = percents / 100;
15*f6dc9357SAndroid Build Coastguard Worker const UInt32 r = (UInt32)(percents % 100);
16*f6dc9357SAndroid Build Coastguard Worker UInt64 res = 0;
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker if (q != 0)
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker if (val > (UInt64)(Int64)-1 / q)
21*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
22*f6dc9357SAndroid Build Coastguard Worker res = val * q;
23*f6dc9357SAndroid Build Coastguard Worker }
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker if (r != 0)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker UInt64 v2;
28*f6dc9357SAndroid Build Coastguard Worker if (val <= (UInt64)(Int64)-1 / r)
29*f6dc9357SAndroid Build Coastguard Worker v2 = val * r / 100;
30*f6dc9357SAndroid Build Coastguard Worker else
31*f6dc9357SAndroid Build Coastguard Worker v2 = val / 100 * r;
32*f6dc9357SAndroid Build Coastguard Worker res += v2;
33*f6dc9357SAndroid Build Coastguard Worker if (res < v2)
34*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker return res;
38*f6dc9357SAndroid Build Coastguard Worker }
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker
StringToBool(const wchar_t * s,bool & res)41*f6dc9357SAndroid Build Coastguard Worker bool StringToBool(const wchar_t *s, bool &res)
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker if (s[0] == 0 || (s[0] == '+' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "ON"))
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker res = true;
46*f6dc9357SAndroid Build Coastguard Worker return true;
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker if ((s[0] == '-' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "OFF"))
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker res = false;
51*f6dc9357SAndroid Build Coastguard Worker return true;
52*f6dc9357SAndroid Build Coastguard Worker }
53*f6dc9357SAndroid Build Coastguard Worker return false;
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker
PROPVARIANT_to_bool(const PROPVARIANT & prop,bool & dest)56*f6dc9357SAndroid Build Coastguard Worker HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker switch (prop.vt)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker case VT_EMPTY: dest = true; return S_OK;
61*f6dc9357SAndroid Build Coastguard Worker case VT_BOOL: dest = (prop.boolVal != VARIANT_FALSE); return S_OK;
62*f6dc9357SAndroid Build Coastguard Worker case VT_BSTR: return StringToBool(prop.bstrVal, dest) ? S_OK : E_INVALIDARG;
63*f6dc9357SAndroid Build Coastguard Worker default: break;
64*f6dc9357SAndroid Build Coastguard Worker }
65*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker
ParseStringToUInt32(const UString & srcString,UInt32 & number)68*f6dc9357SAndroid Build Coastguard Worker unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker const wchar_t *start = srcString;
71*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
72*f6dc9357SAndroid Build Coastguard Worker number = ConvertStringToUInt32(start, &end);
73*f6dc9357SAndroid Build Coastguard Worker return (unsigned)(end - start);
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker
ParseStringToUInt64(const UString & srcString,UInt64 & number)76*f6dc9357SAndroid Build Coastguard Worker static unsigned ParseStringToUInt64(const UString &srcString, UInt64 &number)
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker const wchar_t *start = srcString;
79*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
80*f6dc9357SAndroid Build Coastguard Worker number = ConvertStringToUInt64(start, &end);
81*f6dc9357SAndroid Build Coastguard Worker return (unsigned)(end - start);
82*f6dc9357SAndroid Build Coastguard Worker }
83*f6dc9357SAndroid Build Coastguard Worker
ParsePropToUInt32(const UString & name,const PROPVARIANT & prop,UInt32 & resValue)84*f6dc9357SAndroid Build Coastguard Worker HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
85*f6dc9357SAndroid Build Coastguard Worker {
86*f6dc9357SAndroid Build Coastguard Worker // =VT_UI4
87*f6dc9357SAndroid Build Coastguard Worker // =VT_EMPTY : it doesn't change (resValue), and returns S_OK
88*f6dc9357SAndroid Build Coastguard Worker // {stringUInt32}=VT_EMPTY
89*f6dc9357SAndroid Build Coastguard Worker
90*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker if (!name.IsEmpty())
93*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
94*f6dc9357SAndroid Build Coastguard Worker resValue = prop.ulVal;
95*f6dc9357SAndroid Build Coastguard Worker return S_OK;
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_EMPTY)
98*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
99*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
100*f6dc9357SAndroid Build Coastguard Worker return S_OK;
101*f6dc9357SAndroid Build Coastguard Worker UInt32 v;
102*f6dc9357SAndroid Build Coastguard Worker if (ParseStringToUInt32(name, v) != name.Len())
103*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
104*f6dc9357SAndroid Build Coastguard Worker resValue = v;
105*f6dc9357SAndroid Build Coastguard Worker return S_OK;
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker
ParseMtProp2(const UString & name,const PROPVARIANT & prop,UInt32 & numThreads,bool & force)110*f6dc9357SAndroid Build Coastguard Worker HRESULT ParseMtProp2(const UString &name, const PROPVARIANT &prop, UInt32 &numThreads, bool &force)
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker force = false;
113*f6dc9357SAndroid Build Coastguard Worker UString s;
114*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker numThreads = prop.ulVal;
119*f6dc9357SAndroid Build Coastguard Worker force = true;
120*f6dc9357SAndroid Build Coastguard Worker return S_OK;
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker bool val;
123*f6dc9357SAndroid Build Coastguard Worker HRESULT res = PROPVARIANT_to_bool(prop, val);
124*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK)
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker if (!val)
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker numThreads = 1;
129*f6dc9357SAndroid Build Coastguard Worker force = true;
130*f6dc9357SAndroid Build Coastguard Worker }
131*f6dc9357SAndroid Build Coastguard Worker // force = true; for debug
132*f6dc9357SAndroid Build Coastguard Worker // "(VT_BOOL = VARIANT_TRUE)" set "force = false" and doesn't change numThreads
133*f6dc9357SAndroid Build Coastguard Worker return S_OK;
134*f6dc9357SAndroid Build Coastguard Worker }
135*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_BSTR)
136*f6dc9357SAndroid Build Coastguard Worker return res;
137*f6dc9357SAndroid Build Coastguard Worker s.SetFromBstr(prop.bstrVal);
138*f6dc9357SAndroid Build Coastguard Worker if (s.IsEmpty())
139*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
140*f6dc9357SAndroid Build Coastguard Worker }
141*f6dc9357SAndroid Build Coastguard Worker else
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_EMPTY)
144*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
145*f6dc9357SAndroid Build Coastguard Worker s = name;
146*f6dc9357SAndroid Build Coastguard Worker }
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker s.MakeLower_Ascii();
149*f6dc9357SAndroid Build Coastguard Worker const wchar_t *start = s;
150*f6dc9357SAndroid Build Coastguard Worker UInt32 v = numThreads;
151*f6dc9357SAndroid Build Coastguard Worker
152*f6dc9357SAndroid Build Coastguard Worker /* we force up, if threads number specified
153*f6dc9357SAndroid Build Coastguard Worker only `d` will force it down */
154*f6dc9357SAndroid Build Coastguard Worker bool force_loc = true;
155*f6dc9357SAndroid Build Coastguard Worker for (;;)
156*f6dc9357SAndroid Build Coastguard Worker {
157*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *start;
158*f6dc9357SAndroid Build Coastguard Worker if (!c)
159*f6dc9357SAndroid Build Coastguard Worker break;
160*f6dc9357SAndroid Build Coastguard Worker if (c == 'd')
161*f6dc9357SAndroid Build Coastguard Worker {
162*f6dc9357SAndroid Build Coastguard Worker force_loc = false; // force down
163*f6dc9357SAndroid Build Coastguard Worker start++;
164*f6dc9357SAndroid Build Coastguard Worker continue;
165*f6dc9357SAndroid Build Coastguard Worker }
166*f6dc9357SAndroid Build Coastguard Worker if (c == 'u')
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker force_loc = true; // force up
169*f6dc9357SAndroid Build Coastguard Worker start++;
170*f6dc9357SAndroid Build Coastguard Worker continue;
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker bool isPercent = false;
173*f6dc9357SAndroid Build Coastguard Worker if (c == 'p')
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker isPercent = true;
176*f6dc9357SAndroid Build Coastguard Worker start++;
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
179*f6dc9357SAndroid Build Coastguard Worker v = ConvertStringToUInt32(start, &end);
180*f6dc9357SAndroid Build Coastguard Worker if (end == start)
181*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
182*f6dc9357SAndroid Build Coastguard Worker if (isPercent)
183*f6dc9357SAndroid Build Coastguard Worker v = numThreads * v / 100;
184*f6dc9357SAndroid Build Coastguard Worker start = end;
185*f6dc9357SAndroid Build Coastguard Worker }
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker numThreads = v;
188*f6dc9357SAndroid Build Coastguard Worker force = force_loc;
189*f6dc9357SAndroid Build Coastguard Worker return S_OK;
190*f6dc9357SAndroid Build Coastguard Worker }
191*f6dc9357SAndroid Build Coastguard Worker
192*f6dc9357SAndroid Build Coastguard Worker
193*f6dc9357SAndroid Build Coastguard Worker
SetLogSizeProp(UInt64 number,NCOM::CPropVariant & destProp)194*f6dc9357SAndroid Build Coastguard Worker static HRESULT SetLogSizeProp(UInt64 number, NCOM::CPropVariant &destProp)
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker if (number >= 64)
197*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
198*f6dc9357SAndroid Build Coastguard Worker UInt32 val32;
199*f6dc9357SAndroid Build Coastguard Worker if (number < 32)
200*f6dc9357SAndroid Build Coastguard Worker val32 = (UInt32)1 << (unsigned)number;
201*f6dc9357SAndroid Build Coastguard Worker /*
202*f6dc9357SAndroid Build Coastguard Worker else if (number == 32 && reduce_4GB_to_32bits)
203*f6dc9357SAndroid Build Coastguard Worker val32 = (UInt32)(Int32)-1;
204*f6dc9357SAndroid Build Coastguard Worker */
205*f6dc9357SAndroid Build Coastguard Worker else
206*f6dc9357SAndroid Build Coastguard Worker {
207*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt64)((UInt64)1 << (unsigned)number);
208*f6dc9357SAndroid Build Coastguard Worker return S_OK;
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt32)val32;
211*f6dc9357SAndroid Build Coastguard Worker return S_OK;
212*f6dc9357SAndroid Build Coastguard Worker }
213*f6dc9357SAndroid Build Coastguard Worker
214*f6dc9357SAndroid Build Coastguard Worker
StringToDictSize(const UString & s,NCOM::CPropVariant & destProp)215*f6dc9357SAndroid Build Coastguard Worker static HRESULT StringToDictSize(const UString &s, NCOM::CPropVariant &destProp)
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker /* if (reduce_4GB_to_32bits) we can reduce (4 GiB) property to (4 GiB - 1).
218*f6dc9357SAndroid Build Coastguard Worker to fit the value to UInt32 for clients that do not support 64-bit values */
219*f6dc9357SAndroid Build Coastguard Worker
220*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
221*f6dc9357SAndroid Build Coastguard Worker const UInt64 number = ConvertStringToUInt64(s, &end);
222*f6dc9357SAndroid Build Coastguard Worker const unsigned numDigits = (unsigned)(end - s.Ptr());
223*f6dc9357SAndroid Build Coastguard Worker if (numDigits == 0 || s.Len() > numDigits + 1)
224*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
225*f6dc9357SAndroid Build Coastguard Worker
226*f6dc9357SAndroid Build Coastguard Worker if (s.Len() == numDigits)
227*f6dc9357SAndroid Build Coastguard Worker return SetLogSizeProp(number, destProp);
228*f6dc9357SAndroid Build Coastguard Worker
229*f6dc9357SAndroid Build Coastguard Worker unsigned numBits;
230*f6dc9357SAndroid Build Coastguard Worker
231*f6dc9357SAndroid Build Coastguard Worker switch (MyCharLower_Ascii(s[numDigits]))
232*f6dc9357SAndroid Build Coastguard Worker {
233*f6dc9357SAndroid Build Coastguard Worker case 'b': numBits = 0; break;
234*f6dc9357SAndroid Build Coastguard Worker case 'k': numBits = 10; break;
235*f6dc9357SAndroid Build Coastguard Worker case 'm': numBits = 20; break;
236*f6dc9357SAndroid Build Coastguard Worker case 'g': numBits = 30; break;
237*f6dc9357SAndroid Build Coastguard Worker default: return E_INVALIDARG;
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker
240*f6dc9357SAndroid Build Coastguard Worker const UInt64 range4g = ((UInt64)1 << (32 - numBits));
241*f6dc9357SAndroid Build Coastguard Worker if (number < range4g)
242*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt32)((UInt32)number << numBits);
243*f6dc9357SAndroid Build Coastguard Worker /*
244*f6dc9357SAndroid Build Coastguard Worker else if (number == range4g && reduce_4GB_to_32bits)
245*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt32)(Int32)-1;
246*f6dc9357SAndroid Build Coastguard Worker */
247*f6dc9357SAndroid Build Coastguard Worker else if (numBits == 0)
248*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt64)number;
249*f6dc9357SAndroid Build Coastguard Worker else if (number >= ((UInt64)1 << (64 - numBits)))
250*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
251*f6dc9357SAndroid Build Coastguard Worker else
252*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt64)((UInt64)number << numBits);
253*f6dc9357SAndroid Build Coastguard Worker return S_OK;
254*f6dc9357SAndroid Build Coastguard Worker }
255*f6dc9357SAndroid Build Coastguard Worker
256*f6dc9357SAndroid Build Coastguard Worker
PROPVARIANT_to_DictSize(const PROPVARIANT & prop,NCOM::CPropVariant & destProp)257*f6dc9357SAndroid Build Coastguard Worker static HRESULT PROPVARIANT_to_DictSize(const PROPVARIANT &prop, NCOM::CPropVariant &destProp)
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
260*f6dc9357SAndroid Build Coastguard Worker return SetLogSizeProp(prop.ulVal, destProp);
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
263*f6dc9357SAndroid Build Coastguard Worker {
264*f6dc9357SAndroid Build Coastguard Worker UString s;
265*f6dc9357SAndroid Build Coastguard Worker s = prop.bstrVal;
266*f6dc9357SAndroid Build Coastguard Worker return StringToDictSize(s, destProp);
267*f6dc9357SAndroid Build Coastguard Worker }
268*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
269*f6dc9357SAndroid Build Coastguard Worker }
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard Worker
AddProp32(PROPID propid,UInt32 val)272*f6dc9357SAndroid Build Coastguard Worker void CProps::AddProp32(PROPID propid, UInt32 val)
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker CProp &prop = Props.AddNew();
275*f6dc9357SAndroid Build Coastguard Worker prop.IsOptional = true;
276*f6dc9357SAndroid Build Coastguard Worker prop.Id = propid;
277*f6dc9357SAndroid Build Coastguard Worker prop.Value = (UInt32)val;
278*f6dc9357SAndroid Build Coastguard Worker }
279*f6dc9357SAndroid Build Coastguard Worker
AddPropBool(PROPID propid,bool val)280*f6dc9357SAndroid Build Coastguard Worker void CProps::AddPropBool(PROPID propid, bool val)
281*f6dc9357SAndroid Build Coastguard Worker {
282*f6dc9357SAndroid Build Coastguard Worker CProp &prop = Props.AddNew();
283*f6dc9357SAndroid Build Coastguard Worker prop.IsOptional = true;
284*f6dc9357SAndroid Build Coastguard Worker prop.Id = propid;
285*f6dc9357SAndroid Build Coastguard Worker prop.Value = val;
286*f6dc9357SAndroid Build Coastguard Worker }
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker class CCoderProps
289*f6dc9357SAndroid Build Coastguard Worker {
290*f6dc9357SAndroid Build Coastguard Worker PROPID *_propIDs;
291*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant *_props;
292*f6dc9357SAndroid Build Coastguard Worker unsigned _numProps;
293*f6dc9357SAndroid Build Coastguard Worker unsigned _numPropsMax;
294*f6dc9357SAndroid Build Coastguard Worker public:
CCoderProps(unsigned numPropsMax)295*f6dc9357SAndroid Build Coastguard Worker CCoderProps(unsigned numPropsMax):
296*f6dc9357SAndroid Build Coastguard Worker _propIDs(NULL),
297*f6dc9357SAndroid Build Coastguard Worker _props(NULL),
298*f6dc9357SAndroid Build Coastguard Worker _numProps(0),
299*f6dc9357SAndroid Build Coastguard Worker _numPropsMax(numPropsMax)
300*f6dc9357SAndroid Build Coastguard Worker {
301*f6dc9357SAndroid Build Coastguard Worker _propIDs = new PROPID[numPropsMax];
302*f6dc9357SAndroid Build Coastguard Worker _props = new NCOM::CPropVariant[numPropsMax];
303*f6dc9357SAndroid Build Coastguard Worker }
~CCoderProps()304*f6dc9357SAndroid Build Coastguard Worker ~CCoderProps()
305*f6dc9357SAndroid Build Coastguard Worker {
306*f6dc9357SAndroid Build Coastguard Worker delete []_propIDs;
307*f6dc9357SAndroid Build Coastguard Worker delete []_props;
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker void AddProp(const CProp &prop);
SetProps(ICompressSetCoderProperties * setCoderProperties)310*f6dc9357SAndroid Build Coastguard Worker HRESULT SetProps(ICompressSetCoderProperties *setCoderProperties)
311*f6dc9357SAndroid Build Coastguard Worker {
312*f6dc9357SAndroid Build Coastguard Worker return setCoderProperties->SetCoderProperties(_propIDs, _props, _numProps);
313*f6dc9357SAndroid Build Coastguard Worker }
314*f6dc9357SAndroid Build Coastguard Worker };
315*f6dc9357SAndroid Build Coastguard Worker
AddProp(const CProp & prop)316*f6dc9357SAndroid Build Coastguard Worker void CCoderProps::AddProp(const CProp &prop)
317*f6dc9357SAndroid Build Coastguard Worker {
318*f6dc9357SAndroid Build Coastguard Worker if (_numProps >= _numPropsMax)
319*f6dc9357SAndroid Build Coastguard Worker throw 1;
320*f6dc9357SAndroid Build Coastguard Worker _propIDs[_numProps] = prop.Id;
321*f6dc9357SAndroid Build Coastguard Worker _props[_numProps] = prop.Value;
322*f6dc9357SAndroid Build Coastguard Worker _numProps++;
323*f6dc9357SAndroid Build Coastguard Worker }
324*f6dc9357SAndroid Build Coastguard Worker
SetCoderProps(ICompressSetCoderProperties * scp,const UInt64 * dataSizeReduce) const325*f6dc9357SAndroid Build Coastguard Worker HRESULT CProps::SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const
326*f6dc9357SAndroid Build Coastguard Worker {
327*f6dc9357SAndroid Build Coastguard Worker return SetCoderProps_DSReduce_Aff(scp, dataSizeReduce, NULL);
328*f6dc9357SAndroid Build Coastguard Worker }
329*f6dc9357SAndroid Build Coastguard Worker
SetCoderProps_DSReduce_Aff(ICompressSetCoderProperties * scp,const UInt64 * dataSizeReduce,const UInt64 * affinity) const330*f6dc9357SAndroid Build Coastguard Worker HRESULT CProps::SetCoderProps_DSReduce_Aff(
331*f6dc9357SAndroid Build Coastguard Worker ICompressSetCoderProperties *scp,
332*f6dc9357SAndroid Build Coastguard Worker const UInt64 *dataSizeReduce,
333*f6dc9357SAndroid Build Coastguard Worker const UInt64 *affinity) const
334*f6dc9357SAndroid Build Coastguard Worker {
335*f6dc9357SAndroid Build Coastguard Worker CCoderProps coderProps(Props.Size() + (dataSizeReduce ? 1 : 0) + (affinity ? 1 : 0) );
336*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Props)
337*f6dc9357SAndroid Build Coastguard Worker coderProps.AddProp(Props[i]);
338*f6dc9357SAndroid Build Coastguard Worker if (dataSizeReduce)
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker CProp prop;
341*f6dc9357SAndroid Build Coastguard Worker prop.Id = NCoderPropID::kReduceSize;
342*f6dc9357SAndroid Build Coastguard Worker prop.Value = *dataSizeReduce;
343*f6dc9357SAndroid Build Coastguard Worker coderProps.AddProp(prop);
344*f6dc9357SAndroid Build Coastguard Worker }
345*f6dc9357SAndroid Build Coastguard Worker if (affinity)
346*f6dc9357SAndroid Build Coastguard Worker {
347*f6dc9357SAndroid Build Coastguard Worker CProp prop;
348*f6dc9357SAndroid Build Coastguard Worker prop.Id = NCoderPropID::kAffinity;
349*f6dc9357SAndroid Build Coastguard Worker prop.Value = *affinity;
350*f6dc9357SAndroid Build Coastguard Worker coderProps.AddProp(prop);
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker return coderProps.SetProps(scp);
353*f6dc9357SAndroid Build Coastguard Worker }
354*f6dc9357SAndroid Build Coastguard Worker
355*f6dc9357SAndroid Build Coastguard Worker
FindProp(PROPID id) const356*f6dc9357SAndroid Build Coastguard Worker int CMethodProps::FindProp(PROPID id) const
357*f6dc9357SAndroid Build Coastguard Worker {
358*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = Props.Size(); i != 0;)
359*f6dc9357SAndroid Build Coastguard Worker if (Props[--i].Id == id)
360*f6dc9357SAndroid Build Coastguard Worker return (int)i;
361*f6dc9357SAndroid Build Coastguard Worker return -1;
362*f6dc9357SAndroid Build Coastguard Worker }
363*f6dc9357SAndroid Build Coastguard Worker
GetLevel() const364*f6dc9357SAndroid Build Coastguard Worker unsigned CMethodProps::GetLevel() const
365*f6dc9357SAndroid Build Coastguard Worker {
366*f6dc9357SAndroid Build Coastguard Worker int i = FindProp(NCoderPropID::kLevel);
367*f6dc9357SAndroid Build Coastguard Worker if (i < 0)
368*f6dc9357SAndroid Build Coastguard Worker return 5;
369*f6dc9357SAndroid Build Coastguard Worker if (Props[(unsigned)i].Value.vt != VT_UI4)
370*f6dc9357SAndroid Build Coastguard Worker return 9;
371*f6dc9357SAndroid Build Coastguard Worker UInt32 level = Props[(unsigned)i].Value.ulVal;
372*f6dc9357SAndroid Build Coastguard Worker return level > 9 ? 9 : (unsigned)level;
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker
375*f6dc9357SAndroid Build Coastguard Worker struct CNameToPropID
376*f6dc9357SAndroid Build Coastguard Worker {
377*f6dc9357SAndroid Build Coastguard Worker VARTYPE VarType;
378*f6dc9357SAndroid Build Coastguard Worker const char *Name;
379*f6dc9357SAndroid Build Coastguard Worker };
380*f6dc9357SAndroid Build Coastguard Worker
381*f6dc9357SAndroid Build Coastguard Worker
382*f6dc9357SAndroid Build Coastguard Worker // the following are related to NCoderPropID::EEnum values
383*f6dc9357SAndroid Build Coastguard Worker // NCoderPropID::k_NUM_DEFINED
384*f6dc9357SAndroid Build Coastguard Worker static const CNameToPropID g_NameToPropID[] =
385*f6dc9357SAndroid Build Coastguard Worker {
386*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "" },
387*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "d" },
388*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "mem" },
389*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "o" },
390*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "c" },
391*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "pb" },
392*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "lc" },
393*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "lp" },
394*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "fb" },
395*f6dc9357SAndroid Build Coastguard Worker { VT_BSTR, "mf" },
396*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "mc" },
397*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "pass" },
398*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "a" },
399*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "mt" },
400*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "eos" },
401*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "x" },
402*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "reduce" },
403*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "expect" },
404*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "cc" }, // "cc" in v23, "b" in v22.01
405*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "check" },
406*f6dc9357SAndroid Build Coastguard Worker { VT_BSTR, "filter" },
407*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "memuse" },
408*f6dc9357SAndroid Build Coastguard Worker { VT_UI8, "aff" },
409*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "offset" },
410*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zhb" }
411*f6dc9357SAndroid Build Coastguard Worker /*
412*f6dc9357SAndroid Build Coastguard Worker ,
413*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "zhc" },
414*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "zhd" },
415*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "zcb" },
416*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "dc" },
417*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zx" },
418*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zf" },
419*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zmml" },
420*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zov" },
421*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zmfr" },
422*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zle" }, // long enable
423*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "zldb" },
424*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zld" },
425*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zlhb" },
426*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zlmml" },
427*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zlbb" },
428*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zlhrb" },
429*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zwus" },
430*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zshp" },
431*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zshs" },
432*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zshe" },
433*f6dc9357SAndroid Build Coastguard Worker { VT_BOOL, "zshg" },
434*f6dc9357SAndroid Build Coastguard Worker { VT_UI4, "zpsm" }
435*f6dc9357SAndroid Build Coastguard Worker */
436*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "mcb" }, // mc log version
437*f6dc9357SAndroid Build Coastguard Worker // { VT_UI4, "ztlen" }, // fb ?
438*f6dc9357SAndroid Build Coastguard Worker };
439*f6dc9357SAndroid Build Coastguard Worker
440*f6dc9357SAndroid Build Coastguard Worker /*
441*f6dc9357SAndroid Build Coastguard Worker #if defined(static_assert) || (defined(__cplusplus) && __cplusplus >= 200410L) || (defined(_MSC_VER) && _MSC_VER >= 1600)
442*f6dc9357SAndroid Build Coastguard Worker
443*f6dc9357SAndroid Build Coastguard Worker #if (defined(__cplusplus) && __cplusplus < 201103L) \
444*f6dc9357SAndroid Build Coastguard Worker && defined(__clang__) && __clang_major__ >= 4
445*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wc11-extensions"
446*f6dc9357SAndroid Build Coastguard Worker #endif
447*f6dc9357SAndroid Build Coastguard Worker static_assert(Z7_ARRAY_SIZE(g_NameToPropID) == NCoderPropID::k_NUM_DEFINED,
448*f6dc9357SAndroid Build Coastguard Worker "g_NameToPropID doesn't match NCoderPropID enum");
449*f6dc9357SAndroid Build Coastguard Worker #endif
450*f6dc9357SAndroid Build Coastguard Worker */
451*f6dc9357SAndroid Build Coastguard Worker
FindPropIdExact(const UString & name)452*f6dc9357SAndroid Build Coastguard Worker static int FindPropIdExact(const UString &name)
453*f6dc9357SAndroid Build Coastguard Worker {
454*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_NameToPropID); i++)
455*f6dc9357SAndroid Build Coastguard Worker if (StringsAreEqualNoCase_Ascii(name, g_NameToPropID[i].Name))
456*f6dc9357SAndroid Build Coastguard Worker return (int)i;
457*f6dc9357SAndroid Build Coastguard Worker return -1;
458*f6dc9357SAndroid Build Coastguard Worker }
459*f6dc9357SAndroid Build Coastguard Worker
ConvertProperty(const PROPVARIANT & srcProp,VARTYPE varType,NCOM::CPropVariant & destProp)460*f6dc9357SAndroid Build Coastguard Worker static bool ConvertProperty(const PROPVARIANT &srcProp, VARTYPE varType, NCOM::CPropVariant &destProp)
461*f6dc9357SAndroid Build Coastguard Worker {
462*f6dc9357SAndroid Build Coastguard Worker if (varType == srcProp.vt)
463*f6dc9357SAndroid Build Coastguard Worker {
464*f6dc9357SAndroid Build Coastguard Worker destProp = srcProp;
465*f6dc9357SAndroid Build Coastguard Worker return true;
466*f6dc9357SAndroid Build Coastguard Worker }
467*f6dc9357SAndroid Build Coastguard Worker
468*f6dc9357SAndroid Build Coastguard Worker if (varType == VT_UI8 && srcProp.vt == VT_UI4)
469*f6dc9357SAndroid Build Coastguard Worker {
470*f6dc9357SAndroid Build Coastguard Worker destProp = (UInt64)srcProp.ulVal;
471*f6dc9357SAndroid Build Coastguard Worker return true;
472*f6dc9357SAndroid Build Coastguard Worker }
473*f6dc9357SAndroid Build Coastguard Worker
474*f6dc9357SAndroid Build Coastguard Worker if (varType == VT_BOOL)
475*f6dc9357SAndroid Build Coastguard Worker {
476*f6dc9357SAndroid Build Coastguard Worker bool res;
477*f6dc9357SAndroid Build Coastguard Worker if (PROPVARIANT_to_bool(srcProp, res) != S_OK)
478*f6dc9357SAndroid Build Coastguard Worker return false;
479*f6dc9357SAndroid Build Coastguard Worker destProp = res;
480*f6dc9357SAndroid Build Coastguard Worker return true;
481*f6dc9357SAndroid Build Coastguard Worker }
482*f6dc9357SAndroid Build Coastguard Worker if (srcProp.vt == VT_EMPTY)
483*f6dc9357SAndroid Build Coastguard Worker {
484*f6dc9357SAndroid Build Coastguard Worker destProp = srcProp;
485*f6dc9357SAndroid Build Coastguard Worker return true;
486*f6dc9357SAndroid Build Coastguard Worker }
487*f6dc9357SAndroid Build Coastguard Worker return false;
488*f6dc9357SAndroid Build Coastguard Worker }
489*f6dc9357SAndroid Build Coastguard Worker
SplitParams(const UString & srcString,UStringVector & subStrings)490*f6dc9357SAndroid Build Coastguard Worker static void SplitParams(const UString &srcString, UStringVector &subStrings)
491*f6dc9357SAndroid Build Coastguard Worker {
492*f6dc9357SAndroid Build Coastguard Worker subStrings.Clear();
493*f6dc9357SAndroid Build Coastguard Worker UString s;
494*f6dc9357SAndroid Build Coastguard Worker unsigned len = srcString.Len();
495*f6dc9357SAndroid Build Coastguard Worker if (len == 0)
496*f6dc9357SAndroid Build Coastguard Worker return;
497*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
498*f6dc9357SAndroid Build Coastguard Worker {
499*f6dc9357SAndroid Build Coastguard Worker wchar_t c = srcString[i];
500*f6dc9357SAndroid Build Coastguard Worker if (c == L':')
501*f6dc9357SAndroid Build Coastguard Worker {
502*f6dc9357SAndroid Build Coastguard Worker subStrings.Add(s);
503*f6dc9357SAndroid Build Coastguard Worker s.Empty();
504*f6dc9357SAndroid Build Coastguard Worker }
505*f6dc9357SAndroid Build Coastguard Worker else
506*f6dc9357SAndroid Build Coastguard Worker s += c;
507*f6dc9357SAndroid Build Coastguard Worker }
508*f6dc9357SAndroid Build Coastguard Worker subStrings.Add(s);
509*f6dc9357SAndroid Build Coastguard Worker }
510*f6dc9357SAndroid Build Coastguard Worker
SplitParam(const UString & param,UString & name,UString & value)511*f6dc9357SAndroid Build Coastguard Worker static void SplitParam(const UString ¶m, UString &name, UString &value)
512*f6dc9357SAndroid Build Coastguard Worker {
513*f6dc9357SAndroid Build Coastguard Worker int eqPos = param.Find(L'=');
514*f6dc9357SAndroid Build Coastguard Worker if (eqPos >= 0)
515*f6dc9357SAndroid Build Coastguard Worker {
516*f6dc9357SAndroid Build Coastguard Worker name.SetFrom(param, (unsigned)eqPos);
517*f6dc9357SAndroid Build Coastguard Worker value = param.Ptr((unsigned)(eqPos + 1));
518*f6dc9357SAndroid Build Coastguard Worker return;
519*f6dc9357SAndroid Build Coastguard Worker }
520*f6dc9357SAndroid Build Coastguard Worker unsigned i;
521*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < param.Len(); i++)
522*f6dc9357SAndroid Build Coastguard Worker {
523*f6dc9357SAndroid Build Coastguard Worker wchar_t c = param[i];
524*f6dc9357SAndroid Build Coastguard Worker if (c >= L'0' && c <= L'9')
525*f6dc9357SAndroid Build Coastguard Worker break;
526*f6dc9357SAndroid Build Coastguard Worker }
527*f6dc9357SAndroid Build Coastguard Worker name.SetFrom(param, i);
528*f6dc9357SAndroid Build Coastguard Worker value = param.Ptr(i);
529*f6dc9357SAndroid Build Coastguard Worker }
530*f6dc9357SAndroid Build Coastguard Worker
IsLogSizeProp(PROPID propid)531*f6dc9357SAndroid Build Coastguard Worker static bool IsLogSizeProp(PROPID propid)
532*f6dc9357SAndroid Build Coastguard Worker {
533*f6dc9357SAndroid Build Coastguard Worker switch (propid)
534*f6dc9357SAndroid Build Coastguard Worker {
535*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kDictionarySize:
536*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kUsedMemorySize:
537*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kBlockSize:
538*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kBlockSize2:
539*f6dc9357SAndroid Build Coastguard Worker /*
540*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kChainSize:
541*f6dc9357SAndroid Build Coastguard Worker case NCoderPropID::kLdmWindowSize:
542*f6dc9357SAndroid Build Coastguard Worker */
543*f6dc9357SAndroid Build Coastguard Worker // case NCoderPropID::kReduceSize:
544*f6dc9357SAndroid Build Coastguard Worker return true;
545*f6dc9357SAndroid Build Coastguard Worker default: break;
546*f6dc9357SAndroid Build Coastguard Worker }
547*f6dc9357SAndroid Build Coastguard Worker return false;
548*f6dc9357SAndroid Build Coastguard Worker }
549*f6dc9357SAndroid Build Coastguard Worker
SetParam(const UString & name,const UString & value)550*f6dc9357SAndroid Build Coastguard Worker HRESULT CMethodProps::SetParam(const UString &name, const UString &value)
551*f6dc9357SAndroid Build Coastguard Worker {
552*f6dc9357SAndroid Build Coastguard Worker int index = FindPropIdExact(name);
553*f6dc9357SAndroid Build Coastguard Worker if (index < 0)
554*f6dc9357SAndroid Build Coastguard Worker {
555*f6dc9357SAndroid Build Coastguard Worker // 'b' was used as NCoderPropID::kBlockSize2 before v23
556*f6dc9357SAndroid Build Coastguard Worker if (!name.IsEqualTo_Ascii_NoCase("b") || value.Find(L':') >= 0)
557*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
558*f6dc9357SAndroid Build Coastguard Worker index = NCoderPropID::kBlockSize2;
559*f6dc9357SAndroid Build Coastguard Worker }
560*f6dc9357SAndroid Build Coastguard Worker const CNameToPropID &nameToPropID = g_NameToPropID[(unsigned)index];
561*f6dc9357SAndroid Build Coastguard Worker CProp prop;
562*f6dc9357SAndroid Build Coastguard Worker prop.Id = (unsigned)index;
563*f6dc9357SAndroid Build Coastguard Worker
564*f6dc9357SAndroid Build Coastguard Worker if (IsLogSizeProp(prop.Id))
565*f6dc9357SAndroid Build Coastguard Worker {
566*f6dc9357SAndroid Build Coastguard Worker RINOK(StringToDictSize(value, prop.Value))
567*f6dc9357SAndroid Build Coastguard Worker }
568*f6dc9357SAndroid Build Coastguard Worker else
569*f6dc9357SAndroid Build Coastguard Worker {
570*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant propValue;
571*f6dc9357SAndroid Build Coastguard Worker if (nameToPropID.VarType == VT_BSTR)
572*f6dc9357SAndroid Build Coastguard Worker propValue = value;
573*f6dc9357SAndroid Build Coastguard Worker else if (nameToPropID.VarType == VT_BOOL)
574*f6dc9357SAndroid Build Coastguard Worker {
575*f6dc9357SAndroid Build Coastguard Worker bool res;
576*f6dc9357SAndroid Build Coastguard Worker if (!StringToBool(value, res))
577*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
578*f6dc9357SAndroid Build Coastguard Worker propValue = res;
579*f6dc9357SAndroid Build Coastguard Worker }
580*f6dc9357SAndroid Build Coastguard Worker else if (!value.IsEmpty())
581*f6dc9357SAndroid Build Coastguard Worker {
582*f6dc9357SAndroid Build Coastguard Worker if (nameToPropID.VarType == VT_UI4)
583*f6dc9357SAndroid Build Coastguard Worker {
584*f6dc9357SAndroid Build Coastguard Worker UInt32 number;
585*f6dc9357SAndroid Build Coastguard Worker if (ParseStringToUInt32(value, number) == value.Len())
586*f6dc9357SAndroid Build Coastguard Worker propValue = number;
587*f6dc9357SAndroid Build Coastguard Worker else
588*f6dc9357SAndroid Build Coastguard Worker propValue = value;
589*f6dc9357SAndroid Build Coastguard Worker }
590*f6dc9357SAndroid Build Coastguard Worker else if (nameToPropID.VarType == VT_UI8)
591*f6dc9357SAndroid Build Coastguard Worker {
592*f6dc9357SAndroid Build Coastguard Worker UInt64 number;
593*f6dc9357SAndroid Build Coastguard Worker if (ParseStringToUInt64(value, number) == value.Len())
594*f6dc9357SAndroid Build Coastguard Worker propValue = number;
595*f6dc9357SAndroid Build Coastguard Worker else
596*f6dc9357SAndroid Build Coastguard Worker propValue = value;
597*f6dc9357SAndroid Build Coastguard Worker }
598*f6dc9357SAndroid Build Coastguard Worker else
599*f6dc9357SAndroid Build Coastguard Worker propValue = value;
600*f6dc9357SAndroid Build Coastguard Worker }
601*f6dc9357SAndroid Build Coastguard Worker if (!ConvertProperty(propValue, nameToPropID.VarType, prop.Value))
602*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
603*f6dc9357SAndroid Build Coastguard Worker }
604*f6dc9357SAndroid Build Coastguard Worker Props.Add(prop);
605*f6dc9357SAndroid Build Coastguard Worker return S_OK;
606*f6dc9357SAndroid Build Coastguard Worker }
607*f6dc9357SAndroid Build Coastguard Worker
ParseParamsFromString(const UString & srcString)608*f6dc9357SAndroid Build Coastguard Worker HRESULT CMethodProps::ParseParamsFromString(const UString &srcString)
609*f6dc9357SAndroid Build Coastguard Worker {
610*f6dc9357SAndroid Build Coastguard Worker UStringVector params;
611*f6dc9357SAndroid Build Coastguard Worker SplitParams(srcString, params);
612*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, params)
613*f6dc9357SAndroid Build Coastguard Worker {
614*f6dc9357SAndroid Build Coastguard Worker const UString ¶m = params[i];
615*f6dc9357SAndroid Build Coastguard Worker UString name, value;
616*f6dc9357SAndroid Build Coastguard Worker SplitParam(param, name, value);
617*f6dc9357SAndroid Build Coastguard Worker RINOK(SetParam(name, value))
618*f6dc9357SAndroid Build Coastguard Worker }
619*f6dc9357SAndroid Build Coastguard Worker return S_OK;
620*f6dc9357SAndroid Build Coastguard Worker }
621*f6dc9357SAndroid Build Coastguard Worker
ParseParamsFromPROPVARIANT(const UString & realName,const PROPVARIANT & value)622*f6dc9357SAndroid Build Coastguard Worker HRESULT CMethodProps::ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value)
623*f6dc9357SAndroid Build Coastguard Worker {
624*f6dc9357SAndroid Build Coastguard Worker if (realName.Len() == 0)
625*f6dc9357SAndroid Build Coastguard Worker {
626*f6dc9357SAndroid Build Coastguard Worker // [empty]=method
627*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
628*f6dc9357SAndroid Build Coastguard Worker }
629*f6dc9357SAndroid Build Coastguard Worker if (value.vt == VT_EMPTY)
630*f6dc9357SAndroid Build Coastguard Worker {
631*f6dc9357SAndroid Build Coastguard Worker // {realName}=[empty]
632*f6dc9357SAndroid Build Coastguard Worker UString name, valueStr;
633*f6dc9357SAndroid Build Coastguard Worker SplitParam(realName, name, valueStr);
634*f6dc9357SAndroid Build Coastguard Worker return SetParam(name, valueStr);
635*f6dc9357SAndroid Build Coastguard Worker }
636*f6dc9357SAndroid Build Coastguard Worker
637*f6dc9357SAndroid Build Coastguard Worker // {realName}=value
638*f6dc9357SAndroid Build Coastguard Worker const int index = FindPropIdExact(realName);
639*f6dc9357SAndroid Build Coastguard Worker if (index < 0)
640*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
641*f6dc9357SAndroid Build Coastguard Worker const CNameToPropID &nameToPropID = g_NameToPropID[(unsigned)index];
642*f6dc9357SAndroid Build Coastguard Worker CProp prop;
643*f6dc9357SAndroid Build Coastguard Worker prop.Id = (unsigned)index;
644*f6dc9357SAndroid Build Coastguard Worker
645*f6dc9357SAndroid Build Coastguard Worker if (IsLogSizeProp(prop.Id))
646*f6dc9357SAndroid Build Coastguard Worker {
647*f6dc9357SAndroid Build Coastguard Worker RINOK(PROPVARIANT_to_DictSize(value, prop.Value))
648*f6dc9357SAndroid Build Coastguard Worker }
649*f6dc9357SAndroid Build Coastguard Worker else
650*f6dc9357SAndroid Build Coastguard Worker {
651*f6dc9357SAndroid Build Coastguard Worker if (!ConvertProperty(value, nameToPropID.VarType, prop.Value))
652*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
653*f6dc9357SAndroid Build Coastguard Worker }
654*f6dc9357SAndroid Build Coastguard Worker Props.Add(prop);
655*f6dc9357SAndroid Build Coastguard Worker return S_OK;
656*f6dc9357SAndroid Build Coastguard Worker }
657*f6dc9357SAndroid Build Coastguard Worker
658*f6dc9357SAndroid Build Coastguard Worker
GetMemoryUsage_LZMA(UInt32 dict,bool isBt,UInt32 numThreads)659*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetMemoryUsage_LZMA(UInt32 dict, bool isBt, UInt32 numThreads)
660*f6dc9357SAndroid Build Coastguard Worker {
661*f6dc9357SAndroid Build Coastguard Worker UInt32 hs = dict - 1;
662*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 1);
663*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 2);
664*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 4);
665*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 8);
666*f6dc9357SAndroid Build Coastguard Worker hs >>= 1;
667*f6dc9357SAndroid Build Coastguard Worker if (hs >= (1 << 24))
668*f6dc9357SAndroid Build Coastguard Worker hs >>= 1;
669*f6dc9357SAndroid Build Coastguard Worker hs |= (1 << 16) - 1;
670*f6dc9357SAndroid Build Coastguard Worker // if (numHashBytes >= 5)
671*f6dc9357SAndroid Build Coastguard Worker if (!isBt)
672*f6dc9357SAndroid Build Coastguard Worker hs |= (256 << 10) - 1;
673*f6dc9357SAndroid Build Coastguard Worker hs++;
674*f6dc9357SAndroid Build Coastguard Worker UInt64 size1 = (UInt64)hs * 4;
675*f6dc9357SAndroid Build Coastguard Worker size1 += (UInt64)dict * 4;
676*f6dc9357SAndroid Build Coastguard Worker if (isBt)
677*f6dc9357SAndroid Build Coastguard Worker size1 += (UInt64)dict * 4;
678*f6dc9357SAndroid Build Coastguard Worker size1 += (2 << 20);
679*f6dc9357SAndroid Build Coastguard Worker
680*f6dc9357SAndroid Build Coastguard Worker if (numThreads > 1 && isBt)
681*f6dc9357SAndroid Build Coastguard Worker size1 += (2 << 20) + (4 << 20);
682*f6dc9357SAndroid Build Coastguard Worker return size1;
683*f6dc9357SAndroid Build Coastguard Worker }
684*f6dc9357SAndroid Build Coastguard Worker
685*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLzmaMaxDictSize = (UInt32)15 << 28;
686*f6dc9357SAndroid Build Coastguard Worker
Get_Lzma_MemUsage(bool addSlidingWindowSize) const687*f6dc9357SAndroid Build Coastguard Worker UInt64 CMethodProps::Get_Lzma_MemUsage(bool addSlidingWindowSize) const
688*f6dc9357SAndroid Build Coastguard Worker {
689*f6dc9357SAndroid Build Coastguard Worker const UInt64 dicSize = Get_Lzma_DicSize();
690*f6dc9357SAndroid Build Coastguard Worker const bool isBt = Get_Lzma_MatchFinder_IsBt();
691*f6dc9357SAndroid Build Coastguard Worker const UInt32 dict32 = (dicSize >= kLzmaMaxDictSize ? kLzmaMaxDictSize : (UInt32)dicSize);
692*f6dc9357SAndroid Build Coastguard Worker const UInt32 numThreads = Get_Lzma_NumThreads();
693*f6dc9357SAndroid Build Coastguard Worker UInt64 size = GetMemoryUsage_LZMA(dict32, isBt, numThreads);
694*f6dc9357SAndroid Build Coastguard Worker
695*f6dc9357SAndroid Build Coastguard Worker if (addSlidingWindowSize)
696*f6dc9357SAndroid Build Coastguard Worker {
697*f6dc9357SAndroid Build Coastguard Worker const UInt32 kBlockSizeMax = (UInt32)0 - (UInt32)(1 << 16);
698*f6dc9357SAndroid Build Coastguard Worker UInt64 blockSize = (UInt64)dict32 + (1 << 16)
699*f6dc9357SAndroid Build Coastguard Worker + (numThreads > 1 ? (1 << 20) : 0);
700*f6dc9357SAndroid Build Coastguard Worker blockSize += (blockSize >> (blockSize < ((UInt32)1 << 30) ? 1 : 2));
701*f6dc9357SAndroid Build Coastguard Worker if (blockSize >= kBlockSizeMax)
702*f6dc9357SAndroid Build Coastguard Worker blockSize = kBlockSizeMax;
703*f6dc9357SAndroid Build Coastguard Worker size += blockSize;
704*f6dc9357SAndroid Build Coastguard Worker }
705*f6dc9357SAndroid Build Coastguard Worker return size;
706*f6dc9357SAndroid Build Coastguard Worker }
707*f6dc9357SAndroid Build Coastguard Worker
708*f6dc9357SAndroid Build Coastguard Worker
709*f6dc9357SAndroid Build Coastguard Worker
710*f6dc9357SAndroid Build Coastguard Worker
ParseMethodFromString(const UString & s)711*f6dc9357SAndroid Build Coastguard Worker HRESULT COneMethodInfo::ParseMethodFromString(const UString &s)
712*f6dc9357SAndroid Build Coastguard Worker {
713*f6dc9357SAndroid Build Coastguard Worker MethodName.Empty();
714*f6dc9357SAndroid Build Coastguard Worker int splitPos = s.Find(L':');
715*f6dc9357SAndroid Build Coastguard Worker {
716*f6dc9357SAndroid Build Coastguard Worker UString temp = s;
717*f6dc9357SAndroid Build Coastguard Worker if (splitPos >= 0)
718*f6dc9357SAndroid Build Coastguard Worker temp.DeleteFrom((unsigned)splitPos);
719*f6dc9357SAndroid Build Coastguard Worker if (!temp.IsAscii())
720*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
721*f6dc9357SAndroid Build Coastguard Worker MethodName.SetFromWStr_if_Ascii(temp);
722*f6dc9357SAndroid Build Coastguard Worker }
723*f6dc9357SAndroid Build Coastguard Worker if (splitPos < 0)
724*f6dc9357SAndroid Build Coastguard Worker return S_OK;
725*f6dc9357SAndroid Build Coastguard Worker PropsString = s.Ptr((unsigned)(splitPos + 1));
726*f6dc9357SAndroid Build Coastguard Worker return ParseParamsFromString(PropsString);
727*f6dc9357SAndroid Build Coastguard Worker }
728*f6dc9357SAndroid Build Coastguard Worker
ParseMethodFromPROPVARIANT(const UString & realName,const PROPVARIANT & value)729*f6dc9357SAndroid Build Coastguard Worker HRESULT COneMethodInfo::ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value)
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker if (!realName.IsEmpty() && !StringsAreEqualNoCase_Ascii(realName, "m"))
732*f6dc9357SAndroid Build Coastguard Worker return ParseParamsFromPROPVARIANT(realName, value);
733*f6dc9357SAndroid Build Coastguard Worker // -m{N}=method
734*f6dc9357SAndroid Build Coastguard Worker if (value.vt != VT_BSTR)
735*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
736*f6dc9357SAndroid Build Coastguard Worker UString s;
737*f6dc9357SAndroid Build Coastguard Worker s = value.bstrVal;
738*f6dc9357SAndroid Build Coastguard Worker return ParseMethodFromString(s);
739*f6dc9357SAndroid Build Coastguard Worker }
740