HIDParseDescriptor.c [plain text]
#include "HIDLib.h"
OSStatus HIDParseDescriptor(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData)
{
OSStatus iStatus;
HIDItem *ptItem;
HIDCollection *ptCollection;
HIDReportSizes *ptReport;
if ((ptDescriptor == NULL) || (ptPreparsedData == NULL))
return kHIDNullPointerErr;
ptPreparsedData->collectionCount = 1;
ptPreparsedData->reportItemCount = 0;
ptPreparsedData->reportCount = 1;
ptPreparsedData->usageItemCount = 0;
ptPreparsedData->stringItemCount = 0;
ptPreparsedData->desigItemCount = 0;
ptDescriptor->index = 0;
ptDescriptor->collectionNesting = 0;
ptDescriptor->globalsNesting = 0;
ptDescriptor->firstUsageItem = 0;
ptDescriptor->firstStringItem = 0;
ptDescriptor->firstDesigItem = 0;
ptDescriptor->parent = 0;
ptDescriptor->sibling = 0;
ptDescriptor->globals.usagePage = 0;
ptDescriptor->globals.logicalMinimum = 0;
ptDescriptor->globals.logicalMaximum = 0;
ptDescriptor->globals.physicalMinimum = 0;
ptDescriptor->globals.physicalMaximum = 0;
ptDescriptor->globals.unitExponent = 0;
ptDescriptor->globals.units = 0;
ptDescriptor->globals.reportSize = 0;
ptDescriptor->globals.reportID = 0;
ptDescriptor->globals.reportCount = 0;
ptDescriptor->globals.reportIndex = 0;
ptDescriptor->haveUsageMin = false;
ptDescriptor->haveUsageMax = false;
ptDescriptor->haveStringMin = false;
ptDescriptor->haveStringMax = false;
ptDescriptor->haveDesigMin = false;
ptDescriptor->haveDesigMax = false;
ptItem = &ptDescriptor->item;
ptCollection = ptPreparsedData->collections;
ptCollection->data = 0;
ptCollection->usagePage = 0;
ptCollection->firstUsageItem = 0;
ptCollection->usageItemCount = 0;
ptCollection->firstReportItem = 0;
ptCollection->reportItemCount = 0;
ptCollection->parent = 0;
ptCollection->children = 0;
ptCollection->firstChild = 0;
ptCollection->nextSibling = 0;
ptReport = ptPreparsedData->reports;
ptReport->reportID = 0;
ptReport->inputBitCount = 0;
ptReport->outputBitCount = 0;
ptReport->featureBitCount = 0;
while ((iStatus = HIDNextItem(ptDescriptor)) == kHIDSuccess)
{
switch (ptItem->itemType)
{
case kHIDTypeMain:
iStatus = HIDProcessMainItem(ptDescriptor,ptPreparsedData);
break;
case kHIDTypeGlobal:
iStatus = HIDProcessGlobalItem(ptDescriptor,ptPreparsedData);
break;
case kHIDTypeLocal:
iStatus = HIDProcessLocalItem(ptDescriptor,ptPreparsedData);
break;
}
if (iStatus != kHIDSuccess)
return iStatus;
}
if (iStatus == kHIDEndOfDescriptorErr)
iStatus = kHIDSuccess;
ptCollection = ptPreparsedData->collections;
ptCollection->reportItemCount = ptPreparsedData->reportItemCount;
return iStatus;
}