Fabian Maurer : propsys: Add PropVariantToStringWithDefault and tests.

Alexandre Julliard julliard at winehq.org
Sun Mar 3 13:21:25 CST 2019


Module: wine
Branch: oldstable
Commit: 8d1218f37a973f0d60c6f904a027283fe4d1ac23
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8d1218f37a973f0d60c6f904a027283fe4d1ac23

Author: Fabian Maurer <dark.shadow4 at web.de>
Date:   Sat Feb 17 23:33:54 2018 +0100

propsys: Add PropVariantToStringWithDefault and tests.

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 8f1e4097bb62f53dc395718b27eef5f86a4fd8a4)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/propsys/propsys.spec    |   2 +-
 dlls/propsys/propvar.c       |  18 ++++++++
 dlls/propsys/tests/propsys.c | 101 +++++++++++++++++++++++++++++++++++++++++++
 include/propvarutil.h        |   1 +
 4 files changed, 121 insertions(+), 1 deletion(-)

diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec
index 70f1dcc..db20fd3 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 3e3b502..e6d4eba 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 327c606..a6c7023 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 4dc3521..ced51ec 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);
 




More information about the wine-cvs mailing list