[PATCH 2/5] hid: Rewrite HidP_MaxUsageListLength using enum_value_caps.

Rémi Bernon rbernon at codeweavers.com
Thu Jun 24 03:05:56 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/hid/hidp.c                    | 58 +++++++-----------------------
 dlls/ntoskrnl.exe/tests/ntoskrnl.c |  4 ---
 2 files changed, 12 insertions(+), 50 deletions(-)

diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
index c11a5d66985..76b9ff5ee2c 100644
--- a/dlls/hid/hidp.c
+++ b/dlls/hid/hidp.c
@@ -524,56 +524,22 @@ NTSTATUS WINAPI HidP_InitializeReportForID( HIDP_REPORT_TYPE report_type, UCHAR
     return HIDP_STATUS_SUCCESS;
 }
 
-ULONG WINAPI HidP_MaxUsageListLength(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, PHIDP_PREPARSED_DATA PreparsedData)
+static NTSTATUS get_usage_list_length( const struct hid_value_caps *caps, void *data )
 {
-    PWINE_HIDP_PREPARSED_DATA data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData;
-    WINE_HID_ELEMENT *elems = HID_ELEMS(data);
-    WINE_HID_REPORT *report = NULL;
-    int r_count;
-    int i;
-    int count = 0;
-
-    TRACE("(%i, %x, %p)\n", ReportType, UsagePage, PreparsedData);
-
-    if (data->magic != HID_MAGIC)
-        return 0;
-
-    switch(ReportType)
-    {
-        case HidP_Input:
-            report = HID_INPUT_REPORTS(data);
-            break;
-        case HidP_Output:
-            report = HID_OUTPUT_REPORTS(data);
-            break;
-        case HidP_Feature:
-            report = HID_FEATURE_REPORTS(data);
-            break;
-        default:
-            return HIDP_STATUS_INVALID_REPORT_TYPE;
-    }
-    r_count = data->reportCount[ReportType];
+    *(ULONG *)data += caps->report_count;
+    return HIDP_STATUS_SUCCESS;
+}
 
+ULONG WINAPI HidP_MaxUsageListLength( HIDP_REPORT_TYPE report_type, USAGE usage_page, PHIDP_PREPARSED_DATA preparsed_data )
+{
+    WINE_HIDP_PREPARSED_DATA *preparsed = (WINE_HIDP_PREPARSED_DATA *)preparsed_data;
+    struct caps_filter filter = {.buttons = TRUE, .usage_page = usage_page};
+    USHORT limit = -1;
+    ULONG count = 0;
 
-    if (!r_count)
-        return 0;
+    TRACE( "report_type %d, usage_page %x, preparsed_data %p.\n", report_type, usage_page, preparsed_data );
 
-    for (i = 0; i < r_count; i++)
-    {
-        int j;
-        for (j = 0; j < report[i].elementCount; j++)
-        {
-            if (elems[report[i].elementIdx + j].caps.BitSize == 1 &&
-               (UsagePage == 0 || elems[report[i].elementIdx + j].caps.UsagePage == UsagePage))
-            {
-                if (elems[report[i].elementIdx + j].caps.IsRange)
-                    count += (elems[report[i].elementIdx + j].caps.Range.UsageMax -
-                             elems[report[i].elementIdx + j].caps.Range.UsageMin) + 1;
-                else
-                    count++;
-            }
-        }
-    }
+    enum_value_caps( preparsed, report_type, &filter, get_usage_list_length, &count, &limit );
     return count;
 }
 
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index 3ce750728ec..8777880fd9d 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -2140,18 +2140,14 @@ static void test_hidp(HANDLE file, int report_id)
     ok(value == 0, "got value %x, expected %#x\n", value, 0);
 
     value = HidP_MaxUsageListLength(HidP_Feature + 1, 0, preparsed_data);
-    todo_wine
     ok(value == 0, "HidP_MaxUsageListLength(HidP_Feature + 1, 0) returned %d, expected %d\n", value, 0);
     value = HidP_MaxUsageListLength(HidP_Input, 0, preparsed_data);
-    todo_wine
     ok(value == 42, "HidP_MaxUsageListLength(HidP_Input, 0) returned %d, expected %d\n", value, 42);
     value = HidP_MaxUsageListLength(HidP_Input, HID_USAGE_PAGE_BUTTON, preparsed_data);
-    todo_wine
     ok(value == 32, "HidP_MaxUsageListLength(HidP_Input, HID_USAGE_PAGE_BUTTON) returned %d, expected %d\n", value, 32);
     value = HidP_MaxUsageListLength(HidP_Input, HID_USAGE_PAGE_LED, preparsed_data);
     ok(value == 8, "HidP_MaxUsageListLength(HidP_Input, HID_USAGE_PAGE_LED) returned %d, expected %d\n", value, 8);
     value = HidP_MaxUsageListLength(HidP_Feature, HID_USAGE_PAGE_BUTTON, preparsed_data);
-    todo_wine
     ok(value == 8, "HidP_MaxUsageListLength(HidP_Feature, HID_USAGE_PAGE_BUTTON) returned %d, expected %d\n", value, 8);
     value = HidP_MaxUsageListLength(HidP_Feature, HID_USAGE_PAGE_LED, preparsed_data);
     ok(value == 0, "HidP_MaxUsageListLength(HidP_Feature, HID_USAGE_PAGE_LED) returned %d, expected %d\n", value, 0);
-- 
2.32.0




More information about the wine-devel mailing list