Annotation of XNU/iokit/Families/IOHIDSystem/IOHIDDescriptorParser/HIDNextItem.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:           HIDNextItem.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:                (JRH)   Rhoads Hollowell
                     43:                (BWS)   Brent Schorsch
                     44: 
                     45:        Change History (most recent first):
                     46: 
                     47:          <USB4>         11/3/99        DF              And now I get to add the code to actually fix the checkin below.
                     48:          <USB3>         11/1/99        BWS             Fix long item calc error, fix by Dave Ferguson
                     49:          <USB2>          6/1/99        JRH             Get rid of an uninitialized variable warning. It turns out that
                     50:                                                                        with the code flow it was never being used before being
                     51:                                                                        initialized, but the compiler was complaining.
                     52:          <USB1>          3/5/99        BWS             first checked in
                     53: */
                     54: 
                     55: #include "HIDLib.h"
                     56: 
                     57: /*
                     58:  *-----------------------------------------------------------------------------
                     59:  *
                     60:  * HIDNextItem - Get the Next Item
                     61:  *
                     62:  *      Input:
                     63:  *                       ptDescriptor                  - Descriptor Structure
                     64:  *      Output:
                     65:  *                       ptItem                                - Caller-provided Item Structure
                     66:  *      Returns:
                     67:  *                       kHIDSuccess             - Success
                     68:  *                       kHIDEndOfDescriptorErr - End of the HID Report Descriptor
                     69:  *
                     70:  *-----------------------------------------------------------------------------
                     71: */
                     72: OSStatus HIDNextItem(HIDReportDescriptor *ptDescriptor)
                     73: {
                     74:        HIDItem *ptItem;
                     75:        unsigned char iHeader;
                     76:        unsigned char *psD;
                     77:        int i;
                     78:        int iLength;
                     79:        UInt32 *piX;
                     80:        int iSize;
                     81:        int iByte = 0;
                     82: /*
                     83:  *     Disallow Null Pointers
                     84: */
                     85:        if (ptDescriptor==NULL)
                     86:                return kHIDNullPointerErr;
                     87: /*
                     88:  *     Use local pointers
                     89: */
                     90:        ptItem = &ptDescriptor->item;
                     91:        psD = ptDescriptor->descriptor;
                     92:        piX = &ptDescriptor->index;
                     93:        iLength = ptDescriptor->descriptorLength;
                     94: /*
                     95:  *     Don't go past the end of the buffer
                     96: */
                     97:        if (*piX >= iLength)
                     98:                return kHIDEndOfDescriptorErr;
                     99: /*
                    100:  *     Get the header byte
                    101: */
                    102:        iHeader = psD[(*piX)++];
                    103: /*
                    104:  *     Don't go past the end of the buffer
                    105: */
                    106:        if (*piX > iLength)
                    107:                return kHIDEndOfDescriptorErr;
                    108:        ptItem->itemType = iHeader;
                    109:        ptItem->itemType &= kHIDItemTypeMask;
                    110:        ptItem->itemType >>= kHIDItemTypeShift;
                    111: /*
                    112:  *     Long Item Header
                    113:  *     Skip Long Items!
                    114: */
                    115:        if (iHeader==kHIDLongItemHeader)
                    116:        {
                    117:                iSize = psD[(*piX)++];
                    118:                ptItem->tag = *piX++;
                    119:        }
                    120: /*
                    121:  *     Short Item Header
                    122: */
                    123:        else
                    124:        {
                    125:                iSize = iHeader;
                    126:                iSize &= kHIDItemSizeMask;
                    127:                if (iSize==3)
                    128:                        iSize = 4;
                    129:                ptItem->byteCount = iSize;
                    130:                ptItem->tag = iHeader;
                    131:                ptItem->tag &= kHIDItemTagMask;
                    132:                ptItem->tag >>= kHIDItemTagShift;
                    133:        }
                    134: /*
                    135:  *     Don't go past the end of the buffer
                    136: */
                    137:        if ((*piX + iSize) > iLength)
                    138:                return kHIDEndOfDescriptorErr;
                    139: /*
                    140:  *     Pick up the data
                    141: */
                    142:        ptItem->unsignedValue = 0;
                    143:        if (iSize==0)
                    144:        {
                    145:                ptItem->signedValue = 0;
                    146:                return kHIDSuccess;
                    147:        }
                    148: /*
                    149:  *     Get the data bytes
                    150: */
                    151:        for (i = 0; i < iSize; i++)
                    152:        {
                    153:                iByte = psD[(*piX)++];
                    154:                ptItem->unsignedValue |= (iByte << (i*8));
                    155:        }
                    156: /*
                    157:  *     Keep one value unsigned
                    158: */
                    159:        ptItem->signedValue = ptItem->unsignedValue;
                    160: /*
                    161:  *     Sign extend one value
                    162: */
                    163:        if ((iByte & 0x80) != 0)
                    164:        {
                    165:                while (i < sizeof(int))
                    166:                        ptItem->signedValue |= (0xFF << ((i++)*8));
                    167:        }
                    168:        return kHIDSuccess;
                    169: }

unix.superglobalmegacorp.com

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