diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index 86a5e696eb5..f5185192761 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -137,7 +137,7 @@ @ stdcall PropVariantToStringAlloc(ptr ptr) @ stub PropVariantToStringVector @ stub PropVariantToStringVectorAlloc -@ stub PropVariantToStringWithDefault +@ stdcall PropVariantToStringWithDefault(ptr wstr) @ stdcall PropVariantToUInt16(ptr ptr) @ stub PropVariantToUInt16Vector @ stub PropVariantToUInt16VectorAlloc diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index 3e3b5026753..e6d4eba57c8 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -337,6 +337,24 @@ HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret) return hr; } +PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault) +{ + static const WCHAR str_empty[] = {0}; + if (propvarIn->vt == VT_BSTR) + { + if (propvarIn->u.bstrVal == NULL) + return str_empty; + + return propvarIn->u.bstrVal; + } + + if (propvarIn->vt == VT_LPWSTR && propvarIn->u.pwszVal != NULL) + return propvarIn->u.pwszVal; + + return pszDefault; +} + + /****************************************************************** * PropVariantChangeType (PROPSYS.@) */ diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 327c606b338..a6c70235274 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1094,6 +1094,106 @@ static void test_PropVariantToBoolean(void) ok(val == TRUE, "Unexpected value %d\n", val); } +static void test_PropVariantToStringWithDefault(void) +{ + PROPVARIANT propvar; + static WCHAR default_value[] = {'t', 'e', 's', 't', 0}; + static WCHAR wstr_test2[] = {'t', 'e', 's', 't', '2', 0}; + static WCHAR wstr_empty[] = {0}; + static WCHAR wstr_space[] = {' ', 0}; + static CHAR str_test2[] = "test2"; + static CHAR str_empty[] = ""; + static CHAR str_space[] = " "; + LPCWSTR result; + + propvar.vt = VT_EMPTY; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_NULL; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_BOOL; + propvar.u.boolVal = VARIANT_TRUE; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_I4; + propvar.u.lVal = 15; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + /* VT_LPWSTR */ + + propvar.vt = VT_LPWSTR; + propvar.u.pwszVal = NULL; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPWSTR; + propvar.u.pwszVal = wstr_empty; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == wstr_empty, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPWSTR; + propvar.u.pwszVal = wstr_space; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == wstr_space, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPWSTR; + propvar.u.pwszVal = wstr_test2; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == wstr_test2, "Unexpected value %s\n", wine_dbgstr_w(result)); + + /* VT_LPSTR */ + + propvar.vt = VT_LPSTR; + propvar.u.pszVal = NULL; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPSTR; + propvar.u.pszVal = str_empty; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPSTR; + propvar.u.pszVal = str_space; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_LPSTR; + propvar.u.pszVal = str_test2; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result)); + + /* VT_BSTR */ + + propvar.vt = VT_BSTR; + propvar.u.bstrVal = NULL; + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(!lstrcmpW(result, wstr_empty), "Unexpected value %s\n", wine_dbgstr_w(result)); + + propvar.vt = VT_BSTR; + propvar.u.bstrVal = SysAllocString(wstr_empty); + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(!lstrcmpW(result, wstr_empty), "Unexpected value %s\n", wine_dbgstr_w(result)); + SysFreeString(propvar.u.bstrVal); + + propvar.vt = VT_BSTR; + propvar.u.bstrVal = SysAllocString(wstr_space); + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(!lstrcmpW(result, wstr_space), "Unexpected value %s\n", wine_dbgstr_w(result)); + SysFreeString(propvar.u.bstrVal); + + propvar.vt = VT_BSTR; + propvar.u.bstrVal = SysAllocString(wstr_test2); + result = PropVariantToStringWithDefault(&propvar, default_value); + ok(!lstrcmpW(result, wstr_test2), "Unexpected value %s\n", wine_dbgstr_w(result)); + SysFreeString(propvar.u.bstrVal); +} + static void test_PropVariantChangeType_LPWSTR(void) { PROPVARIANT dest, src; @@ -1143,4 +1243,5 @@ START_TEST(propsys) test_intconversions(); test_PropVariantChangeType_LPWSTR(); test_PropVariantToBoolean(); + test_PropVariantToStringWithDefault(); } diff --git a/include/propvarutil.h b/include/propvarutil.h index 4dc3521a02c..ced51ec295f 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -77,6 +77,7 @@ 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); +PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault); HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);