[HIDPARSE]

- Start support for multi top level hid collections
- Not yet full implemented
- Required for proper usb composite support

svn path=/branches/usb-bringup-trunk/; revision=55332
This commit is contained in:
Johannes Anderwald 2012-01-30 19:29:26 +00:00
parent c9a760c226
commit a7eba59665
5 changed files with 405 additions and 361 deletions

View file

@ -95,89 +95,73 @@ HidParser_GetCollection(
}
PHID_REPORT
HidParser_GetReportByType(
IN PHID_PARSER Parser,
IN ULONG ReportType)
HidParser_GetReportInCollection(
PHID_COLLECTION Collection,
IN UCHAR ReportType)
{
PHID_PARSER_CONTEXT ParserContext;
ULONG Index;
PHID_REPORT Report;
//
// get parser context
// search in local array
//
ParserContext = (PHID_PARSER_CONTEXT)Parser->ParserContext;
//
// sanity checks
//
ASSERT(ParserContext);
//
// FIXME support multiple top collecions
//
ASSERT(ParserContext->RootCollection->NodeCount == 1);
for(Index = 0; Index < ParserContext->ReportCount; Index++)
for(Index = 0; Index < Collection->ReportCount; Index++)
{
//
// check if the report type match
//
if (ParserContext->Reports[Index]->Type == ReportType)
if (Collection->Reports[Index]->Type == ReportType)
{
//
// found report
//
return ParserContext->Reports[Index];
return Collection->Reports[Index];
}
}
//
// report not found
// search in local array
//
for(Index = 0; Index < Collection->NodeCount; Index++)
{
Report = HidParser_GetReportInCollection(Collection->Nodes[Index], ReportType);
if (Report)
{
//
// found report
//
return Report;
}
}
//
// not found
//
return NULL;
}
ULONG
HidParser_NumberOfReports(
PHID_REPORT
HidParser_GetReportByType(
IN PHID_PARSER Parser,
IN ULONG ReportType)
IN ULONG CollectionIndex,
IN UCHAR ReportType)
{
PHID_PARSER_CONTEXT ParserContext;
ULONG Index;
ULONG ReportCount = 0;
PHID_COLLECTION Collection;
//
// get parser context
// find collection
//
ParserContext = (PHID_PARSER_CONTEXT)Parser->ParserContext;
//
// sanity checks
//
ASSERT(ParserContext);
//
// FIXME support multiple top collecions
//
ASSERT(ParserContext->RootCollection->NodeCount == 1);
for(Index = 0; Index < ParserContext->ReportCount; Index++)
Collection = HidParser_GetCollection(Parser, CollectionIndex);
if (!Collection)
{
//
// check if the report type match
// no such collection
//
if (ParserContext->Reports[Index]->Type == ReportType)
{
//
// found report
//
ReportCount++;
}
ASSERT(FALSE);
return NULL;
}
//
// done
// search report
//
return ReportCount;
return HidParser_GetReportInCollection(Collection, ReportType);
}
HIDPARSER_STATUS
@ -212,6 +196,7 @@ HidParser_GetCollectionUsagePage(
ULONG
HidParser_GetReportLength(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType)
{
PHID_PARSER_CONTEXT ParserContext;
@ -236,7 +221,7 @@ HidParser_GetReportLength(
//
// get first report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -289,6 +274,7 @@ HidParser_IsReportIDUsed(
ULONG
HidParser_GetReportItemCountFromReportType(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType)
{
PHID_PARSER_CONTEXT ParserContext;
@ -312,7 +298,7 @@ HidParser_GetReportItemCountFromReportType(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -331,6 +317,7 @@ HidParser_GetReportItemCountFromReportType(
ULONG
HidParser_GetReportItemTypeCountFromReportType(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType,
IN ULONG bData)
{
@ -357,7 +344,7 @@ HidParser_GetReportItemTypeCountFromReportType(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -398,7 +385,8 @@ HidParser_GetReportItemTypeCountFromReportType(
ULONG
HidParser_GetContextSize(
IN PHID_PARSER Parser)
IN PHID_PARSER Parser,
IN ULONG CollectionIndex)
{
//
// FIXME the context must contain all parsed info
@ -540,6 +528,7 @@ HidParser_GetTotalCollectionCount(
ULONG
HidParser_GetMaxUsageListLengthWithReportAndPage(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType,
IN USAGE UsagePage OPTIONAL)
{
@ -567,7 +556,7 @@ HidParser_GetMaxUsageListLengthWithReportAndPage(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -600,6 +589,7 @@ HidParser_GetMaxUsageListLengthWithReportAndPage(
HIDPARSER_STATUS
HidParser_GetSpecificValueCapsWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType,
IN USHORT UsagePage,
IN USHORT Usage,
@ -631,7 +621,7 @@ HidParser_GetSpecificValueCapsWithReport(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -705,6 +695,7 @@ HidParser_GetSpecificValueCapsWithReport(
HIDPARSER_STATUS
HidParser_GetUsagesWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType,
IN USAGE UsagePage,
OUT USAGE *UsageList,
@ -739,7 +730,7 @@ HidParser_GetUsagesWithReport(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -852,6 +843,7 @@ HidParser_GetUsagesWithReport(
HIDPARSER_STATUS
HidParser_GetScaledUsageValueWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType,
IN USAGE UsagePage,
IN USAGE Usage,
@ -884,7 +876,7 @@ HidParser_GetScaledUsageValueWithReport(
//
// get report
//
Report = HidParser_GetReportByType(Parser, ReportType);
Report = HidParser_GetReportByType(Parser, CollectionIndex, ReportType);
if (!Report)
{
//
@ -1042,6 +1034,7 @@ HidParser_DispatchKey(
HIDPARSER_STATUS
HidParser_TranslateUsage(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN USAGE Usage,
IN HIDP_KEYBOARD_DIRECTION KeyAction,
IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
@ -1073,3 +1066,15 @@ HidParser_TranslateUsage(
//
return HIDPARSER_STATUS_SUCCESS;
}
ULONG
HidParser_GetCollectionNumberFromParserContext(
IN PHID_PARSER Parser)
{
PHID_PARSER_CONTEXT Context = (PHID_PARSER_CONTEXT)Parser->ParserContext;
//
// get parser context
//
return Context->CollectionIndex;
}

View file

@ -69,16 +69,12 @@ HidParser_GetCollectionDescription(
// get collection count
//
CollectionCount = HidParser_NumberOfTopCollections(Parser);
//
// FIXME: only one top level collection is supported
//
ASSERT(CollectionCount <= 1);
if (CollectionCount == 0)
{
//
// no top level collections found
//
ASSERT(FALSE);
return STATUS_NO_DATA_DETECTED;
}
@ -119,9 +115,9 @@ HidParser_GetCollectionDescription(
//
DeviceDescription->ReportIDs[Index].CollectionNumber = Index + 1;
DeviceDescription->ReportIDs[Index].ReportID = Index; //FIXME
DeviceDescription->ReportIDs[Index].InputLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_INPUT);
DeviceDescription->ReportIDs[Index].OutputLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_OUTPUT);
DeviceDescription->ReportIDs[Index].FeatureLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_FEATURE);
DeviceDescription->ReportIDs[Index].InputLength = HidParser_GetReportLength(Parser, Index, HID_REPORT_TYPE_INPUT);
DeviceDescription->ReportIDs[Index].OutputLength = HidParser_GetReportLength(Parser, Index, HID_REPORT_TYPE_OUTPUT);
DeviceDescription->ReportIDs[Index].FeatureLength = HidParser_GetReportLength(Parser, Index, HID_REPORT_TYPE_FEATURE);
//
// init collection description
@ -143,7 +139,7 @@ HidParser_GetCollectionDescription(
//
// set preparsed data length
//
DeviceDescription->CollectionDesc[Index].PreparsedDataLength = HidParser_GetContextSize(Parser);
DeviceDescription->CollectionDesc[Index].PreparsedDataLength = HidParser_GetContextSize(Parser, Index);
DeviceDescription->CollectionDesc[Index].PreparsedData = Parser->Alloc(DeviceDescription->CollectionDesc[Index].PreparsedDataLength);
if (!DeviceDescription->CollectionDesc[Index].PreparsedData)
{
@ -209,23 +205,24 @@ HidParser_GetCaps(
OUT PHIDP_CAPS Capabilities)
{
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
//
// zero capabilities
//
Parser->Zero(Capabilities, sizeof(HIDP_CAPS));
//
// FIXME support multiple top level collections
//
CollectionNumber = 0;
//
// init capabilities
//
HidParser_GetCollectionUsagePage(Parser, CollectionNumber, &Capabilities->Usage, &Capabilities->UsagePage);
Capabilities->InputReportByteLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_INPUT);
Capabilities->OutputReportByteLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_OUTPUT);
Capabilities->FeatureReportByteLength = HidParser_GetReportLength(Parser, HID_REPORT_TYPE_FEATURE);
Capabilities->InputReportByteLength = HidParser_GetReportLength(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT);
Capabilities->OutputReportByteLength = HidParser_GetReportLength(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT);
Capabilities->FeatureReportByteLength = HidParser_GetReportLength(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE);
//
// always pre-prend report id
@ -237,29 +234,29 @@ HidParser_GetCaps(
//
// get number of link collection nodes
//
Capabilities->NumberLinkCollectionNodes = HidParser_GetTotalCollectionCount(Parser);
Capabilities->NumberLinkCollectionNodes = HidParser_GetTotalCollectionCount(Parser, CollectionNumber);
//
// get data indices
//
Capabilities->NumberInputDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_INPUT, TRUE);
Capabilities->NumberOutputDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_OUTPUT, TRUE);
Capabilities->NumberFeatureDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_FEATURE, TRUE);
Capabilities->NumberInputDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, TRUE);
Capabilities->NumberOutputDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, TRUE);
Capabilities->NumberFeatureDataIndices = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, TRUE);
//
// get value caps
//
Capabilities->NumberInputValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_INPUT, FALSE);
Capabilities->NumberOutputValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_OUTPUT, FALSE);
Capabilities->NumberFeatureValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, HID_REPORT_TYPE_FEATURE, FALSE);
Capabilities->NumberInputValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, FALSE);
Capabilities->NumberOutputValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, FALSE);
Capabilities->NumberFeatureValueCaps = HidParser_GetReportItemTypeCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, FALSE);
//
// get button caps
//
Capabilities->NumberInputButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, HID_REPORT_TYPE_INPUT);
Capabilities->NumberOutputButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, HID_REPORT_TYPE_OUTPUT);
Capabilities->NumberFeatureButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, HID_REPORT_TYPE_FEATURE);
Capabilities->NumberInputButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT);
Capabilities->NumberOutputButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT);
Capabilities->NumberFeatureButtonCaps = HidParser_GetReportItemCountFromReportType(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE);
//
// done
@ -275,6 +272,14 @@ HidParser_MaxUsageListLength(
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage OPTIONAL)
{
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
//
// FIXME test what should be returned when usage page is not defined
//
@ -296,21 +301,21 @@ HidParser_MaxUsageListLength(
//
// input report
//
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, HID_REPORT_TYPE_INPUT, UsagePage);
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, UsagePage);
}
else if (ReportType == HidP_Output)
{
//
// input report
//
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, HID_REPORT_TYPE_OUTPUT, UsagePage);
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, UsagePage);
}
else if (ReportType == HidP_Feature)
{
//
// input report
//
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, HID_REPORT_TYPE_FEATURE, UsagePage);
return HidParser_GetMaxUsageListLengthWithReportAndPage(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, UsagePage);
}
else
{
@ -348,6 +353,14 @@ HidParser_GetSpecificValueCaps(
IN OUT PULONG ValueCapsLength)
{
HIDPARSER_STATUS ParserStatus;
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
//
// FIXME: implement searching in specific collection
@ -359,21 +372,21 @@ HidParser_GetSpecificValueCaps(
//
// input report
//
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, HID_REPORT_TYPE_INPUT, UsagePage, Usage, ValueCaps, ValueCapsLength);
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, UsagePage, Usage, ValueCaps, ValueCapsLength);
}
else if (ReportType == HidP_Output)
{
//
// input report
//
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, HID_REPORT_TYPE_OUTPUT, UsagePage, Usage, ValueCaps, ValueCapsLength);
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, UsagePage, Usage, ValueCaps, ValueCapsLength);
}
else if (ReportType == HidP_Feature)
{
//
// input report
//
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, HID_REPORT_TYPE_FEATURE, UsagePage, Usage, ValueCaps, ValueCapsLength);
ParserStatus = HidParser_GetSpecificValueCapsWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, UsagePage, Usage, ValueCaps, ValueCapsLength);
}
else
{
@ -541,6 +554,12 @@ HidParser_GetUsages(
IN ULONG ReportLength)
{
HIDPARSER_STATUS ParserStatus;
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
//
// FIXME: implement searching in specific collection
@ -552,21 +571,21 @@ HidParser_GetUsages(
//
// input report
//
ParserStatus = HidParser_GetUsagesWithReport(Parser, HID_REPORT_TYPE_INPUT, UsagePage, UsageList, UsageLength, Report, ReportLength);
ParserStatus = HidParser_GetUsagesWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, UsagePage, UsageList, UsageLength, Report, ReportLength);
}
else if (ReportType == HidP_Output)
{
//
// input report
//
ParserStatus = HidParser_GetUsagesWithReport(Parser, HID_REPORT_TYPE_OUTPUT, UsagePage, UsageList, UsageLength, Report, ReportLength);
ParserStatus = HidParser_GetUsagesWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, UsagePage, UsageList, UsageLength, Report, ReportLength);
}
else if (ReportType == HidP_Feature)
{
//
// input report
//
ParserStatus = HidParser_GetUsagesWithReport(Parser, HID_REPORT_TYPE_FEATURE, UsagePage, UsageList, UsageLength, Report, ReportLength);
ParserStatus = HidParser_GetUsagesWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, UsagePage, UsageList, UsageLength, Report, ReportLength);
}
else
{
@ -604,6 +623,12 @@ HidParser_GetScaledUsageValue(
IN ULONG ReportLength)
{
HIDPARSER_STATUS ParserStatus;
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
//
// FIXME: implement searching in specific collection
@ -615,21 +640,21 @@ HidParser_GetScaledUsageValue(
//
// input report
//
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, HID_REPORT_TYPE_INPUT, UsagePage, Usage, UsageValue, Report, ReportLength);
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_INPUT, UsagePage, Usage, UsageValue, Report, ReportLength);
}
else if (ReportType == HidP_Output)
{
//
// input report
//
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, HID_REPORT_TYPE_OUTPUT, UsagePage, Usage, UsageValue, Report, ReportLength);
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_OUTPUT, UsagePage, Usage, UsageValue, Report, ReportLength);
}
else if (ReportType == HidP_Feature)
{
//
// input report
//
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, HID_REPORT_TYPE_FEATURE, UsagePage, Usage, UsageValue, Report, ReportLength);
ParserStatus = HidParser_GetScaledUsageValueWithReport(Parser, CollectionNumber, HID_REPORT_TYPE_FEATURE, UsagePage, Usage, UsageValue, Report, ReportLength);
}
else
{
@ -667,6 +692,12 @@ HidParser_TranslateUsageAndPagesToI8042ScanCodes(
{
ULONG Index;
HIDPARSER_STATUS Status = HIDPARSER_STATUS_SUCCESS;
ULONG CollectionNumber;
//
// get collection number from context
//
CollectionNumber = HidParser_GetCollectionNumberFromParserContext(Parser);
for(Index = 0; Index < UsageListLength; Index++)
{
@ -678,7 +709,7 @@ HidParser_TranslateUsageAndPagesToI8042ScanCodes(
//
// process usage
//
Status = HidParser_TranslateUsage(Parser, ChangedUsageList[Index].Usage, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
Status = HidParser_TranslateUsage(Parser, CollectionNumber, ChangedUsageList[Index].Usage, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
}
else if (ChangedUsageList[Index].UsagePage == HID_USAGE_PAGE_CONSUMER)
{
@ -890,10 +921,10 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetData(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
OUT PHIDP_DATA DataList,
IN OUT PULONG DataLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN PCHAR Report,
IN ULONG ReportLength)
{
@ -906,9 +937,9 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetExtendedAttributes(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USHORT DataIndex,
IN PHIDP_PREPARSED_DATA PreparsedData,
OUT PHIDP_EXTENDED_ATTRIBUTES Attributes,
IN OUT PULONG LengthAttributes)
{
@ -921,9 +952,9 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetLinkCollectionNodes(
IN PHID_PARSER Parser,
OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
IN OUT PULONG LinkCollectionNodesLength,
IN PHIDP_PREPARSED_DATA PreparsedData)
IN OUT PULONG LinkCollectionNodesLength)
{
UNIMPLEMENTED
ASSERT(FALSE);
@ -934,12 +965,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetUsageValue(
IN PHID_PARSER Parser,
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)
{
@ -948,13 +979,12 @@ HidParser_GetUsageValue(
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
HidParser_SysPowerEvent(
IN PHID_PARSER Parser,
IN PCHAR HidPacket,
IN USHORT HidPacketLength,
IN PHIDP_PREPARSED_DATA Ppd,
OUT PULONG OutputBuffer)
{
UNIMPLEMENTED
@ -965,7 +995,7 @@ HidParser_SysPowerEvent (
NTSTATUS
NTAPI
HidParser_SysPowerCaps (
IN PHIDP_PREPARSED_DATA Ppd,
IN PHID_PARSER Parser,
OUT PULONG OutputBuffer)
{
UNIMPLEMENTED
@ -977,13 +1007,13 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetUsageValueArray(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
OUT PCHAR UsageValue,
IN USHORT UsageValueByteLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN PCHAR Report,
IN ULONG ReportLength)
{
@ -996,12 +1026,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_UnsetUsages(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN PUSAGE UsageList,
IN OUT PULONG UsageLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1030,12 +1060,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsages(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN PUSAGE UsageList,
IN OUT PULONG UsageLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1048,13 +1078,13 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsageValueArray(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
IN PCHAR UsageValue,
IN USHORT UsageValueByteLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1067,12 +1097,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsageValue(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN USAGE Usage,
IN ULONG UsageValue,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1085,12 +1115,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetScaledUsageValue(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
IN LONG UsageValue,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1103,10 +1133,10 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetData(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN PHIDP_DATA DataList,
IN OUT PULONG DataLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1119,8 +1149,8 @@ HIDAPI
ULONG
NTAPI
HidParser_MaxDataListLength(
IN HIDP_REPORT_TYPE ReportType,
IN PHIDP_PREPARSED_DATA PreparsedData)
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType)
{
UNIMPLEMENTED
ASSERT(FALSE);
@ -1131,9 +1161,9 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_InitializeReportForID(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN UCHAR ReportID,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength)
{
@ -1148,10 +1178,10 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetValueCaps(
IN PHID_PARSER Parser,
HIDP_REPORT_TYPE ReportType,
PHIDP_VALUE_CAPS ValueCaps,
PULONG ValueCapsLength,
PHIDP_PREPARSED_DATA PreparsedData)
PULONG ValueCapsLength)
{
UNIMPLEMENTED
ASSERT(FALSE);

View file

@ -180,10 +180,10 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetData(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
OUT PHIDP_DATA DataList,
IN OUT PULONG DataLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN PCHAR Report,
IN ULONG ReportLength);
@ -191,9 +191,9 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetExtendedAttributes(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USHORT DataIndex,
IN PHIDP_PREPARSED_DATA PreparsedData,
OUT PHIDP_EXTENDED_ATTRIBUTES Attributes,
IN OUT PULONG LengthAttributes);
@ -201,20 +201,20 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetLinkCollectionNodes(
IN PHID_PARSER Parser,
OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
IN OUT PULONG LinkCollectionNodesLength,
IN PHIDP_PREPARSED_DATA PreparsedData);
IN OUT PULONG LinkCollectionNodesLength);
HIDAPI
NTSTATUS
NTAPI
HidParser_GetUsageValue(
IN PHID_PARSER Parser,
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);
@ -266,28 +266,28 @@ HidParser_GetUsagesEx(
NTSTATUS
NTAPI
HidParser_SysPowerEvent (
IN PHID_PARSER Parser,
IN PCHAR HidPacket,
IN USHORT HidPacketLength,
IN PHIDP_PREPARSED_DATA Ppd,
OUT PULONG OutputBuffer);
NTSTATUS
NTAPI
HidParser_SysPowerCaps (
IN PHIDP_PREPARSED_DATA Ppd,
IN PHID_PARSER Parser,
OUT PULONG OutputBuffer);
HIDAPI
NTSTATUS
NTAPI
HidParser_GetUsageValueArray(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
OUT PCHAR UsageValue,
IN USHORT UsageValueByteLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN PCHAR Report,
IN ULONG ReportLength);
@ -306,12 +306,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_UnsetUsages(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN PUSAGE UsageList,
IN OUT PULONG UsageLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
@ -342,12 +342,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsages(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN PUSAGE UsageList,
IN OUT PULONG UsageLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
@ -355,13 +355,13 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsageValueArray(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
IN PCHAR UsageValue,
IN USHORT UsageValueByteLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
OUT PCHAR Report,
IN ULONG ReportLength);
@ -369,12 +369,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetUsageValue(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection,
IN USAGE Usage,
IN ULONG UsageValue,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
@ -382,12 +382,12 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetScaledUsageValue(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN USAGE UsagePage,
IN USHORT LinkCollection OPTIONAL,
IN USAGE Usage,
IN LONG UsageValue,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
@ -395,10 +395,10 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_SetData(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN PHIDP_DATA DataList,
IN OUT PULONG DataLength,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
@ -406,23 +406,23 @@ HIDAPI
ULONG
NTAPI
HidParser_MaxDataListLength(
IN HIDP_REPORT_TYPE ReportType,
IN PHIDP_PREPARSED_DATA PreparsedData);
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType);
HIDAPI
NTSTATUS
NTAPI
HidParser_InitializeReportForID(
IN PHID_PARSER Parser,
IN HIDP_REPORT_TYPE ReportType,
IN UCHAR ReportID,
IN PHIDP_PREPARSED_DATA PreparsedData,
IN OUT PCHAR Report,
IN ULONG ReportLength);
HIDPARSER_STATUS
HidParser_TranslateUsage(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN USAGE Usage,
IN HIDP_KEYBOARD_DIRECTION KeyAction,
IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
@ -433,7 +433,7 @@ HIDAPI
NTSTATUS
NTAPI
HidParser_GetValueCaps(
PHID_PARSER Parser,
HIDP_REPORT_TYPE ReportType,
PHIDP_VALUE_CAPS ValueCaps,
PULONG ValueCapsLength,
PHIDP_PREPARSED_DATA PreparsedData);
PULONG ValueCapsLength);

View file

@ -136,26 +136,6 @@ HidParser_ResetParser(
//
ParserContext = (PHID_PARSER_CONTEXT)Parser->ParserContext;
//
// delete all reports
//
for(Index = 0; Index < ParserContext->ReportCount; Index++)
{
//
// delete report
//
HidParser_DeleteReport(Parser, ParserContext->Reports[Index]);
}
if (ParserContext->ReportCount && ParserContext->Reports)
{
//
// free report array
//
Parser->Free(ParserContext->Reports);
}
if (ParserContext->RootCollection)
{
//
@ -167,8 +147,6 @@ HidParser_ResetParser(
//
// reinit parser
//
ParserContext->ReportCount = 0;
ParserContext->Reports = NULL;
ParserContext->RootCollection = NULL;
ParserContext->UseReportIDs = FALSE;
@ -237,33 +215,40 @@ HidParser_AddCollection(
}
HIDPARSER_STATUS
HidParser_FindReport(
IN PHID_PARSER Parser,
HidParser_FindReportInCollection(
IN PHID_COLLECTION Collection,
IN UCHAR ReportType,
IN UCHAR ReportID,
OUT PHID_REPORT *OutReport)
{
PHID_PARSER_CONTEXT ParserContext;
ULONG Index;
HIDPARSER_STATUS Status;
//
// get parser context
// search in local list
//
ParserContext = (PHID_PARSER_CONTEXT)Parser->ParserContext;
ASSERT(ParserContext);
for(Index = 0; Index < ParserContext->ReportCount; Index++)
for(Index = 0; Index < Collection->ReportCount; Index++)
{
if (ParserContext->Reports[Index]->Type == ReportType && ParserContext->Reports[Index]->ReportID == ReportID)
if (Collection->Reports[Index]->Type == ReportType && Collection->Reports[Index]->ReportID == ReportID)
{
//
// found report
//
*OutReport = ParserContext->Reports[Index];
*OutReport = Collection->Reports[Index];
return HIDPARSER_STATUS_SUCCESS;
}
}
//
// search in sub collections
//
for(Index = 0; Index < Collection->NodeCount; Index++)
{
Status = HidParser_FindReportInCollection(Collection->Nodes[Index], ReportType, ReportID, OutReport);
if (Status == HIDPARSER_STATUS_SUCCESS)
return Status;
}
//
// no such report found
//
@ -271,6 +256,28 @@ HidParser_FindReport(
return HIDPARSER_STATUS_REPORT_NOT_FOUND;
}
HIDPARSER_STATUS
HidParser_FindReport(
IN PHID_PARSER Parser,
IN UCHAR ReportType,
IN UCHAR ReportID,
OUT PHID_REPORT *OutReport)
{
PHID_PARSER_CONTEXT ParserContext;
//
// get parser context
//
ParserContext = (PHID_PARSER_CONTEXT)Parser->ParserContext;
ASSERT(ParserContext);
//
// search in current top level collection
//
return HidParser_FindReportInCollection(ParserContext->RootCollection->Nodes[ParserContext->RootCollection->NodeCount-1], ReportType, ReportID, OutReport);
}
HIDPARSER_STATUS
HidParser_AllocateReport(
IN PHID_PARSER Parser,
@ -306,8 +313,9 @@ HidParser_AllocateReport(
}
HIDPARSER_STATUS
HidParser_AddReport(
HidParser_AddReportToCollection(
IN PHID_PARSER Parser,
IN PHID_COLLECTION CurrentCollection,
IN PHID_REPORT NewReport)
{
PHID_REPORT * NewReportArray;
@ -322,7 +330,7 @@ HidParser_AddReport(
//
// allocate new report array
//
NewReportArray = (PHID_REPORT*)Parser->Alloc(sizeof(PHID_REPORT) * (ParserContext->ReportCount + 1));
NewReportArray = (PHID_REPORT*)Parser->Alloc(sizeof(PHID_REPORT) * (CurrentCollection->ReportCount + 1));
if (!NewReportArray)
{
//
@ -331,25 +339,25 @@ HidParser_AddReport(
return HIDPARSER_STATUS_INSUFFICIENT_RESOURCES;
}
if (ParserContext->ReportCount)
if (CurrentCollection->ReportCount)
{
//
// copy old array contents
//
Parser->Copy(NewReportArray, ParserContext->Reports, sizeof(PHID_REPORT) * ParserContext->ReportCount);
Parser->Copy(NewReportArray, CurrentCollection->Reports, sizeof(PHID_REPORT) * CurrentCollection->ReportCount);
//
// free old array
//
Parser->Free(ParserContext->Reports);
Parser->Free(CurrentCollection->Reports);
}
//
// store result
//
NewReportArray[ParserContext->ReportCount] = NewReport;
ParserContext->Reports = NewReportArray;
ParserContext->ReportCount++;
NewReportArray[CurrentCollection->ReportCount] = NewReport;
CurrentCollection->Reports = NewReportArray;
CurrentCollection->ReportCount++;
//
// completed successfully
@ -360,6 +368,7 @@ HidParser_AddReport(
HIDPARSER_STATUS
HidParser_GetReport(
IN PHID_PARSER Parser,
IN PHID_COLLECTION Collection,
IN UCHAR ReportType,
IN UCHAR ReportID,
IN UCHAR CreateIfNotExists,
@ -394,7 +403,7 @@ HidParser_GetReport(
//
// add report
//
Status = HidParser_AddReport(Parser, *OutReport);
Status = HidParser_AddReportToCollection(Parser, Collection, *OutReport);
if (Status != HIDPARSER_STATUS_SUCCESS)
{
//
@ -925,7 +934,7 @@ HidParser_ParseReportDescriptor(
}
}
Parser->Debug("Tag %x Type %x Size %x Offset %lu Length %lu\n", CurrentItem->Tag, CurrentItem->Type, CurrentItem->Size, ((ULONG_PTR)CurrentItem - (ULONG_PTR)ReportDescriptor), ReportLength);
//
// handle items
//
@ -1019,7 +1028,7 @@ HidParser_ParseReportDescriptor(
break;
default:
Parser->Debug("[HIDPARSE] Unknown ReportType %x\n", CurrentItem->Tag);
Parser->Debug("[HIDPARSE] Unknown ReportType Tag %x Type %x Size %x CurrentItemSize %x\n", CurrentItem->Tag, CurrentItem->Type, CurrentItem->Size, CurrentItemSize);
ASSERT(FALSE);
break;
}
@ -1030,7 +1039,7 @@ HidParser_ParseReportDescriptor(
//
// get report
//
Status = HidParser_GetReport(Parser, ReportType, ParserContext->GlobalItemState.ReportId, TRUE, &Report);
Status = HidParser_GetReport(Parser, CurrentCollection, ReportType, ParserContext->GlobalItemState.ReportId, TRUE, &Report);
ASSERT(Status == HIDPARSER_STATUS_SUCCESS);
// fill in a sensible default if the index isn't set
@ -1246,7 +1255,7 @@ HidParser_ParseReportDescriptor(
break;
case ITEM_TAG_LOCAL_USAGE_MAXIMUM:
Parser->Debug("[HIDPARSE] ITEM_TAG_LOCAL_USAGE_MAXIMUM Data %x\n", Data);
Parser->Debug("[HIDPARSE] ITEM_TAG_LOCAL_USAGE_MAXIMUM Data %x ItemSize %x %x\n", Data, CurrentItemSize, CurrentItem->Size);
ParserContext->LocalItemState.UsageMaximum.u.Extended = Data;
ParserContext->LocalItemState.UsageMaximum.IsExtended
= CurrentItemSize == sizeof(ULONG);
@ -1344,4 +1353,3 @@ HidParser_ParseReportDescriptor(
//
return HIDPARSER_STATUS_SUCCESS;
}

View file

@ -195,7 +195,7 @@ typedef struct
UCHAR Valid;
}HID_REPORT_ITEM, *PHID_REPORT_ITEM;
struct HID_REPORT;
struct _HID_REPORT;
typedef struct __HID_COLLECTION__
{
@ -210,14 +210,15 @@ typedef struct __HID_COLLECTION__
ULONG ItemCount;
ULONG ItemCountAllocated;
PHID_REPORT_ITEM * Items;
//ULONG ReportCount;
//struct HID_REPORT ** Reports;
ULONG ReportCount;
struct _HID_REPORT ** Reports;
}HID_COLLECTION, *PHID_COLLECTION;
typedef struct
typedef struct _HID_REPORT
{
UCHAR Type;
UCHAR ReportID;
@ -227,9 +228,6 @@ typedef struct
ULONG ItemAllocated;
PHID_REPORT_ITEM* Items;
ULONG ReportStatus;
UCHAR * CurrentReport;
ULONG BusyCount;
}HID_REPORT, *PHID_REPORT;
typedef struct
@ -249,21 +247,16 @@ typedef struct
//
PHID_COLLECTION RootCollection;
//
// report count
//
ULONG ReportCount;
//
// reports
//
PHID_REPORT * Reports;
//
// uses report ids
//
UCHAR UseReportIDs;
//
// collection index
//
ULONG CollectionIndex;
}HID_PARSER_CONTEXT, *PHID_PARSER_CONTEXT;
HIDPARSER_STATUS
@ -280,11 +273,6 @@ HidParser_NumberOfTopCollections(
#define HID_REPORT_TYPE_OUTPUT 0x02
#define HID_REPORT_TYPE_FEATURE 0x04
ULONG
HidParser_NumberOfReports(
IN PHID_PARSER Parser,
IN ULONG ReportType);
HIDPARSER_STATUS
HidParser_GetCollectionUsagePage(
IN PHID_PARSER Parser,
@ -295,6 +283,7 @@ HidParser_GetCollectionUsagePage(
ULONG
HidParser_GetReportLength(
IN PHID_PARSER Parser,
IN ULONG CollectionIndex,
IN ULONG ReportType);
UCHAR
@ -304,17 +293,20 @@ HidParser_IsReportIDUsed(
ULONG
HidParser_GetReportItemCountFromReportType(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType);
ULONG
HidParser_GetReportItemTypeCountFromReportType(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType,
IN ULONG bData);
ULONG
HidParser_GetContextSize(
IN PHID_PARSER Parser);
IN PHID_PARSER Parser,
IN ULONG CollectionNumber);
VOID
HidParser_FreeContext(
@ -329,12 +321,14 @@ HidParser_GetTotalCollectionCount(
ULONG
HidParser_GetMaxUsageListLengthWithReportAndPage(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType,
IN USAGE UsagePage OPTIONAL);
HIDPARSER_STATUS
HidParser_GetSpecificValueCapsWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType,
IN USHORT UsagePage,
IN USHORT Usage,
@ -345,6 +339,7 @@ HidParser_GetSpecificValueCapsWithReport(
HIDPARSER_STATUS
HidParser_GetUsagesWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType,
IN USAGE UsagePage,
OUT USAGE *UsageList,
@ -355,9 +350,15 @@ HidParser_GetUsagesWithReport(
HIDPARSER_STATUS
HidParser_GetScaledUsageValueWithReport(
IN PHID_PARSER Parser,
IN ULONG CollectionNumber,
IN ULONG ReportType,
IN USAGE UsagePage,
IN USAGE Usage,
OUT PLONG UsageValue,
IN PCHAR ReportDescriptor,
IN ULONG ReportDescriptorLength);
ULONG
HidParser_GetCollectionNumberFromParserContext(
IN PHID_PARSER Parser);