HIDProcessReportItem.c [plain text]
#include "HIDLib.h"
OSStatus HIDProcessReportItem(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData)
{
OSStatus error = noErr;
HIDReportItem *ptReportItem;
HIDReportSizes *ptReport;
int iBits;
if ((ptDescriptor == NULL) || (ptPreparsedData == NULL))
return kHIDNullPointerErr;
ptReportItem = &ptPreparsedData->reportItems[ptPreparsedData->reportItemCount++];
ptReportItem->dataModes = ptDescriptor->item.unsignedValue;
ptReportItem->globals = ptDescriptor->globals;
ptReportItem->flags = 0;
{
SInt32 posSize = (ptReportItem->globals.reportSize >= 32) ?
31 : ptReportItem->globals.reportSize;
SInt32 realMax = (1<<posSize) - 1;
if (ptReportItem->globals.logicalMinimum > realMax)
{
error = kHIDBadLogicalMinimumErr;
ptReportItem->globals.logicalMinimum = 0;
}
if (ptReportItem->globals.logicalMaximum > realMax)
{
if (error == noErr)
error = kHIDBadLogicalMaximumErr;
ptReportItem->globals.logicalMaximum = realMax;
}
if (ptReportItem->globals.logicalMinimum > ptReportItem->globals.logicalMaximum)
{
SInt32 temp;
if (error == noErr)
error = kHIDInvertedLogicalRangeErr;
ptReportItem->flags |= kHIDReportItemFlag_Reversed;
temp = ptReportItem->globals.logicalMaximum;
ptReportItem->globals.logicalMaximum = ptReportItem->globals.logicalMinimum;
ptReportItem->globals.logicalMinimum = temp;
}
}
if ((error == noErr) && (ptDescriptor->haveUsageMin || ptDescriptor->haveUsageMax))
error = kHIDUnmatchedUsageRangeErr;
if ((error == noErr) && (ptDescriptor->haveStringMin || ptDescriptor->haveStringMax))
error = kHIDUnmatchedStringRangeErr;
if ((error == noErr) && (ptDescriptor->haveDesigMin || ptDescriptor->haveDesigMax))
error = kHIDUnmatchedDesignatorRangeErr;
if (ptReportItem->globals.physicalMinimum >= ptReportItem->globals.physicalMaximum)
{
if ((error == noErr) &&
(ptReportItem->globals.physicalMinimum > ptReportItem->globals.physicalMaximum))
error = kHIDInvertedPhysicalRangeErr;
ptReportItem->globals.physicalMinimum = ptReportItem->globals.logicalMinimum;
ptReportItem->globals.physicalMaximum = ptReportItem->globals.logicalMaximum;
}
if (error != noErr && ptPreparsedData->flags & kHIDFlag_StrictErrorChecking)
return error;
ptReportItem->parent = ptDescriptor->parent;
ptReportItem->firstUsageItem = ptDescriptor->firstUsageItem;
ptDescriptor->firstUsageItem = ptPreparsedData->usageItemCount;
ptReportItem->usageItemCount = ptPreparsedData->usageItemCount - ptReportItem->firstUsageItem;
ptReportItem->firstStringItem = ptDescriptor->firstStringItem;
ptDescriptor->firstStringItem = ptPreparsedData->stringItemCount;
ptReportItem->stringItemCount = ptPreparsedData->stringItemCount - ptReportItem->firstStringItem;
ptReportItem->firstDesigItem = ptDescriptor->firstDesigItem;
ptDescriptor->firstDesigItem = ptPreparsedData->desigItemCount;
ptReportItem->desigItemCount = ptPreparsedData->desigItemCount - ptReportItem->firstDesigItem;
ptReport = &ptPreparsedData->reports[ptReportItem->globals.reportIndex];
iBits = ptReportItem->globals.reportSize * ptReportItem->globals.reportCount;
switch (ptDescriptor->item.tag)
{
case kHIDTagFeature:
ptReportItem->reportType = kHIDFeatureReport;
ptReportItem->startBit = ptReport->featureBitCount;
ptReport->featureBitCount += iBits;
break;
case kHIDTagOutput:
ptReportItem->reportType = kHIDOutputReport;
ptReportItem->startBit = ptReport->outputBitCount;
ptReport->outputBitCount += iBits;
break;
case kHIDTagInput:
ptReportItem->reportType = kHIDInputReport;
ptReportItem->startBit = ptReport->inputBitCount;
ptReport->inputBitCount += iBits;
break;
default:
ptReportItem->reportType = kHIDUnknownReport;
ptReportItem->startBit = 0;
break;
}
return kHIDSuccess;
}