HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) { static const WCHAR trueW[] = {'t','r','u','e',0}; static const WCHAR falseW[] = {'f','a','l','s','e',0}; static const WCHAR true2W[] = {'#','T','R','U','E','#',0}; static const WCHAR false2W[] = {'#','F','A','L','S','E','#',0}; LONGLONG res; HRESULT hr; TRACE("%p,%p\n", propvarIn, ret); *ret = FALSE; switch (propvarIn->vt) { case VT_BOOL: *ret = propvarIn->u.boolVal == VARIANT_TRUE; return S_OK; case VT_LPWSTR: case VT_BSTR: if (!propvarIn->u.pwszVal) return DISP_E_TYPEMISMATCH; if (!lstrcmpiW(propvarIn->u.pwszVal, trueW) || !lstrcmpW(propvarIn->u.pwszVal, true2W)) { *ret = TRUE; return S_OK; } if (!lstrcmpiW(propvarIn->u.pwszVal, falseW) || !lstrcmpW(propvarIn->u.pwszVal, false2W)) { *ret = FALSE; return S_OK; } break; case VT_LPSTR: if (!propvarIn->u.pszVal) return DISP_E_TYPEMISMATCH; if (!lstrcmpiA(propvarIn->u.pszVal, "true") || !lstrcmpA(propvarIn->u.pszVal, "#TRUE#")) { *ret = TRUE; return S_OK; } if (!lstrcmpiA(propvarIn->u.pszVal, "false") || !lstrcmpA(propvarIn->u.pszVal, "#FALSE#")) { *ret = FALSE; return S_OK; } break; } hr = PROPVAR_ConvertNumber(propvarIn, 64, TRUE, &res); *ret = !!res; return hr; }
HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret) { LONGLONG res; HRESULT hr; TRACE("%p,%p\n", propvarIn, ret); hr = PROPVAR_ConvertNumber(propvarIn, 64, FALSE, &res); if (SUCCEEDED(hr)) *ret = (ULONGLONG)res; return hr; }
HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret) { LONGLONG res; HRESULT hr; TRACE("%p,%p\n", propvarIn, ret); hr = PROPVAR_ConvertNumber(propvarIn, 32, TRUE, &res); if (SUCCEEDED(hr)) *ret = (LONG)res; return hr; }
/****************************************************************** * PropVariantChangeType (PROPSYS.@) */ HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt) { HRESULT hr; FIXME("(%p, %p, %d, %d, %d): semi-stub!\n", ppropvarDest, propvarSrc, propvarSrc->vt, flags, vt); if (vt == propvarSrc->vt) return PropVariantCopy(ppropvarDest, propvarSrc); if (propvarSrc->vt == VT_FILETIME) return PROPVAR_ConvertFILETIME(&propvarSrc->u.filetime, ppropvarDest, vt); switch (vt) { case VT_I1: { LONGLONG res; hr = PROPVAR_ConvertNumber(propvarSrc, 8, TRUE, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I1; ppropvarDest->u.cVal = (char)res; } return hr; } case VT_UI1: { LONGLONG res; hr = PROPVAR_ConvertNumber(propvarSrc, 8, FALSE, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI1; ppropvarDest->u.bVal = (UCHAR)res; } return hr; } case VT_I2: { SHORT res; hr = PropVariantToInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I2; ppropvarDest->u.iVal = res; } return hr; } case VT_UI2: { USHORT res; hr = PropVariantToUInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI2; ppropvarDest->u.uiVal = res; } return hr; } case VT_I4: { LONG res; hr = PropVariantToInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I4; ppropvarDest->u.lVal = res; } return hr; } case VT_UI4: { ULONG res; hr = PropVariantToUInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI4; ppropvarDest->u.ulVal = res; } return hr; } case VT_I8: { LONGLONG res; hr = PropVariantToInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I8; ppropvarDest->u.hVal.QuadPart = res; } return hr; } case VT_UI8: { ULONGLONG res; hr = PropVariantToUInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI8; ppropvarDest->u.uhVal.QuadPart = res; } return hr; } case VT_LPWSTR: case VT_BSTR: { WCHAR *res; hr = PropVariantToStringAlloc(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_LPWSTR; ppropvarDest->u.pwszVal = res; } return hr; } case VT_LPSTR: { WCHAR *resW; hr = PropVariantToStringAlloc(propvarSrc, &resW); if (SUCCEEDED(hr)) { char *res; DWORD len; len = WideCharToMultiByte(CP_ACP, 0, resW, -1, NULL, 0, NULL, NULL); res = CoTaskMemAlloc(len); if (res) { WideCharToMultiByte(CP_ACP, 0, resW, -1, res, len, NULL, NULL); ppropvarDest->vt = VT_LPSTR; ppropvarDest->u.pszVal = res; } else hr = E_OUTOFMEMORY; CoTaskMemFree(resW); } return hr; } default: FIXME("Unhandled dest type: %d\n", vt); return E_FAIL; } }