1 // ParseProperties.cpp
\r
5 #include "ParseProperties.h"
\r
7 #include "Common/StringToInt.h"
\r
8 #include "Common/MyCom.h"
\r
10 HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
\r
12 if (prop.vt == VT_UI4)
\r
14 if (!name.IsEmpty())
\r
15 return E_INVALIDARG;
\r
16 resValue = prop.ulVal;
\r
18 else if (prop.vt == VT_EMPTY)
\r
22 const wchar_t *start = name;
\r
24 UInt64 v = ConvertStringToUInt64(start, &end);
\r
25 if (end - start != name.Length())
\r
26 return E_INVALIDARG;
\r
27 resValue = (UInt32)v;
\r
31 return E_INVALIDARG;
\r
35 static const int kLogarithmicSizeLimit = 32;
\r
36 static const wchar_t kByteSymbol = L'B';
\r
37 static const wchar_t kKiloByteSymbol = L'K';
\r
38 static const wchar_t kMegaByteSymbol = L'M';
\r
40 HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize)
\r
42 UString srcString = srcStringSpec;
\r
43 srcString.MakeUpper();
\r
45 const wchar_t *start = srcString;
\r
47 UInt64 number = ConvertStringToUInt64(start, &end);
\r
48 int numDigits = (int)(end - start);
\r
49 if (numDigits == 0 || srcString.Length() > numDigits + 1)
\r
50 return E_INVALIDARG;
\r
51 if (srcString.Length() == numDigits)
\r
53 if (number >= kLogarithmicSizeLimit)
\r
54 return E_INVALIDARG;
\r
55 dicSize = (UInt32)1 << (int)number;
\r
58 switch (srcString[numDigits])
\r
61 if (number >= ((UInt64)1 << kLogarithmicSizeLimit))
\r
62 return E_INVALIDARG;
\r
63 dicSize = (UInt32)number;
\r
65 case kKiloByteSymbol:
\r
66 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10)))
\r
67 return E_INVALIDARG;
\r
68 dicSize = (UInt32)(number << 10);
\r
70 case kMegaByteSymbol:
\r
71 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20)))
\r
72 return E_INVALIDARG;
\r
73 dicSize = (UInt32)(number << 20);
\r
76 return E_INVALIDARG;
\r
81 HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
\r
85 if (prop.vt == VT_UI4)
\r
87 UInt32 logDicSize = prop.ulVal;
\r
88 if (logDicSize >= 32)
\r
89 return E_INVALIDARG;
\r
90 resValue = (UInt32)1 << logDicSize;
\r
93 if (prop.vt == VT_BSTR)
\r
94 return ParsePropDictionaryValue(prop.bstrVal, resValue);
\r
95 return E_INVALIDARG;
\r
97 return ParsePropDictionaryValue(name, resValue);
\r
100 bool StringToBool(const UString &s, bool &res)
\r
102 if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0 || s.Compare(L"+") == 0)
\r
107 if (s.CompareNoCase(L"OFF") == 0 || s.Compare(L"-") == 0)
\r
115 HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value)
\r
123 dest = (value.boolVal != VARIANT_FALSE);
\r
127 dest = (value.ulVal != 0);
\r
131 return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG;
\r
133 return E_INVALIDARG;
\r
136 int ParseStringToUInt32(const UString &srcString, UInt32 &number)
\r
138 const wchar_t *start = srcString;
\r
139 const wchar_t *end;
\r
140 UInt64 number64 = ConvertStringToUInt64(start, &end);
\r
141 if (number64 > 0xFFFFFFFF)
\r
146 number = (UInt32)number64;
\r
147 return (int)(end - start);
\r
150 HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads)
\r
152 if (name.IsEmpty())
\r
157 numThreads = prop.ulVal;
\r
162 RINOK(SetBoolProperty(val, prop));
\r
163 numThreads = (val ? defaultNumThreads : 1);
\r
171 int index = ParseStringToUInt32(name, number);
\r
172 if (index != name.Length())
\r
173 return E_INVALIDARG;
\r
174 numThreads = number;
\r