Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 13 ++++++++++++ dlls/propsys/tests/propsys.c | 39 ++++++++++++++++++++++++++++++++++++ include/propvarutil.h | 1 + 4 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index d9347e27ae..8416b6dc74 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -111,7 +111,7 @@ @ stub PropVariantToBooleanVector @ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanWithDefault -@ stub PropVariantToBuffer +@ stdcall PropVariantToBuffer(ptr ptr long) @ stdcall PropVariantToDouble(ptr ptr) @ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVectorAlloc diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index 988cf81971..5817d502f3 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -306,6 +306,19 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) return hr; }
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb) +{ + TRACE("(%p, %p, %d)\n", propvarIn, ret, cb); + + if(cb > propvarIn->u.caub.cElems) + return E_FAIL; + + memcpy(ret, propvarIn->u.caub.pElems, cb); + + return S_OK; +} + + HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch) { HRESULT hr; diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 059b622544..1e5e88bc3b 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1407,6 +1407,44 @@ static void test_PropVariantToString(void) SysFreeString(propvar.u.bstrVal); }
+static void test_PropVariantToBuffer(void) +{ + PROPVARIANT propvar; + HRESULT hr; + UINT8 data[] = {1,2,3,4,5,6,7,8,9,10}; + UINT8 buffer[256]; + + hr = InitPropVariantFromBuffer(data, 10, &propvar); + ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr); + hr = PropVariantToBuffer(&propvar, NULL, 0); /* crash when cb isn't zero */ + ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr); + PropVariantClear(&propvar); + + hr = InitPropVariantFromBuffer(data, 10, &propvar); + ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr); + hr = PropVariantToBuffer(&propvar, buffer, 10); + ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr); + ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n"); + memset(buffer, 0, sizeof(buffer)); + PropVariantClear(&propvar); + + hr = InitPropVariantFromBuffer(data, 10, &propvar); + ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr); + hr = PropVariantToBuffer(&propvar, buffer, 11); + ok(hr == E_FAIL, "PropVariantToBuffer fail: 0x%08x.\n", hr); + ok(!buffer[0], "got wrong buffer.\n"); + memset(buffer, 0, sizeof(buffer)); + PropVariantClear(&propvar); + + hr = InitPropVariantFromBuffer(data, 10, &propvar); + ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr); + hr = PropVariantToBuffer(&propvar, buffer, 9); + ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr); + ok(!memcmp(buffer, data, 9) && !buffer[9], "got wrong buffer.\n"); + memset(buffer, 0, sizeof(buffer)); + PropVariantClear(&propvar); +} + START_TEST(propsys) { test_PSStringFromPropertyKey(); @@ -1424,4 +1462,5 @@ START_TEST(propsys) test_InitPropVariantFromCLSID(); test_PropVariantToDouble(); test_PropVariantToString(); + test_PropVariantToBuffer(); } diff --git a/include/propvarutil.h b/include/propvarutil.h index 4fb12d87eb..a4eedefdb6 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -79,6 +79,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); +HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb); HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch); PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
On 2/15/19 11:16 AM, Jactry Zeng wrote:
Signed-off-by: Jactry Zeng jzeng@codeweavers.com
dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 13 ++++++++++++ dlls/propsys/tests/propsys.c | 39 ++++++++++++++++++++++++++++++++++++ include/propvarutil.h | 1 + 4 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index d9347e27ae..8416b6dc74 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -111,7 +111,7 @@ @ stub PropVariantToBooleanVector @ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanWithDefault -@ stub PropVariantToBuffer +@ stdcall PropVariantToBuffer(ptr ptr long) @ stdcall PropVariantToDouble(ptr ptr) @ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVectorAlloc diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index 988cf81971..5817d502f3 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -306,6 +306,19 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) return hr; }
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb) +{
- TRACE("(%p, %p, %d)\n", propvarIn, ret, cb);
- if(cb > propvarIn->u.caub.cElems)
return E_FAIL;
- memcpy(ret, propvarIn->u.caub.pElems, cb);
- return S_OK;
+}
This one should probably check variant type.
- HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch) { HRESULT hr;
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 059b622544..1e5e88bc3b 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1407,6 +1407,44 @@ static void test_PropVariantToString(void) SysFreeString(propvar.u.bstrVal); }
+static void test_PropVariantToBuffer(void) +{
- PROPVARIANT propvar;
- HRESULT hr;
- UINT8 data[] = {1,2,3,4,5,6,7,8,9,10};
- UINT8 buffer[256];
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, NULL, 0); /* crash when cb isn't zero */
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 10);
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 11);
- ok(hr == E_FAIL, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!buffer[0], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 9);
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!memcmp(buffer, data, 9) && !buffer[9], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
+}
- START_TEST(propsys) { test_PSStringFromPropertyKey();
@@ -1424,4 +1462,5 @@ START_TEST(propsys) test_InitPropVariantFromCLSID(); test_PropVariantToDouble(); test_PropVariantToString();
- test_PropVariantToBuffer(); }
diff --git a/include/propvarutil.h b/include/propvarutil.h index 4fb12d87eb..a4eedefdb6 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -79,6 +79,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); +HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb); HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch); PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
Hi Nikolay,
Thanks for review!
On Fri, Feb 15, 2019 at 8:34 AM Nikolay Sivov nsivov@codeweavers.com wrote:
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void
*ret, UINT cb)
+{
- TRACE("(%p, %p, %d)\n", propvarIn, ret, cb);
- if(cb > propvarIn->u.caub.cElems)
return E_FAIL;
- memcpy(ret, propvarIn->u.caub.pElems, cb);
- return S_OK;
+}
This one should probably check variant type.
Well, I've thought about this. From MSDN it said that it only supports VT_VECTOR | VT_UI1 and VT_ARRRAY | VT_UI1. In order to verify this, we will need to test many other types. So it maybe better to just ignore type checking at this point and adding it in the future if a real application requests it?
-- Regards, Jactry Zeng
On 2/15/19 11:57 AM, Jactry Zeng wrote:
Hi Nikolay,
Thanks for review!
On Fri, Feb 15, 2019 at 8:34 AM Nikolay Sivov <nsivov@codeweavers.com mailto:nsivov@codeweavers.com> wrote:
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void
*ret, UINT cb)
+{
- TRACE("(%p, %p, %d)\n", propvarIn, ret, cb);
- if(cb > propvarIn->u.caub.cElems)
- return E_FAIL;
- memcpy(ret, propvarIn->u.caub.pElems, cb);
- return S_OK;
+}
This one should probably check variant type.
Well, I've thought about this. From MSDN it said that it only supports VT_VECTOR | VT_UI1 and VT_ARRRAY | VT_UI1. In order to verify this, we will need to test many other types. So it maybe better to just ignore type checking at this point and adding it in the future if a real application requests it?
For first version you only need to test what's documented, and maybe VT_I1 too, leaving WARN for other types. Right now you're assuming it's a vector, and assuming element size too.
-- Regards, Jactry Zeng