Commit 50a4c464 authored by Jactry Zeng's avatar Jactry Zeng Committed by Alexandre Julliard

propsys: Partially implement PropVariantToBuffer().

parent 6d2c277a
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
@ stub PropVariantToBooleanVector @ stub PropVariantToBooleanVector
@ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanVectorAlloc
@ stub PropVariantToBooleanWithDefault @ stub PropVariantToBooleanWithDefault
@ stub PropVariantToBuffer @ stdcall PropVariantToBuffer(ptr ptr long)
@ stdcall PropVariantToDouble(ptr ptr) @ stdcall PropVariantToDouble(ptr ptr)
@ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVector
@ stub PropVariantToDoubleVectorAlloc @ stub PropVariantToDoubleVectorAlloc
......
...@@ -306,6 +306,32 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) ...@@ -306,6 +306,32 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret)
return hr; return hr;
} }
HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb)
{
HRESULT hr = S_OK;
TRACE("(%p, %p, %d)\n", propvarIn, ret, cb);
switch(propvarIn->vt)
{
case VT_VECTOR|VT_UI1:
if(cb > propvarIn->u.caub.cElems)
return E_FAIL;
memcpy(ret, propvarIn->u.caub.pElems, cb);
break;
case VT_ARRAY|VT_UI1:
FIXME("Unsupported type: VT_ARRAY|VT_UI1\n");
hr = E_NOTIMPL;
break;
default:
WARN("Unexpected type: %x\n", propvarIn->vt);
hr = E_INVALIDARG;
}
return hr;
}
HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch) HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch)
{ {
HRESULT hr; HRESULT hr;
......
...@@ -1407,6 +1407,111 @@ static void test_PropVariantToString(void) ...@@ -1407,6 +1407,111 @@ static void test_PropVariantToString(void)
SysFreeString(propvar.u.bstrVal); 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};
INT8 data_int8[] = {1,2,3,4,5,6,7,8,9,10};
SAFEARRAY *sa;
SAFEARRAYBOUND sabound;
void *pdata;
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 failed: 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 failed: 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);
buffer[0] = 99;
hr = PropVariantToBuffer(&propvar, buffer, 11);
ok(hr == E_FAIL, "PropVariantToBuffer returned: 0x%08x.\n", hr);
ok(buffer[0] == 99, "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 failed: 0x%08x.\n", hr);
ok(!memcmp(buffer, data, 9) && !buffer[9], "got wrong buffer.\n");
memset(buffer, 0, sizeof(buffer));
PropVariantClear(&propvar);
PropVariantInit(&propvar);
propvar.vt = VT_ARRAY|VT_UI1;
sabound.lLbound = 0;
sabound.cElements = sizeof(data);
sa = NULL;
sa = SafeArrayCreate(VT_UI1, 1, &sabound);
ok(sa != NULL, "SafeArrayCreate failed.\n");
hr = SafeArrayAccessData(sa, &pdata);
ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
memcpy(pdata, data, sizeof(data));
U(propvar).parray = sa;
buffer[0] = 99;
hr = PropVariantToBuffer(&propvar, buffer, 11);
todo_wine ok(hr == E_FAIL, "PropVariantToBuffer returned: 0x%08x.\n", hr);
ok(buffer[0] == 99, "got wrong buffer.\n");
memset(buffer, 0, sizeof(buffer));
SafeArrayDestroy(sa);
PropVariantClear(&propvar);
PropVariantInit(&propvar);
propvar.vt = VT_ARRAY|VT_UI1;
sabound.lLbound = 0;
sabound.cElements = sizeof(data);
sa = NULL;
sa = SafeArrayCreate(VT_UI1, 1, &sabound);
ok(sa != NULL, "SafeArrayCreate failed.\n");
hr = SafeArrayAccessData(sa, &pdata);
ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
memcpy(pdata, data, sizeof(data));
U(propvar).parray = sa;
hr = PropVariantToBuffer(&propvar, buffer, sizeof(data));
todo_wine ok(hr == S_OK, "PropVariantToBuffer failed: 0x%08x.\n", hr);
todo_wine ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n");
memset(buffer, 0, sizeof(buffer));
SafeArrayDestroy(sa);
PropVariantClear(&propvar);
PropVariantInit(&propvar);
propvar.vt = VT_VECTOR|VT_I1;
U(propvar).caub.pElems = CoTaskMemAlloc(sizeof(data_int8));
U(propvar).caub.cElems = sizeof(data_int8);
memcpy(U(propvar).caub.pElems, data_int8, sizeof(data_int8));
hr = PropVariantToBuffer(&propvar, buffer, sizeof(data_int8));
ok(hr == E_INVALIDARG, "PropVariantToBuffer failed: 0x%08x.\n", hr);
PropVariantClear(&propvar);
PropVariantInit(&propvar);
propvar.vt = VT_ARRAY|VT_I1;
sabound.lLbound = 0;
sabound.cElements = sizeof(data_int8);
sa = NULL;
sa = SafeArrayCreate(VT_I1, 1, &sabound);
ok(sa != NULL, "SafeArrayCreate failed.\n");
hr = SafeArrayAccessData(sa, &pdata);
ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
memcpy(pdata, data_int8, sizeof(data_int8));
U(propvar).parray = sa;
hr = PropVariantToBuffer(&propvar, buffer, sizeof(data_int8));
ok(hr == E_INVALIDARG, "PropVariantToBuffer failed: 0x%08x.\n", hr);
SafeArrayDestroy(sa);
PropVariantClear(&propvar);
}
START_TEST(propsys) START_TEST(propsys)
{ {
test_PSStringFromPropertyKey(); test_PSStringFromPropertyKey();
...@@ -1424,4 +1529,5 @@ START_TEST(propsys) ...@@ -1424,4 +1529,5 @@ START_TEST(propsys)
test_InitPropVariantFromCLSID(); test_InitPropVariantFromCLSID();
test_PropVariantToDouble(); test_PropVariantToDouble();
test_PropVariantToString(); test_PropVariantToString();
test_PropVariantToBuffer();
} }
...@@ -79,6 +79,7 @@ HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret); ...@@ -79,6 +79,7 @@ HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret);
HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret); HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret);
HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret); HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret);
HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *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); HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch);
PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault); PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment