ParseProperties.cpp 3.9 KB

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