|
|
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: HIDCountDescriptorItems.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: (BWS) Brent Schorsch ! 42: ! 43: Change History (most recent first): ! 44: ! 45: <USB1> 3/5/99 BWS first checked in ! 46: */ ! 47: ! 48: #include "HIDLib.h" ! 49: ! 50: //#include <stdlib.h> ! 51: ! 52: /* ! 53: *------------------------------------------------------------------------------ ! 54: * ! 55: * HIDCountDescriptorItems ! 56: * ! 57: * Input: ! 58: * ptDescriptor - Descriptor Pointer Structure ! 59: * ptPreparsedData - The PreParsedData Structure ! 60: * Output: ! 61: * ptPreparsedData - The PreParsedData Structure ! 62: * Returns: ! 63: * kHIDSuccess - Success ! 64: * kHIDNullPointerErr - Argument, Pointer was Null ! 65: * ! 66: *------------------------------------------------------------------------------ ! 67: */ ! 68: OSStatus HIDCountDescriptorItems(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData) ! 69: { ! 70: OSStatus iStatus; ! 71: ByteCount iSpaceRequired; ! 72: HIDItem *ptItem; ! 73: Byte *pMem; ! 74: /* ! 75: * Initialize Counters ! 76: */ ! 77: int collectionCount = 1; ! 78: int reportItemCount = 0; ! 79: int iUsages = 0; ! 80: int iUsageRanges = 0; ! 81: int iStrings = 0; ! 82: int iStringRanges = 0; ! 83: int iDesigs = 0; ! 84: int iDesigRanges = 0; ! 85: int reportCount = 1; ! 86: int globalsNesting = 0; ! 87: int iMaxGlobalsNesting = 0; ! 88: int collectionNesting = 0; ! 89: int iMaxCollectionNesting = 0; ! 90: /* ! 91: * Disallow NULL Pointers ! 92: */ ! 93: if ((ptDescriptor == NULL) || (ptPreparsedData == NULL)) ! 94: return kHIDNullPointerErr; ! 95: /* ! 96: * Initialize the memory allocation pointer ! 97: */ ! 98: ptPreparsedData->rawMemPtr = NULL; ! 99: /* ! 100: * Initialize the Descriptor Pointer Structure ! 101: */ ! 102: ptDescriptor->index = 0; ! 103: ptItem = &ptDescriptor->item; ! 104: /* ! 105: * Count various items in the descriptor ! 106: */ ! 107: while ((iStatus = HIDNextItem(ptDescriptor)) == kHIDSuccess) ! 108: { ! 109: switch (ptItem->itemType) ! 110: { ! 111: case kHIDTypeMain: ! 112: switch (ptItem->tag) ! 113: { ! 114: case kHIDTagCollection: ! 115: collectionCount++; ! 116: collectionNesting++; ! 117: if (collectionNesting > iMaxCollectionNesting) ! 118: iMaxCollectionNesting = collectionNesting; ! 119: break; ! 120: case kHIDTagEndCollection: ! 121: if (collectionNesting-- == 0) ! 122: return kHIDInvalidPreparsedDataErr; ! 123: break; ! 124: case kHIDTagInput: ! 125: case kHIDTagOutput: ! 126: case kHIDTagFeature: ! 127: reportItemCount++; ! 128: break; ! 129: } ! 130: break; ! 131: case kHIDTypeGlobal: ! 132: switch (ptItem->tag) ! 133: { ! 134: case kHIDTagReportID: ! 135: reportCount++; ! 136: break; ! 137: case kHIDTagPush: ! 138: globalsNesting++; ! 139: if (globalsNesting > iMaxGlobalsNesting) ! 140: iMaxGlobalsNesting = globalsNesting; ! 141: break; ! 142: case kHIDTagPop: ! 143: globalsNesting--; ! 144: if (globalsNesting < 0) ! 145: return kHIDInvalidPreparsedDataErr; ! 146: break; ! 147: } ! 148: break; ! 149: case kHIDTypeLocal: ! 150: switch (ptItem->tag) ! 151: { ! 152: case kHIDTagUsage: ! 153: iUsages++; ! 154: break; ! 155: case kHIDTagUsageMinimum: ! 156: case kHIDTagUsageMaximum: ! 157: iUsageRanges++; ! 158: break; ! 159: case kHIDTagStringIndex: ! 160: iStrings++; ! 161: break; ! 162: case kHIDTagStringMinimum: ! 163: case kHIDTagStringMaximum: ! 164: iStringRanges++; ! 165: break; ! 166: case kHIDTagDesignatorIndex: ! 167: iDesigs++; ! 168: break; ! 169: case kHIDTagDesignatorMinimum: ! 170: case kHIDTagDesignatorMaximum: ! 171: iDesigRanges++; ! 172: break; ! 173: } ! 174: } ! 175: } ! 176: /* ! 177: * Disallow malformed descriptors ! 178: */ ! 179: if ((collectionNesting != 0) ! 180: || (collectionCount == 1) ! 181: || (reportItemCount == 0) ! 182: || ((iUsageRanges & 1) == 1) ! 183: || ((iStringRanges & 1) == 1) ! 184: || ((iDesigRanges & 1) == 1)) ! 185: return kHIDInvalidPreparsedDataErr; ! 186: /* ! 187: * Summarize the Indices and Ranges ! 188: */ ! 189: iUsages += (iUsageRanges/2); ! 190: iStrings += (iStringRanges/2); ! 191: iDesigs += (iDesigRanges/2); ! 192: /* ! 193: * Calculate the space needed for the structures ! 194: */ ! 195: iSpaceRequired = (sizeof(HIDCollection) * collectionCount) ! 196: + (sizeof(HIDReportItem) * reportItemCount) ! 197: + (sizeof(HIDReportSizes) * reportCount) ! 198: + (sizeof(HIDP_UsageItem) * iUsages) ! 199: + (sizeof(HIDStringItem) * iStrings) ! 200: + (sizeof(HIDDesignatorItem) * iDesigs) ! 201: + (sizeof(int) * iMaxCollectionNesting) ! 202: + (sizeof(HIDGlobalItems) * iMaxGlobalsNesting); ! 203: pMem = PoolAllocateResident(iSpaceRequired, kShouldClearMem); ! 204: ! 205: if (pMem == NULL) ! 206: return kHIDNotEnoughMemoryErr; ! 207: ptPreparsedData->rawMemPtr = pMem; ! 208: ptPreparsedData->numBytesAllocated = iSpaceRequired; ! 209: /* ! 210: * Allocate space to the various structures ! 211: */ ! 212: ptPreparsedData->collections = (HIDCollection *) pMem; ! 213: ptPreparsedData->collectionCount = 0; ! 214: pMem += (sizeof(HIDCollection) * collectionCount); ! 215: ptPreparsedData->reportItems = (HIDReportItem *) pMem; ! 216: ptPreparsedData->reportItemCount = 0; ! 217: pMem += (sizeof(HIDReportItem) * reportItemCount); ! 218: ptPreparsedData->reports = (HIDReportSizes *) pMem; ! 219: ptPreparsedData->reportCount = 0; ! 220: pMem += (sizeof(HIDReportSizes) * reportCount); ! 221: ptPreparsedData->usageItems = (HIDP_UsageItem *) pMem; ! 222: ptPreparsedData->usageItemCount = 0; ! 223: pMem += (sizeof(HIDP_UsageItem) * iUsages); ! 224: ptPreparsedData->stringItems = (HIDStringItem *) pMem; ! 225: ptPreparsedData->stringItemCount = 0; ! 226: pMem += (sizeof(HIDStringItem) * iStrings); ! 227: ptPreparsedData->desigItems = (HIDDesignatorItem *) pMem; ! 228: ptPreparsedData->desigItemCount = 0; ! 229: pMem += (sizeof(HIDDesignatorItem) * iDesigs); ! 230: ptDescriptor->collectionStack = (SInt32 *) pMem; ! 231: ptDescriptor->collectionNesting = 0; ! 232: pMem += (sizeof(SInt32) * iMaxCollectionNesting); ! 233: ptDescriptor->globalsStack = (HIDGlobalItems *) pMem; ! 234: ptDescriptor->globalsNesting = 0; ! 235: if (iStatus == kHIDEndOfDescriptorErr) ! 236: return kHIDSuccess; ! 237: return iStatus; ! 238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.