[PATCH] propsys: Add PropVariantToBoolean and tests
Fabian Maurer
dark.shadow4 at web.de
Mon Sep 18 16:09:19 CDT 2017
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
dlls/propsys/propsys.spec | 2 +-
dlls/propsys/propvar.c | 56 +++++++++++++++++
dlls/propsys/tests/propsys.c | 147 +++++++++++++++++++++++++++++++++++++++++++
include/propvarutil.h | 1 +
4 files changed, 205 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec
index 582308f5a0..86a5e696eb 100644
--- a/dlls/propsys/propsys.spec
+++ b/dlls/propsys/propsys.spec
@@ -107,7 +107,7 @@
@ stub PropVariantGetUInt32Elem
@ stub PropVariantGetUInt64Elem
@ stub PropVariantToBSTR
-@ stub PropVariantToBoolean
+@ stdcall PropVariantToBoolean(ptr ptr)
@ stub PropVariantToBooleanVector
@ stub PropVariantToBooleanVectorAlloc
@ stub PropVariantToBooleanWithDefault
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c
index ca3b421ddd..33d6766e47 100644
--- a/dlls/propsys/propvar.c
+++ b/dlls/propsys/propvar.c
@@ -227,6 +227,62 @@ HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret)
return hr;
}
+HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret)
+{
+ LONGLONG res;
+ HRESULT hr;
+ static const WCHAR str_true[] = {'t','r','u','e',0};
+ static const WCHAR str_false[] = {'f','a','l','s','e',0};
+
+ 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, str_true) == 0)
+ {
+ *ret = TRUE;
+ return S_OK;
+ }
+ if(lstrcmpiW(propvarIn->u.pwszVal, str_false) == 0)
+ {
+ *ret = FALSE;
+ return S_OK;
+ }
+ break;
+
+ case VT_LPSTR:
+ if(!propvarIn->u.pszVal)
+ return DISP_E_TYPEMISMATCH;
+
+ if(lstrcmpiA(propvarIn->u.pszVal, "true") == 0)
+ {
+ *ret = TRUE;
+ return S_OK;
+ }
+ if(lstrcmpiA(propvarIn->u.pszVal, "false") == 0)
+ {
+ *ret = FALSE;
+ return S_OK;
+ }
+ break;
+ }
+
+ hr = PROPVAR_ConvertNumber(propvarIn, 64, FALSE, &res);
+ *ret = !!res;
+ return hr;
+}
+
HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret)
{
WCHAR *res = NULL;
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c
index 776ccd0bfd..51b0e816f3 100644
--- a/dlls/propsys/tests/propsys.c
+++ b/dlls/propsys/tests/propsys.c
@@ -883,6 +883,152 @@ static void test_intconversions(void)
ok(llval == -7, "got wrong value %s\n", wine_dbgstr_longlong(llval));
}
+static void test_PropVariantToBoolean(void)
+{
+ PROPVARIANT propvar;
+ BOOL val;
+ HRESULT hr;
+ static WCHAR str_0[] = {'0',0};
+ static WCHAR str_1[] = {'1',0};
+ static WCHAR str_7[] = {'7',0};
+ static WCHAR str_true[] = {'t','r','u','e',0};
+ static WCHAR str_true_case[] = {'t','R','U','e',0};
+ static WCHAR str_false[] = {'f','a','l','s','e',0};
+ static WCHAR str_true_space[] = {'t','r','u','e',' ',0};
+ static WCHAR str_yes[] = {'y','e','s',0};
+ static CHAR str_true_ansi[] = {'t','R','U','e',0};
+ static CHAR str_false_ansi[] = {'f','A','L','S','e',0};
+ static CHAR str_1_ansi[] = {'1',0};
+
+ /* test booleans */
+
+ propvar.vt = VT_BOOL;
+ propvar.u.boolVal = VARIANT_FALSE;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_BOOL;
+ propvar.u.boolVal = TRUE;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_BOOL;
+ propvar.u.boolVal = VARIANT_TRUE;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ /* test empty */
+
+ propvar.vt = VT_EMPTY;
+ propvar.u.boolVal = VARIANT_TRUE;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+ ok(propvar.vt == VT_EMPTY, "got wrong type %d\n", propvar.vt);
+
+ /* test integer conversion */
+
+ propvar.vt = VT_I4;
+ propvar.u.lVal = 0;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+ ok(propvar.vt == VT_I4, "got wrong type %d\n", propvar.vt);
+
+ propvar.vt = VT_I4;
+ propvar.u.lVal = 1;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+ ok(propvar.vt == VT_I4, "got wrong type %d\n", propvar.vt);
+
+ propvar.vt = VT_I4;
+ propvar.u.lVal = 67;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+ ok(propvar.vt == VT_I4, "got wrong type %d\n", propvar.vt);
+
+ /* test string conversion */
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_0;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_1;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_7;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_true;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_true_case;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_false;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_true_space;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == DISP_E_TYPEMISMATCH, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = str_yes;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == DISP_E_TYPEMISMATCH, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPWSTR;
+ propvar.u.pwszVal = NULL;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == DISP_E_TYPEMISMATCH, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ /* test ansi string conversion */
+
+ propvar.vt = VT_LPSTR;
+ propvar.u.pszVal = str_true_ansi;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPSTR;
+ propvar.u.pszVal = str_false_ansi;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == FALSE, "got wrong value %d\n", val);
+
+ propvar.vt = VT_LPSTR;
+ propvar.u.pszVal = str_1_ansi;
+ hr = PropVariantToBoolean(&propvar, &val);
+ ok(hr == S_OK, "hr=%x\n", hr);
+ ok(val == TRUE, "got wrong value %d\n", val);
+}
+
static void test_PropVariantChangeType_LPWSTR(void)
{
PROPVARIANT dest, src;
@@ -931,4 +1077,5 @@ START_TEST(propsys)
test_PropVariantCompare();
test_intconversions();
test_PropVariantChangeType_LPWSTR();
+ test_PropVariantToBoolean();
}
diff --git a/include/propvarutil.h b/include/propvarutil.h
index d0aecdb872..4dc3521a02 100644
--- a/include/propvarutil.h
+++ b/include/propvarutil.h
@@ -76,6 +76,7 @@ HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret);
HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret);
HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret);
HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret);
+HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret);
HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);
--
2.14.1
More information about the wine-patches
mailing list