[USB-BRINGUP-TRUNK]
[reactos.git] / drivers / hid / hidparse / hidparse.c
similarity index 63%
rename from drivers/usb/hidparse/hidparse.c
rename to drivers/hid/hidparse/hidparse.c
index c3cce18..68db33a 100644 (file)
 
 #include "hidparse.h"
 
-
-VOID
-HidP_FreeCollectionDescription (
-    IN PHIDP_DEVICE_DESC   DeviceDescription)
+PVOID
+NTAPI
+AllocFunction(
+    IN ULONG ItemSize)
 {
-    DPRINT1("HidP_FreeCollectionDescription DeviceDescription %p\n", DeviceDescription);
+    PVOID Item = ExAllocatePool(NonPagedPool, ItemSize);
+    if (Item)
+    {
+        //
+        // zero item
+        //
+        RtlZeroMemory(Item, ItemSize);
+    }
 
     //
-    // free collection
+    // done
     //
-    ExFreePool(DeviceDescription->CollectionDesc);
+    return Item;
+}
 
+VOID
+NTAPI
+FreeFunction(
+    IN PVOID Item)
+{
     //
-    // free report ids
+    // free item
     //
-    ExFreePool(DeviceDescription->ReportIDs);
+    ExFreePool(Item);
+}
 
+VOID
+NTAPI
+ZeroFunction(
+    IN PVOID Item,
+    IN ULONG ItemSize)
+{
     //
-    // free description itself
+    // zero item
     //
-    ExFreePool(DeviceDescription);
+    RtlZeroMemory(Item, ItemSize);
+}
 
+VOID
+NTAPI
+CopyFunction(
+    IN PVOID Target,
+    IN PVOID Source,
+    IN ULONG Length)
+{
+    //
+    // copy item
+    //
+    RtlCopyMemory(Target, Source, Length);
 }
 
-HIDAPI
-NTSTATUS
+VOID
 NTAPI
-HidP_GetButtonCaps(
-    HIDP_REPORT_TYPE ReportType,
-    PHIDP_BUTTON_CAPS ButtonCaps,
-    PUSHORT ButtonCapsLength,
-    PHIDP_PREPARSED_DATA PreparsedData)
+DebugFunction(
+    IN LPCSTR FormatStr, ...)
 {
-    return HidP_GetSpecificButtonCaps(ReportType, 0, 0, 0, ButtonCaps, (PULONG)ButtonCapsLength, PreparsedData);
+
+    va_list args;
+    unsigned int i;
+     char printbuffer[1024];
+
+     va_start(args, FormatStr);
+     i = vsprintf(printbuffer, FormatStr, args);
+     va_end(args);
+
+     DbgPrint(printbuffer);
 }
 
-HIDAPI
-NTSTATUS
+VOID
 NTAPI
-HidP_GetSpecificButtonCaps(
-  IN HIDP_REPORT_TYPE  ReportType,
-  IN USAGE  UsagePage,
-  IN USHORT  LinkCollection,
-  IN USAGE  Usage,
-  OUT PHIDP_BUTTON_CAPS  ButtonCaps,
-  IN OUT PULONG  ButtonCapsLength,
-  IN PHIDP_PREPARSED_DATA  PreparsedData)
+HidP_FreeCollectionDescription (
+    IN PHIDP_DEVICE_DESC   DeviceDescription)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    HID_PARSER Parser;
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, NULL, &Parser);
+
+    //
+    // free collection
+    //
+    HidParser_FreeCollectionDescription(&Parser, DeviceDescription);
 }
 
 
@@ -71,65 +109,183 @@ HidP_GetCaps(
     IN PHIDP_PREPARSED_DATA  PreparsedData,
     OUT PHIDP_CAPS  Capabilities)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    HID_PARSER Parser;
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, PreparsedData, &Parser);
+
+    //
+    // get caps
+    //
+    return HidParser_GetCaps(&Parser, Capabilities);
 }
 
 NTSTATUS
