Mercurial > vba-linux
diff src/win32/7zip/7z/CPP/7zip/Archive/Common/ParseProperties.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Archive/Common/ParseProperties.cpp Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,177 @@ 1.4 +// ParseProperties.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "ParseProperties.h" 1.9 + 1.10 +#include "Common/StringToInt.h" 1.11 +#include "Common/MyCom.h" 1.12 + 1.13 +HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) 1.14 +{ 1.15 + if (prop.vt == VT_UI4) 1.16 + { 1.17 + if (!name.IsEmpty()) 1.18 + return E_INVALIDARG; 1.19 + resValue = prop.ulVal; 1.20 + } 1.21 + else if (prop.vt == VT_EMPTY) 1.22 + { 1.23 + if(!name.IsEmpty()) 1.24 + { 1.25 + const wchar_t *start = name; 1.26 + const wchar_t *end; 1.27 + UInt64 v = ConvertStringToUInt64(start, &end); 1.28 + if (end - start != name.Length()) 1.29 + return E_INVALIDARG; 1.30 + resValue = (UInt32)v; 1.31 + } 1.32 + } 1.33 + else 1.34 + return E_INVALIDARG; 1.35 + return S_OK; 1.36 +} 1.37 + 1.38 +static const int kLogarithmicSizeLimit = 32; 1.39 +static const wchar_t kByteSymbol = L'B'; 1.40 +static const wchar_t kKiloByteSymbol = L'K'; 1.41 +static const wchar_t kMegaByteSymbol = L'M'; 1.42 + 1.43 +HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize) 1.44 +{ 1.45 + UString srcString = srcStringSpec; 1.46 + srcString.MakeUpper(); 1.47 + 1.48 + const wchar_t *start = srcString; 1.49 + const wchar_t *end; 1.50 + UInt64 number = ConvertStringToUInt64(start, &end); 1.51 + int numDigits = (int)(end - start); 1.52 + if (numDigits == 0 || srcString.Length() > numDigits + 1) 1.53 + return E_INVALIDARG; 1.54 + if (srcString.Length() == numDigits) 1.55 + { 1.56 + if (number >= kLogarithmicSizeLimit) 1.57 + return E_INVALIDARG; 1.58 + dicSize = (UInt32)1 << (int)number; 1.59 + return S_OK; 1.60 + } 1.61 + switch (srcString[numDigits]) 1.62 + { 1.63 + case kByteSymbol: 1.64 + if (number >= ((UInt64)1 << kLogarithmicSizeLimit)) 1.65 + return E_INVALIDARG; 1.66 + dicSize = (UInt32)number; 1.67 + break; 1.68 + case kKiloByteSymbol: 1.69 + if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10))) 1.70 + return E_INVALIDARG; 1.71 + dicSize = (UInt32)(number << 10); 1.72 + break; 1.73 + case kMegaByteSymbol: 1.74 + if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20))) 1.75 + return E_INVALIDARG; 1.76 + dicSize = (UInt32)(number << 20); 1.77 + break; 1.78 + default: 1.79 + return E_INVALIDARG; 1.80 + } 1.81 + return S_OK; 1.82 +} 1.83 + 1.84 +HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) 1.85 +{ 1.86 + if (name.IsEmpty()) 1.87 + { 1.88 + if (prop.vt == VT_UI4) 1.89 + { 1.90 + UInt32 logDicSize = prop.ulVal; 1.91 + if (logDicSize >= 32) 1.92 + return E_INVALIDARG; 1.93 + resValue = (UInt32)1 << logDicSize; 1.94 + return S_OK; 1.95 + } 1.96 + if (prop.vt == VT_BSTR) 1.97 + return ParsePropDictionaryValue(prop.bstrVal, resValue); 1.98 + return E_INVALIDARG; 1.99 + } 1.100 + return ParsePropDictionaryValue(name, resValue); 1.101 +} 1.102 + 1.103 +bool StringToBool(const UString &s, bool &res) 1.104 +{ 1.105 + if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0 || s.Compare(L"+") == 0) 1.106 + { 1.107 + res = true; 1.108 + return true; 1.109 + } 1.110 + if (s.CompareNoCase(L"OFF") == 0 || s.Compare(L"-") == 0) 1.111 + { 1.112 + res = false; 1.113 + return true; 1.114 + } 1.115 + return false; 1.116 +} 1.117 + 1.118 +HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value) 1.119 +{ 1.120 + switch(value.vt) 1.121 + { 1.122 + case VT_EMPTY: 1.123 + dest = true; 1.124 + return S_OK; 1.125 + case VT_BOOL: 1.126 + dest = (value.boolVal != VARIANT_FALSE); 1.127 + return S_OK; 1.128 + /* 1.129 + case VT_UI4: 1.130 + dest = (value.ulVal != 0); 1.131 + break; 1.132 + */ 1.133 + case VT_BSTR: 1.134 + return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG; 1.135 + } 1.136 + return E_INVALIDARG; 1.137 +} 1.138 + 1.139 +int ParseStringToUInt32(const UString &srcString, UInt32 &number) 1.140 +{ 1.141 + const wchar_t *start = srcString; 1.142 + const wchar_t *end; 1.143 + UInt64 number64 = ConvertStringToUInt64(start, &end); 1.144 + if (number64 > 0xFFFFFFFF) 1.145 + { 1.146 + number = 0; 1.147 + return 0; 1.148 + } 1.149 + number = (UInt32)number64; 1.150 + return (int)(end - start); 1.151 +} 1.152 + 1.153 +HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads) 1.154 +{ 1.155 + if (name.IsEmpty()) 1.156 + { 1.157 + switch(prop.vt) 1.158 + { 1.159 + case VT_UI4: 1.160 + numThreads = prop.ulVal; 1.161 + break; 1.162 + default: 1.163 + { 1.164 + bool val; 1.165 + RINOK(SetBoolProperty(val, prop)); 1.166 + numThreads = (val ? defaultNumThreads : 1); 1.167 + break; 1.168 + } 1.169 + } 1.170 + } 1.171 + else 1.172 + { 1.173 + UInt32 number; 1.174 + int index = ParseStringToUInt32(name, number); 1.175 + if (index != name.Length()) 1.176 + return E_INVALIDARG; 1.177 + numThreads = number; 1.178 + } 1.179 + return S_OK; 1.180 +}