rlm@1
|
1 // ParseProperties.cpp
|
rlm@1
|
2
|
rlm@1
|
3 #include "StdAfx.h"
|
rlm@1
|
4
|
rlm@1
|
5 #include "ParseProperties.h"
|
rlm@1
|
6
|
rlm@1
|
7 #include "Common/StringToInt.h"
|
rlm@1
|
8 #include "Common/MyCom.h"
|
rlm@1
|
9
|
rlm@1
|
10 HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
|
rlm@1
|
11 {
|
rlm@1
|
12 if (prop.vt == VT_UI4)
|
rlm@1
|
13 {
|
rlm@1
|
14 if (!name.IsEmpty())
|
rlm@1
|
15 return E_INVALIDARG;
|
rlm@1
|
16 resValue = prop.ulVal;
|
rlm@1
|
17 }
|
rlm@1
|
18 else if (prop.vt == VT_EMPTY)
|
rlm@1
|
19 {
|
rlm@1
|
20 if(!name.IsEmpty())
|
rlm@1
|
21 {
|
rlm@1
|
22 const wchar_t *start = name;
|
rlm@1
|
23 const wchar_t *end;
|
rlm@1
|
24 UInt64 v = ConvertStringToUInt64(start, &end);
|
rlm@1
|
25 if (end - start != name.Length())
|
rlm@1
|
26 return E_INVALIDARG;
|
rlm@1
|
27 resValue = (UInt32)v;
|
rlm@1
|
28 }
|
rlm@1
|
29 }
|
rlm@1
|
30 else
|
rlm@1
|
31 return E_INVALIDARG;
|
rlm@1
|
32 return S_OK;
|
rlm@1
|
33 }
|
rlm@1
|
34
|
rlm@1
|
35 static const int kLogarithmicSizeLimit = 32;
|
rlm@1
|
36 static const wchar_t kByteSymbol = L'B';
|
rlm@1
|
37 static const wchar_t kKiloByteSymbol = L'K';
|
rlm@1
|
38 static const wchar_t kMegaByteSymbol = L'M';
|
rlm@1
|
39
|
rlm@1
|
40 HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize)
|
rlm@1
|
41 {
|
rlm@1
|
42 UString srcString = srcStringSpec;
|
rlm@1
|
43 srcString.MakeUpper();
|
rlm@1
|
44
|
rlm@1
|
45 const wchar_t *start = srcString;
|
rlm@1
|
46 const wchar_t *end;
|
rlm@1
|
47 UInt64 number = ConvertStringToUInt64(start, &end);
|
rlm@1
|
48 int numDigits = (int)(end - start);
|
rlm@1
|
49 if (numDigits == 0 || srcString.Length() > numDigits + 1)
|
rlm@1
|
50 return E_INVALIDARG;
|
rlm@1
|
51 if (srcString.Length() == numDigits)
|
rlm@1
|
52 {
|
rlm@1
|
53 if (number >= kLogarithmicSizeLimit)
|
rlm@1
|
54 return E_INVALIDARG;
|
rlm@1
|
55 dicSize = (UInt32)1 << (int)number;
|
rlm@1
|
56 return S_OK;
|
rlm@1
|
57 }
|
rlm@1
|
58 switch (srcString[numDigits])
|
rlm@1
|
59 {
|
rlm@1
|
60 case kByteSymbol:
|
rlm@1
|
61 if (number >= ((UInt64)1 << kLogarithmicSizeLimit))
|
rlm@1
|
62 return E_INVALIDARG;
|
rlm@1
|
63 dicSize = (UInt32)number;
|
rlm@1
|
64 break;
|
rlm@1
|
65 case kKiloByteSymbol:
|
rlm@1
|
66 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10)))
|
rlm@1
|
67 return E_INVALIDARG;
|
rlm@1
|
68 dicSize = (UInt32)(number << 10);
|
rlm@1
|
69 break;
|
rlm@1
|
70 case kMegaByteSymbol:
|
rlm@1
|
71 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20)))
|
rlm@1
|
72 return E_INVALIDARG;
|
rlm@1
|
73 dicSize = (UInt32)(number << 20);
|
rlm@1
|
74 break;
|
rlm@1
|
75 default:
|
rlm@1
|
76 return E_INVALIDARG;
|
rlm@1
|
77 }
|
rlm@1
|
78 return S_OK;
|
rlm@1
|
79 }
|
rlm@1
|
80
|
rlm@1
|
81 HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
|
rlm@1
|
82 {
|
rlm@1
|
83 if (name.IsEmpty())
|
rlm@1
|
84 {
|
rlm@1
|
85 if (prop.vt == VT_UI4)
|
rlm@1
|
86 {
|
rlm@1
|
87 UInt32 logDicSize = prop.ulVal;
|
rlm@1
|
88 if (logDicSize >= 32)
|
rlm@1
|
89 return E_INVALIDARG;
|
rlm@1
|
90 resValue = (UInt32)1 << logDicSize;
|
rlm@1
|
91 return S_OK;
|
rlm@1
|
92 }
|
rlm@1
|
93 if (prop.vt == VT_BSTR)
|
rlm@1
|
94 return ParsePropDictionaryValue(prop.bstrVal, resValue);
|
rlm@1
|
95 return E_INVALIDARG;
|
rlm@1
|
96 }
|
rlm@1
|
97 return ParsePropDictionaryValue(name, resValue);
|
rlm@1
|
98 }
|
rlm@1
|
99
|
rlm@1
|
100 bool StringToBool(const UString &s, bool &res)
|
rlm@1
|
101 {
|
rlm@1
|
102 if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0 || s.Compare(L"+") == 0)
|
rlm@1
|
103 {
|
rlm@1
|
104 res = true;
|
rlm@1
|
105 return true;
|
rlm@1
|
106 }
|
rlm@1
|
107 if (s.CompareNoCase(L"OFF") == 0 || s.Compare(L"-") == 0)
|
rlm@1
|
108 {
|
rlm@1
|
109 res = false;
|
rlm@1
|
110 return true;
|
rlm@1
|
111 }
|
rlm@1
|
112 return false;
|
rlm@1
|
113 }
|
rlm@1
|
114
|
rlm@1
|
115 HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value)
|
rlm@1
|
116 {
|
rlm@1
|
117 switch(value.vt)
|
rlm@1
|
118 {
|
rlm@1
|
119 case VT_EMPTY:
|
rlm@1
|
120 dest = true;
|
rlm@1
|
121 return S_OK;
|
rlm@1
|
122 case VT_BOOL:
|
rlm@1
|
123 dest = (value.boolVal != VARIANT_FALSE);
|
rlm@1
|
124 return S_OK;
|
rlm@1
|
125 /*
|
rlm@1
|
126 case VT_UI4:
|
rlm@1
|
127 dest = (value.ulVal != 0);
|
rlm@1
|
128 break;
|
rlm@1
|
129 */
|
rlm@1
|
130 case VT_BSTR:
|
rlm@1
|
131 return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG;
|
rlm@1
|
132 }
|
rlm@1
|
133 return E_INVALIDARG;
|
rlm@1
|
134 }
|
rlm@1
|
135
|
rlm@1
|
136 int ParseStringToUInt32(const UString &srcString, UInt32 &number)
|
rlm@1
|
137 {
|
rlm@1
|
138 const wchar_t *start = srcString;
|
rlm@1
|
139 const wchar_t *end;
|
rlm@1
|
140 UInt64 number64 = ConvertStringToUInt64(start, &end);
|
rlm@1
|
141 if (number64 > 0xFFFFFFFF)
|
rlm@1
|
142 {
|
rlm@1
|
143 number = 0;
|
rlm@1
|
144 return 0;
|
rlm@1
|
145 }
|
rlm@1
|
146 number = (UInt32)number64;
|
rlm@1
|
147 return (int)(end - start);
|
rlm@1
|
148 }
|
rlm@1
|
149
|
rlm@1
|
150 HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads)
|
rlm@1
|
151 {
|
rlm@1
|
152 if (name.IsEmpty())
|
rlm@1
|
153 {
|
rlm@1
|
154 switch(prop.vt)
|
rlm@1
|
155 {
|
rlm@1
|
156 case VT_UI4:
|
rlm@1
|
157 numThreads = prop.ulVal;
|
rlm@1
|
158 break;
|
rlm@1
|
159 default:
|
rlm@1
|
160 {
|
rlm@1
|
161 bool val;
|
rlm@1
|
162 RINOK(SetBoolProperty(val, prop));
|
rlm@1
|
163 numThreads = (val ? defaultNumThreads : 1);
|
rlm@1
|
164 break;
|
rlm@1
|
165 }
|
rlm@1
|
166 }
|
rlm@1
|
167 }
|
rlm@1
|
168 else
|
rlm@1
|
169 {
|
rlm@1
|
170 UInt32 number;
|
rlm@1
|
171 int index = ParseStringToUInt32(name, number);
|
rlm@1
|
172 if (index != name.Length())
|
rlm@1
|
173 return E_INVALIDARG;
|
rlm@1
|
174 numThreads = number;
|
rlm@1
|
175 }
|
rlm@1
|
176 return S_OK;
|
rlm@1
|
177 }
|