+NTAPI
 HidP_GetCollectionDescription(
     IN PHIDP_REPORT_DESCRIPTOR ReportDesc,
     IN ULONG DescLength,
     IN POOL_TYPE PoolType,
     OUT PHIDP_DEVICE_DESC DeviceDescription)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    PHID_PARSER Parser;
+    HIDPARSER_STATUS Status;
+
+    //
+    // first allocate the parser
+    //
+    Status = HidParser_AllocateParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
+    if (Status != HIDPARSER_STATUS_SUCCESS)
+    {
+        //
+        // not enough memory
+        //
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // get description;
+    //
+    Status = HidParser_GetCollectionDescription(Parser, ReportDesc, DescLength, PoolType, DeviceDescription);
+
+    //
+    // FIXME parser memory leak
+    //
+    return Status;
+}
+
+HIDAPI
+ULONG
+NTAPI
+HidP_MaxUsageListLength(
+  IN HIDP_REPORT_TYPE  ReportType,
+  IN USAGE  UsagePage  OPTIONAL,
+  IN PHIDP_PREPARSED_DATA  PreparsedData)
+{
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, PreparsedData, &Parser);
+
+
+    //
+    // get usage length
+    //
+    return HidParser_MaxUsageListLength(&Parser, ReportType, UsagePage);
 }
 
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetData(
+HidP_GetSpecificValueCaps(
   IN HIDP_REPORT_TYPE  ReportType,
-  OUT PHIDP_DATA  DataList,
-  IN OUT PULONG  DataLength,
+  IN USAGE  UsagePage,
+  IN USHORT  LinkCollection,
+  IN USAGE  Usage,
+  OUT PHIDP_VALUE_CAPS  ValueCaps,
+  IN OUT PULONG  ValueCapsLength,
+  IN PHIDP_PREPARSED_DATA  PreparsedData)
+{
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, PreparsedData, &Parser);
+
+    //
+    // get value caps
+    //
+    return HidParser_GetSpecificValueCaps(&Parser, ReportType, UsagePage, LinkCollection, Usage, ValueCaps, ValueCapsLength);
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsages(
+  IN HIDP_REPORT_TYPE  ReportType,
+  IN USAGE  UsagePage,
+  IN USHORT  LinkCollection  OPTIONAL,
+  OUT USAGE  *UsageList,
+  IN OUT ULONG  *UsageLength,
   IN PHIDP_PREPARSED_DATA  PreparsedData,
   IN PCHAR  Report,
   IN ULONG  ReportLength)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, PreparsedData, &Parser);
+
+    //
+    // get usages
+    //
+    return HidParser_GetUsages(&Parser, ReportType, UsagePage, LinkCollection, UsageList, UsageLength, Report, ReportLength);
 }
 
+
+#undef HidP_GetButtonCaps
+
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetExtendedAttributes(
+HidP_UsageListDifference(
+  IN PUSAGE  PreviousUsageList,
+  IN PUSAGE  CurrentUsageList,
+  OUT PUSAGE  BreakUsageList,
+  OUT PUSAGE  MakeUsageList,
+  IN ULONG  UsageListLength)
+{
+    return HidParser_UsageListDifference(PreviousUsageList, CurrentUsageList, BreakUsageList, MakeUsageList, UsageListLength);
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsagesEx(
   IN HIDP_REPORT_TYPE  ReportType,
-  IN USHORT  DataIndex,
+  IN USHORT  LinkCollection,
+  OUT PUSAGE_AND_PAGE  ButtonList,
+  IN OUT ULONG  *UsageLength,
   IN PHIDP_PREPARSED_DATA  PreparsedData,
-  OUT PHIDP_EXTENDED_ATTRIBUTES  Attributes,
-  IN OUT PULONG  LengthAttributes)
+  IN PCHAR  Report,
+  IN ULONG  ReportLength)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    return HidP_GetUsages(ReportType, HID_USAGE_PAGE_UNDEFINED, LinkCollection, (PUSAGE)ButtonList, UsageLength, PreparsedData, Report, ReportLength);
 }
 
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetLinkCollectionNodes(
-    OUT PHIDP_LINK_COLLECTION_NODE  LinkCollectionNodes,
-    IN OUT PULONG  LinkCollectionNodesLength,
-    IN PHIDP_PREPARSED_DATA  PreparsedData)
+HidP_UsageAndPageListDifference(
+   IN PUSAGE_AND_PAGE  PreviousUsageList,
+   IN PUSAGE_AND_PAGE  CurrentUsageList,
+   OUT PUSAGE_AND_PAGE  BreakUsageList,
+   OUT PUSAGE_AND_PAGE  MakeUsageList,
+   IN ULONG  UsageListLength)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    return HidParser_UsageAndPageListDifference(PreviousUsageList, CurrentUsageList, BreakUsageList, MakeUsageList, UsageListLength);
 }
 
 HIDAPI
