Annotation of XNU/iokit/Families/IOHIDSystem/IOHIDDescriptorParser/HIDCountDescriptorItems.c, revision 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:           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: }

unix.superglobalmegacorp.com

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