From: Aric Stewart Subject: [3/11]hid: Implement HidP_GetValueCaps Message-Id: <55928E1B.2010102@codeweavers.com> Date: Tue, 30 Jun 2015 07:39:55 -0500 --- dlls/hid/hid.spec | 2 +- dlls/hid/hidp.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ include/ddk/hidpi.h | 2 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec index 4bd9f4e..214fa9e 100644 --- a/dlls/hid/hid.spec +++ b/dlls/hid/hid.spec @@ -30,7 +30,7 @@ @ stub HidP_GetUsageValueArray @ stub HidP_GetUsages @ stub HidP_GetUsagesEx -@ stub HidP_GetValueCaps +@ stdcall HidP_GetValueCaps(long ptr ptr ptr) @ stub HidP_InitializeReportForID @ stub HidP_MaxDataListLength @ stub HidP_MaxUsageListLength diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c index ce92d3a..ce8f6df 100644 --- a/dlls/hid/hidp.c +++ b/dlls/hid/hidp.c @@ -108,3 +108,60 @@ NTSTATUS WINAPI HidP_GetCaps(PHIDP_PREPARSED_DATA PreparsedData, return HIDP_STATUS_SUCCESS; } + + +NTSTATUS WINAPI HidP_GetValueCaps(HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps, PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData) +{ + PWINE_HIDP_PREPARSED_DATA data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData; + WINE_HID_REPORT *report = NULL; + USHORT v_count = 0, r_count = 0; + int i,j,u; + + TRACE("(%i, %p, %p, %p)\n", ReportType, ValueCaps, ValueCapsLength, PreparsedData); + + if (data->magic != HID_MAGIC) + return HIDP_STATUS_INVALID_PREPARSED_DATA; + + switch(ReportType) + { + case HidP_Input: + v_count = data->caps.NumberInputValueCaps; + r_count = data->dwInputReportCount; + report = HID_INPUT_REPORTS(data); + break; + case HidP_Output: + v_count = data->caps.NumberOutputValueCaps; + r_count = data->dwOutputReportCount; + report = HID_OUTPUT_REPORTS(data); + break; + case HidP_Feature: + v_count = data->caps.NumberFeatureValueCaps; + r_count = data->dwFeatureReportCount; + report = HID_FEATURE_REPORTS(data); + break; + default: + return HIDP_STATUS_INVALID_REPORT_TYPE; + } + + if (!r_count || !v_count || !report) + { + *ValueCapsLength = 0; + return HIDP_STATUS_SUCCESS; + } + + v_count = min(v_count, *ValueCapsLength); + + u = 0; + for (j = 0; j < r_count && u < v_count; j++) + { + for (i = 0; i < report->elementCount && u < v_count; i++) + { + if (report->Elements[i].ElementType == ValueElement) + ValueCaps[u++] = report->Elements[i].caps.value; + } + report = HID_NEXT_REPORT(data, report); + } + + *ValueCapsLength = v_count; + return HIDP_STATUS_SUCCESS; +} diff --git a/include/ddk/hidpi.h b/include/ddk/hidpi.h index 729f2d9..c63d3e3 100644 --- a/include/ddk/hidpi.h +++ b/include/ddk/hidpi.h @@ -138,6 +138,8 @@ typedef struct _HIDP_CAPS NTSTATUS WINAPI HidP_GetButtonCaps(HIDP_REPORT_TYPE ReportType, PHIDP_BUTTON_CAPS ButtonCaps, PUSHORT ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData); NTSTATUS WINAPI HidP_GetCaps(PHIDP_PREPARSED_DATA PreparsedData, PHIDP_CAPS Capabilities); +NTSTATUS WINAPI HidP_GetValueCaps(HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps, PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData); + #ifndef FACILITY_HID_ERROR_CODE #define FACILITY_HID_ERROR_CODE 0x11