@@ -145,40 +301,94 @@ HidP_GetScaledUsageValue(
   IN PCHAR  Report,
   IN ULONG  ReportLength)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, PreparsedData, &Parser);
+
+    //
+    // get scaled usage value
+    //
+    return HidParser_GetScaledUsageValue(&Parser, ReportType, UsagePage, LinkCollection, Usage, UsageValue, Report, ReportLength);
 }
 
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetUsageValue(
+HidP_TranslateUsageAndPagesToI8042ScanCodes(
+   IN PUSAGE_AND_PAGE  ChangedUsageList,
+   IN ULONG  UsageListLength,
+   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
+   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
+   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
+   IN PVOID  InsertCodesContext)
+{
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, NULL, &Parser);
+
+    //
+    // translate usage pages
+    //
+    return HidParser_TranslateUsageAndPagesToI8042ScanCodes(Parser, UsageListLength, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
+}
+
+
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetButtonCaps(
+    HIDP_REPORT_TYPE ReportType,
+    PHIDP_BUTTON_CAPS ButtonCaps,
+    PUSHORT ButtonCapsLength,
+    PHIDP_PREPARSED_DATA PreparsedData)
+{
+    return HidP_GetSpecificButtonCaps(ReportType, HID_USAGE_PAGE_UNDEFINED, 0, 0, ButtonCaps, (PULONG)ButtonCapsLength, PreparsedData);
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetSpecificButtonCaps(
   IN HIDP_REPORT_TYPE  ReportType,
   IN USAGE  UsagePage,
   IN USHORT  LinkCollection,
   IN USAGE  Usage,
-  OUT PULONG  UsageValue,
-  IN PHIDP_PREPARSED_DATA  PreparsedData,
-  IN PCHAR  Report,
-  IN ULONG  ReportLength)
+  OUT PHIDP_BUTTON_CAPS  ButtonCaps,
+  IN OUT PULONG  ButtonCapsLength,
+  IN PHIDP_PREPARSED_DATA  PreparsedData)
 {
     UNIMPLEMENTED
     ASSERT(FALSE);
     return STATUS_NOT_IMPLEMENTED;
 }
 
-
-
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_UsageListDifference(
-  IN PUSAGE  PreviousUsageList,
-  IN PUSAGE  CurrentUsageList,
-  OUT PUSAGE  BreakUsageList,
-  OUT PUSAGE  MakeUsageList,
-  IN ULONG  UsageListLength)
+HidP_GetData(
+  IN HIDP_REPORT_TYPE  ReportType,
+  OUT PHIDP_DATA  DataList,
+  IN OUT PULONG  DataLength,
+  IN PHIDP_PREPARSED_DATA  PreparsedData,
+  IN PCHAR  Report,
+  IN ULONG  ReportLength)
 {
     UNIMPLEMENTED
     ASSERT(FALSE);
@@ -188,14 +398,12 @@ HidP_UsageListDifference(
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetSpecificValueCaps(
+HidP_GetExtendedAttributes(
   IN HIDP_REPORT_TYPE  ReportType,
   IN USAGE  UsagePage,
-  IN USHORT  LinkCollection,
-  IN USAGE  Usage,
-  OUT PHIDP_VALUE_CAPS  ValueCaps,
-  IN OUT PULONG  ValueCapsLength,
-  IN PHIDP_PREPARSED_DATA  PreparsedData)
+  IN PHIDP_PREPARSED_DATA  PreparsedData,
+  OUT PHIDP_EXTENDED_ATTRIBUTES  Attributes,
+  IN OUT PULONG  LengthAttributes)
 {
     UNIMPLEMENTED
     ASSERT(FALSE);
@@ -203,12 +411,12 @@ HidP_GetSpecificValueCaps(
 }
 
 HIDAPI
-ULONG
+NTSTATUS
 NTAPI
-HidP_MaxUsageListLength(
-  IN HIDP_REPORT_TYPE  ReportType,
-  IN USAGE  UsagePage  OPTIONAL,
-  IN PHIDP_PREPARSED_DATA  PreparsedData)
+HidP_GetLinkCollectionNodes(
+    OUT PHIDP_LINK_COLLECTION_NODE  LinkCollectionNodes,
+    IN OUT PULONG  LinkCollectionNodesLength,
+    IN PHIDP_PREPARSED_DATA  PreparsedData)
 {
     UNIMPLEMENTED
     ASSERT(FALSE);
@@ -218,12 +426,12 @@ HidP_MaxUsageListLength(
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_GetUsages(
+HidP_GetUsageValue(
   IN HIDP_REPORT_TYPE  ReportType,
   IN USAGE  UsagePage,
-  IN USHORT  LinkCollection  OPTIONAL,
-  OUT USAGE  *UsageList,
-  IN OUT ULONG  *UsageLength,
+  IN USHORT  LinkCollection,
+  IN USAGE  Usage,
+  OUT PULONG  UsageValue,
   IN PHIDP_PREPARSED_DATA  PreparsedData,
   IN PCHAR  Report,
   IN ULONG  ReportLength)
@@ -234,6 +442,7 @@ HidP_GetUsages(
 }
 
 NTSTATUS
+NTAPI
 HidP_SysPowerEvent (
     IN PCHAR HidPacket,
     IN USHORT HidPacketLength,
@@ -246,6 +455,7 @@ HidP_SysPowerEvent (
 }
 
 NTSTATUS
+NTAPI
 HidP_SysPowerCaps (
     IN PHIDP_PREPARSED_DATA Ppd,
     OUT PULONG OutputBuffer)
@@ -274,38 +484,6 @@ HidP_GetUsageValueArray(
     return STATUS_NOT_IMPLEMENTED;
 }
 
-HIDAPI
-NTSTATUS
-NTAPI
-HidP_GetUsagesEx(
-  IN HIDP_REPORT_TYPE  ReportType,
-  IN USHORT  LinkCollection,
-  OUT PUSAGE_AND_PAGE  ButtonList,
-  IN OUT ULONG  *UsageLength,
-  IN PHIDP_PREPARSED_DATA  PreparsedData,
-  IN PCHAR  Report,
-  IN ULONG  ReportLength)
-{
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-
-HIDAPI
-NTSTATUS
-NTAPI
-HidP_UsageAndPageListDifference(
-   IN PUSAGE_AND_PAGE  PreviousUsageList,
-   IN PUSAGE_AND_PAGE  CurrentUsageList,
-   OUT PUSAGE_AND_PAGE  BreakUsageList,
-   OUT PUSAGE_AND_PAGE  MakeUsageList,
-   IN ULONG  UsageListLength)
-{
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
-}
 
 HIDAPI
 NTSTATUS
@@ -341,22 +519,6 @@ HidP_TranslateUsagesToI8042ScanCodes(
     return STATUS_NOT_IMPLEMENTED;
 }
 
-HIDAPI
-NTSTATUS
-NTAPI
-HidP_TranslateUsageAndPagesToI8042ScanCodes(
-   IN PUSAGE_AND_PAGE  ChangedUsageList,
-   IN ULONG  UsageListLength,
-   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
-   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
-   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
-   IN PVOID  InsertCodesContext)
-{
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
-}
-
 HIDAPI
 NTSTATUS
 NTAPI
@@ -473,6 +635,8 @@ HidP_InitializeReportForID(
     return STATUS_NOT_IMPLEMENTED;
 }
 
+#undef HidP_GetValueCaps
+
 HIDAPI
 NTSTATUS
 NTAPI