#include "HIDLib.h"
#if 0 // Moving to Capabilities instead of Caps.
OSStatus HIDGetCaps(HIDPreparsedDataRef preparsedDataRef, HIDCapsPtr ptCapabilities)
{
HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef;
HIDCollection *ptCollection;
HIDReportItem *ptReportItem;
HIDReportSizes *ptReport;
int iFirstUsage;
int i;
if ((ptPreparsedData == NULL) || (ptCapabilities == NULL))
return kHIDNullPointerErr;
if (ptPreparsedData->hidTypeIfValid != kHIDOSType)
return kHIDInvalidPreparsedDataErr;
ptCollection = &ptPreparsedData->collections[1];
ptCapabilities->usagePage = ptCollection->usagePage;
iFirstUsage = ptCollection->firstUsageItem;
ptCapabilities->usage = ptPreparsedData->usageItems[iFirstUsage].usage;
ptCapabilities->numberCollectionNodes = ptPreparsedData->collectionCount;
ptCapabilities->inputReportByteLength = 0;
ptCapabilities->outputReportByteLength = 0;
ptCapabilities->featureReportByteLength = 0;
for (i=0; i<ptPreparsedData->reportCount; i++)
{
ptReport = &ptPreparsedData->reports[i];
if (ptCapabilities->inputReportByteLength < ptReport->inputBitCount)
ptCapabilities->inputReportByteLength = ptReport->inputBitCount;
if (ptCapabilities->outputReportByteLength < ptReport->outputBitCount)
ptCapabilities->outputReportByteLength = ptReport->outputBitCount;
if (ptCapabilities->featureReportByteLength < ptReport->featureBitCount)
ptCapabilities->featureReportByteLength = ptReport->featureBitCount;
}
ptCapabilities->inputReportByteLength = (ptCapabilities->inputReportByteLength + 7) /8;
ptCapabilities->outputReportByteLength = (ptCapabilities->outputReportByteLength + 7)/8;
ptCapabilities->featureReportByteLength = (ptCapabilities->featureReportByteLength + 7)/8;
ptCapabilities->numberInputButtonCaps = 0;
ptCapabilities->numberInputValueCaps = 0;
ptCapabilities->numberOutputButtonCaps = 0;
ptCapabilities->numberOutputValueCaps = 0;
ptCapabilities->numberFeatureButtonCaps = 0;
ptCapabilities->numberFeatureValueCaps = 0;
for (i=0; i<ptPreparsedData->reportItemCount; i++)
{
ptReportItem = &ptPreparsedData->reportItems[i];
switch (ptReportItem->reportType)
{
case kHIDInputReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberInputButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberInputValueCaps += ptReportItem->usageItemCount;
break;
case kHIDOutputReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberOutputButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberOutputValueCaps += ptReportItem->usageItemCount;
break;
case kHIDFeatureReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberFeatureButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberFeatureValueCaps += ptReportItem->usageItemCount;
break;
}
}
return kHIDSuccess;
}
#endif
OSStatus HIDGetCapabilities(HIDPreparsedDataRef preparsedDataRef, HIDCapabilitiesPtr ptCapabilities)
{
HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef;
HIDCollection *ptCollection;
HIDReportItem *ptReportItem;
HIDReportSizes *ptReport;
int iFirstUsage;
int i;
if ((ptPreparsedData == NULL) || (ptCapabilities == NULL))
return kHIDNullPointerErr;
if (ptPreparsedData->hidTypeIfValid != kHIDOSType)
return kHIDInvalidPreparsedDataErr;
ptCollection = &ptPreparsedData->collections[1];
ptCapabilities->usagePage = ptCollection->usagePage;
iFirstUsage = ptCollection->firstUsageItem;
ptCapabilities->usage = ptPreparsedData->usageItems[iFirstUsage].usage;
ptCapabilities->numberCollectionNodes = ptPreparsedData->collectionCount;
ptCapabilities->inputReportByteLength = 0;
ptCapabilities->outputReportByteLength = 0;
ptCapabilities->featureReportByteLength = 0;
for (i=0; i<ptPreparsedData->reportCount; i++)
{
ptReport = &ptPreparsedData->reports[i];
if (ptCapabilities->inputReportByteLength < ptReport->inputBitCount)
ptCapabilities->inputReportByteLength = ptReport->inputBitCount;
if (ptCapabilities->outputReportByteLength < ptReport->outputBitCount)
ptCapabilities->outputReportByteLength = ptReport->outputBitCount;
if (ptCapabilities->featureReportByteLength < ptReport->featureBitCount)
ptCapabilities->featureReportByteLength = ptReport->featureBitCount;
}
ptCapabilities->inputReportByteLength = (ptCapabilities->inputReportByteLength + 7) /8;
ptCapabilities->outputReportByteLength = (ptCapabilities->outputReportByteLength + 7)/8;
ptCapabilities->featureReportByteLength = (ptCapabilities->featureReportByteLength + 7)/8;
ptCapabilities->numberInputButtonCaps = 0;
ptCapabilities->numberInputValueCaps = 0;
ptCapabilities->numberOutputButtonCaps = 0;
ptCapabilities->numberOutputValueCaps = 0;
ptCapabilities->numberFeatureButtonCaps = 0;
ptCapabilities->numberFeatureValueCaps = 0;
for (i=0; i<ptPreparsedData->reportItemCount; i++)
{
ptReportItem = &ptPreparsedData->reportItems[i];
switch (ptReportItem->reportType)
{
case kHIDInputReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberInputButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberInputValueCaps += ptReportItem->usageItemCount;
break;
case kHIDOutputReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberOutputButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberOutputValueCaps += ptReportItem->usageItemCount;
break;
case kHIDFeatureReport:
if (HIDIsButton(ptReportItem, preparsedDataRef))
ptCapabilities->numberFeatureButtonCaps += ptReportItem->usageItemCount;
else if (HIDIsVariable(ptReportItem, preparsedDataRef))
ptCapabilities->numberFeatureValueCaps += ptReportItem->usageItemCount;
break;
}
}
return kHIDSuccess;
}