Annotation of XNU/iokit/Families/IOHIDSystem/IOHIDDescriptorParser/HIDNextItem.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:           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.