|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: File: HIDProcessGlobalItem.c ! 24: ! 25: Contains: xxx put contents here xxx ! 26: ! 27: Version: xxx put version here xxx ! 28: ! 29: Copyright: � 1999 by Apple Computer, Inc., all rights reserved. ! 30: ! 31: File Ownership: ! 32: ! 33: DRI: xxx put dri here xxx ! 34: ! 35: Other Contact: xxx put other contact here xxx ! 36: ! 37: Technology: xxx put technology here xxx ! 38: ! 39: Writers: ! 40: ! 41: (DF) David Ferguson ! 42: (BWS) Brent Schorsch ! 43: ! 44: Change History (most recent first): ! 45: ! 46: <USB2> 10/18/99 DF Lets try not reporting an error with zero report count ! 47: <USB1> 3/5/99 BWS first checked in ! 48: */ ! 49: ! 50: #include "HIDLib.h" ! 51: ! 52: /* ! 53: *------------------------------------------------------------------------------ ! 54: * ! 55: * HIDProcessGlobalItem - Process a GlobalItem ! 56: * ! 57: * Input: ! 58: * ptDescriptor - The Descriptor Structure ! 59: * ptPreparsedData - The PreParsedData Structure ! 60: * Output: ! 61: * ptDescriptor - The Descriptor Structure ! 62: * ptPreparsedData - The PreParsedData Structure ! 63: * Returns: ! 64: * kHIDSuccess - Success ! 65: * kHIDNullPointerErr - Argument, Pointer was Null ! 66: * ! 67: *------------------------------------------------------------------------------ ! 68: */ ! 69: OSStatus HIDProcessGlobalItem(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData) ! 70: { ! 71: HIDReportSizes *ptReport; ! 72: HIDGlobalItems *ptGlobals; ! 73: HIDItem *ptItem; ! 74: int reportIndex; ! 75: /* ! 76: * Disallow NULL Pointers ! 77: */ ! 78: if ((ptDescriptor == NULL) || (ptPreparsedData == NULL)) ! 79: return kHIDNullPointerErr; ! 80: /* ! 81: * Process by tag ! 82: */ ! 83: ptItem = &ptDescriptor->item; ! 84: ptGlobals = &ptDescriptor->globals; ! 85: switch (ptItem->tag) ! 86: { ! 87: /* ! 88: * usage Page ! 89: */ ! 90: case kHIDTagUsagePage: ! 91: if (ptItem->unsignedValue == 0) ! 92: return kHIDUsagePageZeroErr; ! 93: ptGlobals->usagePage = ptItem->unsignedValue; ! 94: break; ! 95: /* ! 96: * Logical Minimum ! 97: */ ! 98: case kHIDTagLogicalMinimum: ! 99: ptGlobals->logicalMinimum = ptItem->signedValue; ! 100: break; ! 101: /* ! 102: * Logical Maximum ! 103: */ ! 104: case kHIDTagLogicalMaximum: ! 105: ptGlobals->logicalMaximum = ptItem->signedValue; ! 106: break; ! 107: /* ! 108: * Physical Minimum ! 109: */ ! 110: case kHIDTagPhysicalMinimum: ! 111: ptGlobals->physicalMinimum = ptItem->signedValue; ! 112: break; ! 113: /* ! 114: * Physical Maximum ! 115: */ ! 116: case kHIDTagPhysicalMaximum: ! 117: ptGlobals->physicalMaximum = ptItem->signedValue; ! 118: break; ! 119: /* ! 120: * Unit Exponent ! 121: */ ! 122: case kHIDTagUnitExponent: ! 123: ptGlobals->unitExponent = ptItem->signedValue; ! 124: break; ! 125: /* ! 126: * Unit ! 127: */ ! 128: case kHIDTagUnit: ! 129: ptGlobals->units = ptItem->unsignedValue; ! 130: break; ! 131: /* ! 132: * Report Size in Bits ! 133: */ ! 134: case kHIDTagReportSize: ! 135: ptGlobals->reportSize = ptItem->unsignedValue; ! 136: if (ptGlobals->reportSize == 0) ! 137: return kHIDReportSizeZeroErr; ! 138: break; ! 139: /* ! 140: * Report ID ! 141: */ ! 142: case kHIDTagReportID: ! 143: if (ptItem->unsignedValue == 0) ! 144: return kHIDReportIDZeroErr; ! 145: /* ! 146: * Look for the Report ID in the table ! 147: */ ! 148: reportIndex = 0; ! 149: while ((reportIndex < ptPreparsedData->reportCount) ! 150: && (ptPreparsedData->reports[reportIndex].reportID != ptItem->unsignedValue)) ! 151: reportIndex++; ! 152: /* ! 153: * Initialize the entry if it's new and there's room for it ! 154: * Start with 8 bits for the Report ID ! 155: */ ! 156: if (reportIndex == ptPreparsedData->reportCount) ! 157: { ! 158: ptReport = &ptPreparsedData->reports[ptPreparsedData->reportCount++]; ! 159: ptReport->reportID = ptItem->unsignedValue; ! 160: ptReport->inputBitCount = 8; ! 161: ptReport->outputBitCount = 8; ! 162: ptReport->featureBitCount = 8; ! 163: } ! 164: /* ! 165: * Remember which report is being processed ! 166: */ ! 167: ptGlobals->reportID = ptItem->unsignedValue; ! 168: ptGlobals->reportIndex = reportIndex; ! 169: break; ! 170: /* ! 171: * Report Count ! 172: */ ! 173: case kHIDTagReportCount: ! 174: #if 0 ! 175: // some device actually have a report count of zero specified. we must allow it! ! 176: if (ptItem->unsignedValue == 0) ! 177: return kHIDReportCountZeroErr; ! 178: #endif ! 179: ptGlobals->reportCount = ptItem->unsignedValue; ! 180: break; ! 181: /* ! 182: * Push Globals ! 183: */ ! 184: case kHIDTagPush: ! 185: ptDescriptor->globalsStack[ptDescriptor->globalsNesting++] = ptDescriptor->globals; ! 186: break; ! 187: /* ! 188: * Pop Globals ! 189: */ ! 190: case kHIDTagPop: ! 191: ptDescriptor->globals = ptDescriptor->globalsStack[--ptDescriptor->globalsNesting]; ! 192: break; ! 193: } ! 194: return kHIDSuccess; ! 195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.