]> git.saurik.com Git - apple/xnu.git/blob - iokit/Families/IOHIDSystem/IOHIDDescriptorParser/HIDParseDescriptor.c
8de229a6cc47c54fd3ead1c8b76e68127dbb39f6
[apple/xnu.git] / iokit / Families / IOHIDSystem / IOHIDDescriptorParser / HIDParseDescriptor.c
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: HIDParseDescriptor.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 <stdio.h>
51 /*
52 *------------------------------------------------------------------------------
53 *
54 * HIDParseDescriptor - Fill in the PreparsedData structures
55 *
56 * Input:
57 * ptDescriptor - Descriptor Pointer Structure
58 * ptPreparsedData - The PreParsedData Structure
59 * Output:
60 * ptPreparsedData - The PreParsedData Structure
61 * Returns:
62 * kHIDSuccess - Success
63 * kHIDNullPointerErr - Argument, Pointer was Null
64 *
65 * NOTE: HIDCountDescriptorItems MUST have been called to set up the
66 * array pointers in the HIDPreparsedData structure!
67 *
68 *------------------------------------------------------------------------------
69 */
70 OSStatus HIDParseDescriptor(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData)
71 {
72 OSStatus iStatus;
73 HIDItem *ptItem;
74 HIDCollection *ptCollection;
75 HIDReportSizes *ptReport;
76 /*
77 * Disallow NULL Pointers
78 */
79 if ((ptDescriptor == NULL) || (ptPreparsedData == NULL))
80 return kHIDNullPointerErr;
81 /*
82 * Initialize Counters
83 */
84 ptPreparsedData->collectionCount = 1;
85 ptPreparsedData->reportItemCount = 0;
86 ptPreparsedData->reportCount = 1;
87 ptPreparsedData->usageItemCount = 0;
88 ptPreparsedData->stringItemCount = 0;
89 ptPreparsedData->desigItemCount = 0;
90 /*
91 * Initialize the Descriptor Data
92 */
93 ptDescriptor->index = 0;
94 ptDescriptor->collectionNesting = 0;
95 ptDescriptor->globalsNesting = 0;
96 ptDescriptor->firstUsageItem = 0;
97 ptDescriptor->firstStringItem = 0;
98 ptDescriptor->firstDesigItem = 0;
99 ptDescriptor->parent = 0;
100 ptDescriptor->sibling = 0;
101 ptDescriptor->globals.usagePage = 0;
102 ptDescriptor->globals.logicalMinimum = 0;
103 ptDescriptor->globals.logicalMaximum = 0;
104 ptDescriptor->globals.physicalMinimum = 0;
105 ptDescriptor->globals.physicalMaximum = 0;
106 ptDescriptor->globals.unitExponent = 0;
107 ptDescriptor->globals.units = 0;
108 ptDescriptor->globals.reportSize = 0;
109 ptDescriptor->globals.reportID = 0;
110 ptDescriptor->globals.reportCount = 0;
111 ptDescriptor->globals.reportIndex = 0;
112 ptDescriptor->haveUsageMin = false;
113 ptDescriptor->haveUsageMax = false;
114 ptDescriptor->haveStringMin = false;
115 ptDescriptor->haveStringMax = false;
116 ptDescriptor->haveDesigMin = false;
117 ptDescriptor->haveDesigMax = false;
118 ptItem = &ptDescriptor->item;
119 /*
120 * Initialize the virtual collection
121 */
122 ptCollection = ptPreparsedData->collections;
123 ptCollection->data = 0;
124 ptCollection->usagePage = 0;
125 ptCollection->firstUsageItem = 0;
126 ptCollection->usageItemCount = 0;
127 ptCollection->firstReportItem = 0;
128 ptCollection->reportItemCount = 0;
129 ptCollection->parent = 0;
130 ptCollection->children = 0;
131 ptCollection->firstChild = 0;
132 ptCollection->nextSibling = 0;
133 /*
134 * Initialize the default report
135 */
136 ptReport = ptPreparsedData->reports;
137 ptReport->reportID = 0;
138 ptReport->inputBitCount = 0;
139 ptReport->outputBitCount = 0;
140 ptReport->featureBitCount = 0;
141
142 /*
143 * Parse the Descriptor
144 */
145 while ((iStatus = HIDNextItem(ptDescriptor)) == kHIDSuccess)
146 {
147 switch (ptItem->itemType)
148 {
149 case kHIDTypeMain:
150 iStatus = HIDProcessMainItem(ptDescriptor,ptPreparsedData);
151 break;
152 case kHIDTypeGlobal:
153 iStatus = HIDProcessGlobalItem(ptDescriptor,ptPreparsedData);
154 break;
155 case kHIDTypeLocal:
156 iStatus = HIDProcessLocalItem(ptDescriptor,ptPreparsedData);
157 break;
158 }
159 if (iStatus != kHIDSuccess)
160 return iStatus;
161 }
162 if (iStatus == kHIDEndOfDescriptorErr)
163 iStatus = kHIDSuccess;
164 /*
165 * Update the virtual collection
166 */
167 ptCollection = ptPreparsedData->collections;
168 ptCollection->reportItemCount = ptPreparsedData->reportItemCount;
169 /*
170 * Mark the PreparsedData initialized
171 */
172 return iStatus;
173 }