From: Aric Stewart Subject: [13/14]hid: Implement HidP_MaxUsageListLength Message-Id: <558C1B4C.7050100@codeweavers.com> Date: Thu, 25 Jun 2015 10:16:28 -0500 --- dlls/hid/hid.spec | 2 +- dlls/hid/hidp.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ include/ddk/hidpi.h | 2 +- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec index 2dad3c7..8772a35 100644 --- a/dlls/hid/hid.spec +++ b/dlls/hid/hid.spec @@ -33,7 +33,7 @@ @ stdcall HidP_GetValueCaps(long ptr ptr ptr) @ stdcall HidP_InitializeReportForID(long long ptr ptr long) @ stub HidP_MaxDataListLength -@ stub HidP_MaxUsageListLength +@ stdcall HidP_MaxUsageListLength(long long ptr) @ stub HidP_SetData @ stub HidP_SetScaledUsageValue @ stub HidP_SetUsageValue diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c index 4bf63e7..7adc3e5 100644 --- a/dlls/hid/hidp.c +++ b/dlls/hid/hidp.c @@ -411,3 +411,56 @@ NTSTATUS WINAPI HidP_InitializeReportForID(HIDP_REPORT_TYPE ReportType, UCHAR Re return HIDP_STATUS_SUCCESS; } + +ULONG WINAPI HidP_MaxUsageListLength(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, PHIDP_PREPARSED_DATA PreparsedData) +{ + PWINE_HIDP_PREPARSED_DATA data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData; + 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); + r_count = data->dwInputReportCount; + break; + case HidP_Output: + report = HID_OUTPUT_REPORTS(data); + r_count = data->dwOutputReportCount; + break; + case HidP_Feature: + report = HID_FEATURE_REPORTS(data); + r_count = data->dwFeatureReportCount; + break; + default: + return HIDP_STATUS_INVALID_REPORT_TYPE; + } + + if (!r_count || !report) + return 0; + + for (i = 0; i < r_count; i++) + { + int j; + for (j = 0; j < report->elementCount; j++) + { + if (report->Elements[j].caps.button.UsagePage == UsagePage) + { + if (report->Elements[j].caps.button.IsRange) + count += (report->Elements[j].caps.button.Range.UsageMax - + report->Elements[j].caps.button.Range.UsageMin) + 1; + else + count++; + } + } + report = HID_NEXT_REPORT(data, report); + } + return count; +} diff --git a/include/ddk/hidpi.h b/include/ddk/hidpi.h index e31aebb..4210820 100644 --- a/include/ddk/hidpi.h +++ b/include/ddk/hidpi.h @@ -142,7 +142,7 @@ NTSTATUS WINAPI HidP_GetUsages(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USH NTSTATUS WINAPI HidP_GetUsageValue(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection, USAGE Usage, PULONG UsageValue, PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report, ULONG ReportLength); NTSTATUS WINAPI HidP_GetValueCaps(HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps, PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData); NTSTATUS WINAPI HidP_InitializeReportForID(HIDP_REPORT_TYPE ReportType, UCHAR ReportID, PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report, ULONG ReportLength); - +ULONG WINAPI HidP_MaxUsageListLength(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, PHIDP_PREPARSED_DATA PreparsedData); #ifndef FACILITY_HID_ERROR_CODE #define FACILITY_HID_ERROR_CODE 0x11