Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2022
- 87 participants
- 3124 messages
[PATCH v4 2/2] propsys/tests: Add VariantToStringWithDefault tests.
by Mohamad Al-Jaf
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
v2: - Add some more tests to see what variants are supported.
- Test for BYREF.
- Test nested BSTR and BYREF.
v3: - Add test for NULL default_value (Thanks Nikolay).
- Test returned pointer value with BSTR.
v4: - Add some more tests for NULL default_value.
---
dlls/propsys/tests/propsys.c | 197 +++++++++++++++++++++++++++++++++++
1 file changed, 197 insertions(+)
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c
index 124b3405bcb..27d80d41ae9 100644
--- a/dlls/propsys/tests/propsys.c
+++ b/dlls/propsys/tests/propsys.c
@@ -2064,6 +2064,202 @@ static void test_InitVariantFromFileTime(void)
ok(V_DATE(&var) == d, "got wrong value: %f, expected %f\n", V_DATE(&var), d);
}
+static void test_VariantToStringWithDefault(void)
+{
+ static WCHAR default_value[] = {'t', 'e', 's', 't', '\0'};
+ static WCHAR wstr_test[] = {'t', 'e', 's', 't', '1', '\0'};
+ static WCHAR wstr_empty[] = {'\0'};
+ static WCHAR wstr_space[] = {' ', '\0'};
+ PCWSTR result;
+ VARIANT var, nes;
+ BSTR b;
+
+ V_VT(&var) = VT_EMPTY;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_NULL;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BOOL;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ V_BOOL(&var) = VARIANT_TRUE;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_CY;
+ V_CY(&var).int64 = 100000;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_DATE;
+ V_DATE(&var) = 42.0;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BYREF;
+ V_BYREF(&var) = &wstr_test;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_ERROR;
+ V_ERROR(&var) = DISP_E_PARAMNOTFOUND;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = 15;
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_I1;
+ V_I1(&var) = 't';
+ result = VariantToStringWithDefault(&var, NULL);
+ ok(result == NULL, "Unexpected value %s\n", wine_dbgstr_w(result));
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ /* V_BSTR */
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = NULL;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result[0] == '\0', "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(wstr_empty);
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&var), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&var));
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(wstr_space);
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&var), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&var));
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(wstr_test);
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&var), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&var));
+
+ /* V_BSTRREF */
+
+ V_VT(&var) = VT_BYREF | VT_BSTR;
+ b = NULL;
+ V_BSTRREF(&var) = &b;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result[0] == '\0', "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_empty);
+ V_BSTRREF(&var) = &b;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+
+ V_VT(&var) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_space);
+ V_BSTRREF(&var) = &b;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+
+ V_VT(&var) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_test);
+ V_BSTRREF(&var) = &b;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+
+ /* Nested V_BSTR */
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BSTR;
+ V_BSTR(&nes) = NULL;
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result[0] == '\0', "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BSTR;
+ V_BSTR(&nes) = SysAllocString(wstr_empty);
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&nes), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&nes));
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BSTR;
+ V_BSTR(&nes) = SysAllocString(wstr_space);
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&nes), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&nes));
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BSTR;
+ V_BSTR(&nes) = SysAllocString(wstr_test);
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == V_BSTR(&nes), "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(V_BSTR(&nes));
+
+ /* Nested V_BSTRREF */
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BYREF | VT_BSTR;
+ b = NULL;
+ V_BSTRREF(&nes) = &b;
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result[0] == '\0', "Unexpected value %s\n", wine_dbgstr_w(result));
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_empty);
+ V_BSTRREF(&nes) = &b;
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_space);
+ V_BSTRREF(&nes) = &b;
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+
+ V_VT(&var) = VT_BYREF | VT_VARIANT;
+ V_VT(&nes) = VT_BYREF | VT_BSTR;
+ b = SysAllocString(wstr_test);
+ V_BSTRREF(&nes) = &b;
+ V_VARIANTREF(&var) = &nes;
+ result = VariantToStringWithDefault(&var, default_value);
+ ok(result == b, "Unexpected value %s\n", wine_dbgstr_w(result));
+ SysFreeString(b);
+}
+
START_TEST(propsys)
{
test_PSStringFromPropertyKey();
@@ -2088,4 +2284,5 @@ START_TEST(propsys)
test_propertystore();
test_PSCreatePropertyStoreFromObject();
test_InitVariantFromFileTime();
+ test_VariantToStringWithDefault();
}
--
2.35.1
April 1, 2022
[PATCH v4 1/2] propsys: Implement VariantToStringWithDefault.
by Mohamad Al-Jaf
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
v2: - Support byref BSTR.
- Support nested VARIANT including byref BSTR.
v3: - Consolidate code.
v4: - Retrieve string as BSTR.
---
dlls/propsys/propsys.spec | 2 +-
dlls/propsys/propvar.c | 22 ++++++++++++++++++++++
include/propvarutil.h | 6 ++++++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec
index 15749952e95..7391cf4aaa2 100644
--- a/dlls/propsys/propsys.spec
+++ b/dlls/propsys/propsys.spec
@@ -194,7 +194,7 @@
@ stub VariantToStringAlloc
@ stub VariantToStringArray
@ stub VariantToStringArrayAlloc
-@ stub VariantToStringWithDefault
+@ stdcall VariantToStringWithDefault(ptr wstr)
@ stub VariantToUInt16
@ stub VariantToUInt16Array
@ stub VariantToUInt16ArrayAlloc
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c
index 8f6c52f7aa7..046063dd183 100644
--- a/dlls/propsys/propvar.c
+++ b/dlls/propsys/propvar.c
@@ -416,6 +416,28 @@ PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR p
return pszDefault;
}
+/******************************************************************
+ * VariantToStringWithDefault (PROPSYS.@)
+ */
+PCWSTR WINAPI VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault)
+{
+ VARIANT var = *pvar;
+
+ TRACE("(%p, %s)\n", pvar, debugstr_w(pszDefault));
+
+ if (V_VT(&var) == (VT_BYREF | VT_VARIANT)) var = *V_VARIANTREF(pvar);
+ if (V_VT(&var) == (VT_BYREF | VT_BSTR) || V_VT(&var) == VT_BSTR)
+ {
+ BSTR ret;
+ ret = V_ISBYREF(&var) ? *V_BSTRREF(&var) : V_BSTR(&var);
+
+ if (!ret) return L"";
+ return ret;
+ }
+
+ return pszDefault;
+}
+
/******************************************************************
* PropVariantChangeType (PROPSYS.@)
diff --git a/include/propvarutil.h b/include/propvarutil.h
index 36a670f56e6..2515d71b3b6 100644
--- a/include/propvarutil.h
+++ b/include/propvarutil.h
@@ -93,6 +93,7 @@ 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);
+PCWSTR WINAPI VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault);
HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);
@@ -201,6 +202,11 @@ inline BOOL IsPropVariantString(REFPROPVARIANT propvar)
return (PropVariantToStringWithDefault(propvar, NULL) != NULL);
}
+inline BOOL IsVariantString(const VARIANT *pvar)
+{
+ return (VariantToStringWithDefault(pvar, NULL) != NULL);
+}
+
#endif /* NO_PROPVAR_INLINES */
#endif /* __cplusplus */
--
2.35.1
April 1, 2022
[PATCH 2/2] dinput/tests: Add some HidD_GetMsGenreDescriptor tests.
by Mohamad Al-Jaf
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
dlls/dinput/tests/driver_bus.c | 5 +++++
dlls/dinput/tests/hid.c | 5 +++++
2 files changed, 10 insertions(+)
diff --git a/dlls/dinput/tests/driver_bus.c b/dlls/dinput/tests/driver_bus.c
index 6d7f86d0691..5a675bb99b0 100644
--- a/dlls/dinput/tests/driver_bus.c
+++ b/dlls/dinput/tests/driver_bus.c
@@ -1156,6 +1156,11 @@ static NTSTATUS WINAPI pdo_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
status = STATUS_SUCCESS;
break;
+ case IOCTL_HID_GET_MS_GENRE_DESCRIPTOR:
+ irp->IoStatus.Information = 0;
+ status = STATUS_NOT_SUPPORTED;
+ break;
+
case IOCTL_GET_PHYSICAL_DESCRIPTOR:
irp->IoStatus.Information = 0;
status = STATUS_NOT_SUPPORTED;
diff --git a/dlls/dinput/tests/hid.c b/dlls/dinput/tests/hid.c
index 1059d6c2b57..cbf5de819af 100644
--- a/dlls/dinput/tests/hid.c
+++ b/dlls/dinput/tests/hid.c
@@ -1545,6 +1545,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
USHORT count;
BOOL ret;
+ SetLastError( 0xdeadbeef );
+ ret = HidD_GetMsGenreDescriptor( file, buffer, sizeof(buffer) );
+ ok( !ret, "HidD_GetMsGenreDescriptor succeeded\n" );
+ ok( GetLastError() == ERROR_NOT_SUPPORTED, "got error %lu\n", GetLastError() );
+
SetLastError( 0xdeadbeef );
ret = HidD_GetPhysicalDescriptor( file, buffer, sizeof(buffer) );
ok( !ret, "HidD_GetPhysicalDescriptor succeeded\n" );
--
2.35.1
April 1, 2022
[PATCH 1/2] hid: Implement HidD_GetMsGenreDescriptor.
by Mohamad Al-Jaf
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
dlls/hid/hid.spec | 2 +-
dlls/hid/hidd.c | 6 ++++++
include/ddk/hidsdi.h | 1 +
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec
index 67c4473129d..59d6317c666 100644
--- a/dlls/hid/hid.spec
+++ b/dlls/hid/hid.spec
@@ -7,7 +7,7 @@
@ stdcall HidD_GetIndexedString(ptr long ptr long)
@ stdcall HidD_GetInputReport(long ptr long)
@ stdcall HidD_GetManufacturerString(long ptr long)
-@ stub HidD_GetMsGenreDescriptor
+@ stdcall HidD_GetMsGenreDescriptor(long ptr long)
@ stdcall HidD_GetNumInputBuffers(long ptr)
@ stdcall HidD_GetPhysicalDescriptor(long ptr long)
@ stdcall HidD_GetPreparsedData(ptr ptr)
diff --git a/dlls/hid/hidd.c b/dlls/hid/hidd.c
index e01ab2a35e7..cf694644008 100644
--- a/dlls/hid/hidd.c
+++ b/dlls/hid/hidd.c
@@ -103,6 +103,12 @@ BOOLEAN WINAPI HidD_GetManufacturerString( HANDLE file, void *buffer, ULONG buff
return sync_ioctl( file, IOCTL_HID_GET_MANUFACTURER_STRING, NULL, 0, buffer, buffer_len );
}
+BOOLEAN WINAPI HidD_GetMsGenreDescriptor( HANDLE file, void *buffer, ULONG buffer_len )
+{
+ TRACE( "file %p, buffer %p, buffer_len %lu.\n", file, buffer, buffer_len );
+ return sync_ioctl( file, IOCTL_HID_GET_MS_GENRE_DESCRIPTOR, NULL, 0, buffer, buffer_len );
+}
+
BOOLEAN WINAPI HidD_GetNumInputBuffers( HANDLE file, ULONG *num_buffer )
{
TRACE( "file %p, num_buffer %p.\n", file, num_buffer );
diff --git a/include/ddk/hidsdi.h b/include/ddk/hidsdi.h
index 72470079a79..6f19ced3331 100644
--- a/include/ddk/hidsdi.h
+++ b/include/ddk/hidsdi.h
@@ -40,6 +40,7 @@ void WINAPI HidD_GetHidGuid(LPGUID guid);
BOOLEAN WINAPI HidD_GetIndexedString(HANDLE file, ULONG index, void *buffer, ULONG length);
BOOLEAN WINAPI HidD_GetInputReport(HANDLE HidDeviceObject, PVOID ReportBuffer, ULONG ReportBufferLength);
BOOLEAN WINAPI HidD_GetManufacturerString(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength);
+BOOLEAN WINAPI HidD_GetMsGenreDescriptor(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength);
BOOLEAN WINAPI HidD_GetNumInputBuffers(HANDLE HidDeviceObject, ULONG *NumberBuffers);
BOOLEAN WINAPI HidD_GetPhysicalDescriptor(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength);
BOOLEAN WINAPI HidD_GetProductString(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength);
--
2.35.1
April 1, 2022