Annotation of XNU/iokit/Families/IOHIDSystem/IOHIDDescriptorParser/HIDGetButtonCaps.c, revision 1.1.1.1

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:           HIDGetButtonCaps.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:          <USB4>         11/1/99        BWS             [2405720]  We need a better check for 'bit padding' items,
                     46:                                                                        rather than just is constant. We will check to make sure the
                     47:                                                                        item is constant, and has no usage, or zero usage. This means we
                     48:                                                                        need to pass an additional parameter to some internal functions
                     49:          <USB3>          5/3/99        BWS             We were not setting isStringRange, isDesignatorRange, and
                     50:                                                                        isAbsolute
                     51:          <USB2>          3/7/99        BWS             When range/notRange were made a union, we missed this case where
                     52:                                                                        they were both being set indescriminately
                     53:          <USB1>          3/5/99        BWS             first checked in
                     54: */
                     55: 
                     56: #include "HIDLib.h"
                     57: 
                     58: /*
                     59:  *------------------------------------------------------------------------------
                     60:  *
                     61:  * HIDGetSpecificButtonCaps - Get the binary values for a report type
                     62:  *
                     63:  *      Input:
                     64:  *                       reportType               - HIDP_Input, HIDP_Output, HIDP_Feature
                     65:  *                       usagePage                        - Page Criteria or zero
                     66:  *                       iCollection                   - Collection Criteria or zero
                     67:  *                       usage                            - usage Criteria or zero
                     68:  *                       buttonCaps              - ButtonCaps Array
                     69:  *                       piButtonCapsLength    - Maximum Entries
                     70:  *                       ptPreparsedData               - Pre-Parsed Data
                     71:  *      Output:
                     72:  *                       piButtonCapsLength    - Entries Populated
                     73:  *      Returns:
                     74:  *
                     75:  *------------------------------------------------------------------------------
                     76: */
                     77: OSStatus HIDGetSpecificButtonCaps(HIDReportType reportType,
                     78:                                                                           HIDUsage usagePage,
                     79:                                                                           UInt32 iCollection,
                     80:                                                                           HIDUsage usage,
                     81:                                                                           HIDButtonCapsPtr buttonCaps,
                     82:                                                                           UInt32 *piButtonCapsLength,
                     83:                                                                           HIDPreparsedDataRef preparsedDataRef)
                     84: {
                     85:        HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef;
                     86:        HIDCollection *ptCollection;
                     87:        HIDCollection *ptParent;
                     88:        HIDReportItem *ptReportItem;
                     89:        HIDP_UsageItem *ptUsageItem;
                     90:        HIDStringItem *ptStringItem;
                     91:        HIDDesignatorItem *ptDesignatorItem;
                     92:        HIDP_UsageItem *ptFirstCollectionUsageItem;
                     93:        HIDButtonCaps *ptCapability;
                     94:        int iR, iU;
                     95:        int parent;
                     96:        int iReportItem, iUsageItem;
                     97:        int iMaxCaps;
                     98:         UInt32 startBit;
                     99: /*
                    100:  *     Disallow Null Pointers
                    101: */
                    102:        if ((buttonCaps == NULL)
                    103:         || (piButtonCapsLength == NULL)
                    104:         || (ptPreparsedData == NULL))
                    105:                return kHIDNullPointerErr;
                    106:        if (ptPreparsedData->hidTypeIfValid != kHIDOSType)
                    107:                return kHIDInvalidPreparsedDataErr;
                    108: /*
                    109:  *     Save the buffer size
                    110: */
                    111:        iMaxCaps = *piButtonCapsLength;
                    112:        *piButtonCapsLength = 0;
                    113: /*
                    114:  *     The Collection must be in range
                    115: */
                    116:        if ((iCollection < 0) || (iCollection >= ptPreparsedData->collectionCount))
                    117:                return kHIDBadParameterErr;
                    118: /*
                    119:  *     Search only the scope of the Collection specified
                    120: */
                    121:        ptCollection = &ptPreparsedData->collections[iCollection];
                    122:        for (iR=0; iR<ptCollection->reportItemCount; iR++)
                    123:        {
                    124:                iReportItem = ptCollection->firstReportItem + iR;
                    125:                ptReportItem = &ptPreparsedData->reportItems[iReportItem];
                    126: /*
                    127:  *             Search only reports of the proper type
                    128: */
                    129:                if ((ptReportItem->reportType == reportType)
                    130:                 && HIDIsButton(ptReportItem, preparsedDataRef))
                    131:                {
                    132:                         startBit = ptReportItem->startBit;
                    133: /*
                    134:  *                     Search the usages
                    135: */
                    136:                          for (iU=0; iU<ptReportItem->usageItemCount; iU++)
                    137:                          {
                    138: /*
                    139:  *                               Copy all usages if the usage above is zero
                    140:  *                                     or copy all that are "match"
                    141: */
                    142:                                  iUsageItem = ptReportItem->firstUsageItem + iU;
                    143:                                  ptUsageItem = &ptPreparsedData->usageItems[iUsageItem];
                    144: 
                    145:                                  // �� we assume there is a 1-1 corresponence between usage items, string items, and designator items
                    146:                                  // ���this is not necessarily the case, but its better than nothing
                    147:                                  ptStringItem = &ptPreparsedData->stringItems[ptReportItem->firstStringItem + iU];
                    148:                                  ptDesignatorItem = &ptPreparsedData->desigItems[ptReportItem->firstDesigItem + iU];
                    149: 
                    150:                                  if (HIDUsageInRange(ptUsageItem,usagePage,usage))
                    151:                                  {
                    152: /*
                    153:  *                                       Only copy if there's room
                    154: */
                    155:                                          if (*piButtonCapsLength >= iMaxCaps)
                    156:                                                  return kHIDBufferTooSmallErr;
                    157:                                          ptCapability = &buttonCaps[(*piButtonCapsLength)++];
                    158: /*
                    159:  *                                       Populate the Capability Structure
                    160: */
                    161:                                          parent = ptReportItem->parent;
                    162:                                          ptParent = &ptPreparsedData->collections[parent];
                    163:                                          ptFirstCollectionUsageItem
                    164:                                                 = &ptPreparsedData->usageItems[ptParent->firstUsageItem];
                    165:                                          ptCapability->collection = parent;
                    166:                                          ptCapability->collectionUsagePage = ptParent->usagePage;
                    167:                                          ptCapability->collectionUsage = ptFirstCollectionUsageItem->usage;
                    168:                                          ptCapability->bitField =      ptReportItem->dataModes;
                    169:                                          ptCapability->reportID = ptReportItem->globals.reportID;
                    170:                                          ptCapability->usagePage = ptUsageItem->usagePage;
                    171:                                          
                    172:                                          ptCapability->isStringRange = false;                  // �� todo: set this and stringMin,stringMax,stringIndex
                    173:                                          ptCapability->isDesignatorRange = false;              // �� todo: set this and designatorMin,designatorMax,designatorIndex
                    174:                                          ptCapability->isAbsolute = !(ptReportItem->dataModes & kHIDDataRelative);
                    175: 
                    176:                                          ptCapability->isRange = ptUsageItem->isRange;
                    177:                                          if (ptUsageItem->isRange)
                    178:                                          {
                    179:                                                ptCapability->u.range.usageMin = ptUsageItem->usageMinimum;
                    180:                                                ptCapability->u.range.usageMax = ptUsageItem->usageMaximum;
                    181:                                          }
                    182:                                          else
                    183:                                                ptCapability->u.notRange.usage = ptUsageItem->usage;
                    184: 
                    185:                                          // if there really are that many items
                    186:                                          if (iU < ptReportItem->stringItemCount)
                    187:                                          {
                    188:                                                  ptCapability->isStringRange = ptStringItem->isRange;
                    189:                                                  
                    190:                                                  if (ptStringItem->isRange)
                    191:                                                  {
                    192:                                                        ptCapability->u.range.stringMin = ptStringItem->minimum;
                    193:                                                        ptCapability->u.range.stringMax = ptStringItem->maximum;
                    194:                                                  }
                    195:                                                  else
                    196:                                                        ptCapability->u.notRange.stringIndex = ptStringItem->index;
                    197:                                          }
                    198:                                          // default, clear it
                    199:                                          else
                    200:                                          {
                    201:                                                ptCapability->isStringRange = false;
                    202:                                                ptCapability->u.notRange.stringIndex = 0;
                    203:                                          }
                    204: 
                    205:                                          // if there really are that many items
                    206:                                          if (iU < ptReportItem->desigItemCount)
                    207:                                          {
                    208:                                                  ptCapability->isDesignatorRange = ptDesignatorItem->isRange;
                    209:                                                  
                    210:                                                  if (ptDesignatorItem->isRange)
                    211:                                                  {
                    212:                                                        ptCapability->u.range.designatorMin = ptDesignatorItem->minimum;
                    213:                                                        ptCapability->u.range.designatorMax = ptDesignatorItem->maximum;
                    214:                                                  }
                    215:                                                  else
                    216:                                                        ptCapability->u.notRange.designatorIndex = ptDesignatorItem->index;
                    217:                                          }
                    218:                                          // default, clear it
                    219:                                          else
                    220:                                          {
                    221:                                                ptCapability->isDesignatorRange = false;
                    222:                                                ptCapability->u.notRange.designatorIndex = 0;
                    223:                                          }
                    224:                                           ptCapability->startBit = startBit;
                    225:                                  }
                    226:                                   startBit += (ptReportItem->globals.reportSize * ptReportItem->globals.reportCount);
                    227:                          }
                    228:                }
                    229:        }
                    230:        return kHIDSuccess;
                    231: }
                    232: 
                    233: /*
                    234:  *------------------------------------------------------------------------------
                    235:  *
                    236:  * HIDGetButtonCaps - Get the binary values for a report type
                    237:  *
                    238:  *      Input:
                    239:  *                       reportType               - HIDP_Input, HIDP_Output, HIDP_Feature
                    240:  *                       buttonCaps              - ButtonCaps Array
                    241:  *                       piButtonCapsLength    - Maximum Entries
                    242:  *                       ptPreparsedData               - Pre-Parsed Data
                    243:  *      Output:
                    244:  *                       piButtonCapsLength    - Entries Populated
                    245:  *      Returns:
                    246:  *
                    247:  *------------------------------------------------------------------------------
                    248: */
                    249: OSStatus HIDGetButtonCaps(HIDReportType reportType,
                    250:                                                           HIDButtonCapsPtr buttonCaps,
                    251:                                                           UInt32 *piButtonCapsLength,
                    252:                                                           HIDPreparsedDataRef preparsedDataRef)
                    253: {
                    254:        return HIDGetSpecificButtonCaps(reportType,0,0,0,buttonCaps,
                    255:                                                                          piButtonCapsLength,preparsedDataRef);
                    256: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.