From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 32 +++++++++++++++++++++++++++++ dlls/propsys/tests/propsys.c | 39 ++++++++++++++++++++++++++++++++---- include/propvarutil.h | 1 + 4 files changed, 69 insertions(+), 5 deletions(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index 7391cf4aaa2..cf7a4c299f4 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -41,7 +41,7 @@ @ stub InitPropVariantFromResource @ stub InitPropVariantFromStrRet @ stub InitPropVariantFromStringAsVector -@ stub InitPropVariantFromStringVector +@ stdcall InitPropVariantFromStringVector(ptr long ptr) @ stub InitPropVariantFromUInt16Vector @ stub InitPropVariantFromUInt32Vector @ stub InitPropVariantFromUInt64Vector diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index cd92912fde5..86670a51adf 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -657,6 +657,38 @@ HRESULT WINAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar) return S_OK; }
+HRESULT WINAPI InitPropVariantFromStringVector(PCWSTR *strs, ULONG count, PROPVARIANT *ppropvar) +{ + unsigned int i; + + TRACE("(%p %lu %p)\n", strs, count, ppropvar); + + ppropvar->calpwstr.pElems = CoTaskMemAlloc(count * sizeof(*ppropvar->calpwstr.pElems)); + if(!ppropvar->calpwstr.pElems) + return E_OUTOFMEMORY; + + ppropvar->vt = VT_LPWSTR | VT_VECTOR; + ppropvar->calpwstr.cElems = 0; + if (count) + memset(ppropvar->calpwstr.pElems, 0, count * sizeof(*ppropvar->calpwstr.pElems)); + + for (i = 0; i < count; ++i) + { + if (strs[i]) + { + if (!(ppropvar->calpwstr.pElems[i] = CoTaskMemAlloc((wcslen(strs[i]) + 1)*sizeof(**strs)))) + { + PropVariantClear(ppropvar); + return E_OUTOFMEMORY; + } + } + wcscpy(ppropvar->calpwstr.pElems[i], strs[i]); + ppropvar->calpwstr.cElems++; + } + + return S_OK; +} + HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar) { SAFEARRAY *arr; diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 47a7930a18b..fb9decd7ab0 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1419,6 +1419,35 @@ static void test_InitPropVariantFromCLSID(void) PropVariantClear(&propvar); }
+static void test_InitPropVariantFromStringVector(void) +{ + static const WCHAR *strs[2] = { L"abc", L"def" }; + PROPVARIANT propvar; + HRESULT hr; + + memset(&propvar, 0, sizeof(propvar)); + propvar.vt = VT_I4; + propvar.lVal = 15; + + hr = InitPropVariantFromStringVector(NULL, 0, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(propvar.vt == (VT_LPWSTR|VT_VECTOR), "Unexpected type %#x.\n", propvar.vt); + ok(!propvar.calpwstr.cElems, "Unexpected number of elements.\n"); + ok(!!propvar.calpwstr.pElems, "Unexpected vector pointer.\n"); + PropVariantClear(&propvar); + + hr = InitPropVariantFromStringVector(strs, 2, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(propvar.vt == (VT_LPWSTR|VT_VECTOR), "Unexpected type %#x.\n", propvar.vt); + ok(propvar.calpwstr.cElems == 2, "Unexpected number of elements.\n"); + ok(!!propvar.calpwstr.pElems, "Unexpected vector pointer.\n"); + ok(propvar.calpwstr.pElems[0] != strs[0], "Unexpected string pointer.\n"); + ok(!wcscmp(propvar.calpwstr.pElems[0], strs[0]), "Unexpected string %s.\n", debugstr_w(propvar.calpwstr.pElems[0])); + ok(propvar.calpwstr.pElems[1] != strs[1], "Unexpected string pointer.\n"); + ok(!wcscmp(propvar.calpwstr.pElems[1], strs[1]), "Unexpected string %s.\n", debugstr_w(propvar.calpwstr.pElems[1])); + PropVariantClear(&propvar); +} + static void test_PropVariantToDouble(void) { PROPVARIANT propvar; @@ -2252,11 +2281,15 @@ static void test_VariantToStringWithDefault(void)
START_TEST(propsys) { + test_InitPropVariantFromGUIDAsString(); + test_InitPropVariantFromBuffer(); + test_InitPropVariantFromCLSID(); + test_InitPropVariantFromStringVector(); + test_InitVariantFromFileTime(); + test_PSStringFromPropertyKey(); test_PSPropertyKeyFromString(); test_PSRefreshPropertySchema(); - test_InitPropVariantFromGUIDAsString(); - test_InitPropVariantFromBuffer(); test_PropVariantToGUID(); test_PropVariantToStringAlloc(); test_PropVariantCompareEx(); @@ -2264,7 +2297,6 @@ START_TEST(propsys) test_PropVariantChangeType_LPWSTR(); test_PropVariantToBoolean(); test_PropVariantToStringWithDefault(); - test_InitPropVariantFromCLSID(); test_PropVariantToDouble(); test_PropVariantToString(); test_PropVariantToBuffer(); @@ -2273,6 +2305,5 @@ START_TEST(propsys) test_PSCreateMemoryPropertyStore(); test_propertystore(); test_PSCreatePropertyStoreFromObject(); - test_InitVariantFromFileTime(); test_VariantToStringWithDefault(); } diff --git a/include/propvarutil.h b/include/propvarutil.h index b82c3d90274..575c498b230 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -81,6 +81,7 @@ HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid); INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags); HRESULT WINAPI InitPropVariantFromFileTime(const FILETIME *pftIn, PROPVARIANT *ppropvar); +HRESULT WINAPI InitPropVariantFromStringVector(PCWSTR *strs, ULONG count, PROPVARIANT *ppropvar);
HRESULT WINAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret); HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=128801
Your paranoid android.
=== debian11 (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1715: Test succeeded inside todo block: got error 997