Annotation of driverkit/libDriver/IODeviceDescription.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*     Copyright (c) 1993 NeXT Computer, Inc.  All rights reserved. 
                     25:  *
                     26:  * IODeviceDescription.m.
                     27:  *
                     28:  * HISTORY
                     29:  * 08-Jan-93    Doug Mitchell at NeXT
                     30:  *      Created. 
                     31:  */
                     32: 
                     33: #import <objc/List.h>
                     34: #import <driverkit/IODeviceDescription.h>
                     35: #import <driverkit/IODeviceDescriptionPrivate.h>
                     36: #import <driverkit/KernBus.h>
                     37: #import <driverkit/KernDeviceDescription.h>
                     38: 
                     39: struct _private {
                     40:     unsigned int       *interrupts;
                     41:     unsigned int       numInterrupts;
                     42:     IORange            *memoryRanges;
                     43:     unsigned int       numMemoryRanges;
                     44: };
                     45: 
                     46: @implementation IODeviceDescription
                     47: 
                     48: - init
                     49: {
                     50:     return [self _initWithDelegate:nil];
                     51: }
                     52: 
                     53: - free
                     54: {
                     55:     struct _private    *private = _private;
                     56:     
                     57:     if (private->numInterrupts > 0)
                     58:        IOFree(private->interrupts,
                     59:                private->numInterrupts * sizeof (*private->interrupts));
                     60:     if (private->numMemoryRanges > 0)
                     61:        IOFree(private->memoryRanges,
                     62:                private->numMemoryRanges * sizeof (*private->memoryRanges));
                     63:     IOFree(private, sizeof (*private));
                     64: 
                     65:     if (_devicePort != PORT_NULL)
                     66:        destroy_dev_port(_devicePort);  // XXX
                     67:        
                     68:     return [super free];
                     69: }
                     70: 
                     71: - (port_t)devicePort
                     72: {
                     73:     return _devicePort;
                     74: }
                     75: 
                     76: - (void)setDevicePort:         (port_t)devicePort
                     77: {
                     78:     _devicePort = devicePort;
                     79: }
                     80: 
                     81: - directDevice
                     82: {
                     83:     return _directDevice;
                     84: }
                     85: 
                     86: - (void)setDirectDevice:       directDevice
                     87: {
                     88:     _directDevice = directDevice;
                     89: }
                     90: 
                     91: - (void)setConfigTable:                (IOConfigTable *)configTable
                     92: {
                     93:     /* nop */
                     94: }
                     95: 
                     96: - (IOConfigTable *)configTable
                     97: {
                     98:     return [_delegate configTable];
                     99: }
                    100: 
                    101: - getDevicePath:(char *)path maxLength:(int)maxLen useAlias:(BOOL)doAlias
                    102: {
                    103:     return( NULL);
                    104: }
                    105: 
                    106: - (char *) matchDevicePath:(char *)matchPath
                    107: {
                    108:     return( NULL);
                    109: }
                    110: 
                    111: @end   
                    112: 
                    113: @implementation IODeviceDescription(IOInterrupt)
                    114: - (unsigned int) interrupt
                    115: {
                    116:     return [self interruptList][0];
                    117: }
                    118: 
                    119: - (unsigned int *) interruptList
                    120: {
                    121:     struct _private    *private = _private;
                    122: 
                    123:     if (private->numInterrupts == 0)
                    124:        private->interrupts = [self
                    125:                                _fetchItemList:[[self _delegate]
                    126:                                        resourcesForKey:IRQ_LEVELS_KEY]
                    127:                                    returnedNum:&private->numInterrupts];
                    128:     return private->interrupts;
                    129: }
                    130: 
                    131: - (unsigned int) numInterrupts
                    132: {
                    133:     struct _private    *private = _private;
                    134: 
                    135:     if (private->numInterrupts == 0)
                    136:        private->interrupts = [self
                    137:                                _fetchItemList:[[self _delegate] 
                    138:                                        resourcesForKey:IRQ_LEVELS_KEY]
                    139:                                    returnedNum:&private->numInterrupts];
                    140:     return private->numInterrupts;
                    141: }
                    142: 
                    143: - (IOReturn) setInterruptList:(unsigned int *)aList num:(unsigned int) length
                    144: {
                    145:     IOReturn ret = IO_R_RESOURCE;
                    146:     
                    147:     if ([[self _delegate]
                    148:        allocateItems:aList numItems:length
                    149:        forKey:IRQ_LEVELS_KEY] != nil) {
                    150:        
                    151:        struct _private *private = (struct _private *)_private;
                    152:        if (private->numInterrupts > 0)
                    153:            IOFree(private->interrupts,
                    154:                private->numInterrupts * sizeof (*private->interrupts));
                    155:        private->numInterrupts = 0;
                    156:        ret = IO_R_SUCCESS;
                    157:     }
                    158:     return ret;
                    159: }
                    160: @end
                    161: 
                    162: @implementation IODeviceDescription(IOMemory)
                    163: - (IORange *) memoryRangeList
                    164: {
                    165:     struct _private    *private = _private;
                    166: 
                    167:     if (private->numMemoryRanges == 0)
                    168:        private->memoryRanges =
                    169:                            [self
                    170:                                _fetchRangeList:[[self _delegate] 
                    171:                                        resourcesForKey:MEM_MAPS_KEY]
                    172:                                    returnedNum:&private->numMemoryRanges];
                    173:     return private->memoryRanges;
                    174: }
                    175: 
                    176: - (unsigned int) numMemoryRanges
                    177: {
                    178:     struct _private    *private = _private;
                    179: 
                    180:     if (private->numMemoryRanges == 0)
                    181:        private->memoryRanges =
                    182:                            [self
                    183:                                _fetchRangeList:[[self _delegate] 
                    184:                                        resourcesForKey:MEM_MAPS_KEY]
                    185:                                    returnedNum:&private->numMemoryRanges];
                    186:     return private->numMemoryRanges;
                    187: }
                    188: 
                    189: - (IOReturn) setMemoryRangeList:(IORange *)aList num:(unsigned int) length
                    190: {
                    191:     IOReturn ret = IO_R_RESOURCE;
                    192:     Range *ranges;
                    193:     int i;
                    194:     
                    195:     ranges = (Range *)IOMalloc(sizeof(Range) * length);
                    196:     for (i=0; i<length; i++) {
                    197:        ranges[i].base = aList[i].start;
                    198:        ranges[i].length = aList[i].size;
                    199:     }
                    200:     if ([[self _delegate]
                    201:        allocateRanges:ranges numRanges:length forKey:MEM_MAPS_KEY]
                    202:        != nil) {
                    203:        
                    204:        struct _private *private = (struct _private *)_private;
                    205:        if (private->numMemoryRanges > 0)
                    206:            IOFree(private->memoryRanges,
                    207:                private->numMemoryRanges * sizeof (*private->memoryRanges));
                    208:        private->numMemoryRanges = 0;
                    209:        ret = IO_R_SUCCESS;
                    210:     }
                    211:     IOFree(ranges, sizeof(Range) * length);
                    212:     return ret;
                    213: }
                    214: 
                    215: @end
                    216: 
                    217: @implementation IODeviceDescription(Private)
                    218: 
                    219: - _initWithDelegate:delegate
                    220: {
                    221:     _private = (void *)IOMalloc(sizeof (struct _private));
                    222:     bzero(_private, sizeof (struct _private));
                    223: 
                    224:     _delegate = delegate;
                    225: 
                    226:     return self;
                    227: }
                    228: 
                    229: - _delegate
                    230: {
                    231:     return _delegate;
                    232: }
                    233: 
                    234: - _deviceClass
                    235: {
                    236:     return nil;
                    237: }
                    238: 
                    239: - (void *)_fetchItemList:      list
                    240:            returnedNum:        (unsigned int *)returnedNum
                    241: {
                    242:     unsigned int       *array = 0;
                    243:     int                        i, num;
                    244:     
                    245:     num = [list count];
                    246:     if (num > 0) {
                    247:        array = (void *)IOMalloc(num * sizeof (*array));
                    248:        for (i = 0; i < num; i++)
                    249:            array[i] = [[list objectAt:i] item];
                    250:     }
                    251:     
                    252:     *returnedNum = num;
                    253:     return array;
                    254: }
                    255: 
                    256: - (void *)_fetchRangeList:     list
                    257:            returnedNum:        (unsigned int *)returnedNum
                    258: {
                    259:     IORange            *array = 0;
                    260:     Range              range;
                    261:     int                        i, num;
                    262:     
                    263:     num = [list count];
                    264:     if (num > 0) {
                    265:        array = (void *)IOMalloc(num * sizeof (*array));
                    266:        for (i = 0; i < num; i++) {
                    267:            range = [[list objectAt:i] range];
                    268:            array[i].start = range.base;
                    269:            array[i].size = range.length;
                    270:        }
                    271:     }
                    272:     
                    273:     *returnedNum = num;
                    274:     return array;
                    275: }
                    276: 
                    277: - lookUpProperty:(const char *)propertyName
                    278:        value:(unsigned char *)value
                    279:        length:(unsigned int *)length
                    280:        selector:(SEL)selector
                    281:        isString:(BOOL)isString
                    282: {
                    283:     id         rtn = nil;
                    284:     char *     str;
                    285: 
                    286:     if( [self respondsTo:selector]) {
                    287:        // guarantee a minimal size so most methods don't have to check
                    288:        if( (isString == NO) || ((strlen( value) + 32) <= *length))
                    289:             rtn = objc_msgSend( self, selector, value, length );
                    290:     }
                    291: 
                    292:     if( nil == rtn) {
                    293:         if( (str = [[self configTable] valueForStringKey:propertyName])) {
                    294:            if( (strlen( str) + 1) < *length) {
                    295:                strcpy( value, str);
                    296:                 rtn = self;
                    297:            }
                    298:        }
                    299:     }
                    300: 
                    301:     return( rtn);
                    302: }
                    303: 
                    304: - property_IODeviceClass:(char *)classes length:(unsigned int *)maxLen
                    305: {
                    306:     return( nil);
                    307: }
                    308: 
                    309: - property_IODeviceType:(char *)classes length:(unsigned int *)maxLen
                    310: {
                    311:     return( nil);
                    312: }
                    313: 
                    314: - (char *) nodeName
                    315: {
                    316:     return( NULL);
                    317: }
                    318: 
                    319: @end

unix.superglobalmegacorp.com

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