|
|
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.0 (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: /* ! 25: * Copyright 1997-1998 by Apple Computer, Inc., All rights reserved. ! 26: * Copyright 1994-1997 NeXT Software, Inc., All rights reserved. ! 27: * ! 28: * EIDEInspector.m ! 29: * ! 30: * Driver inspector. ! 31: */ ! 32: ! 33: #import "EIDEInspector.h" ! 34: #import "localization.h" ! 35: #import "IdeShared.h" ! 36: ! 37: #define MYNAME "EIDEInspector" ! 38: #define NIB_TYPE "nib" ! 39: ! 40: #define SET_LOCAL_TITLES 1 ! 41: ! 42: @implementation EIDEInspector ! 43: ! 44: /* ! 45: * Find and load our nib, put a localized title atop the connector ! 46: * box, and init buttons. ! 47: */ ! 48: - init ! 49: { ! 50: char buffer[MAXPATHLEN]; ! 51: ! 52: myBundle = [NXBundle bundleForClass:[self class]]; ! 53: ! 54: [super init]; ! 55: ! 56: if (![myBundle getPath:buffer forResource:MYNAME ofType:NIB_TYPE]) { ! 57: [self free]; ! 58: return nil; ! 59: } ! 60: if (![NXApp loadNibFile:buffer owner:self withNames:NO]) { ! 61: [self free]; ! 62: return nil; ! 63: } ! 64: ! 65: /* ! 66: * Connect the target/action of the override PopUps to methods ! 67: * defined in this class. ! 68: */ ! 69: [[popUpMasterDual target] setTarget:(id)self]; ! 70: [[popUpSlaveDual target] setTarget:(id)self]; ! 71: [[popUpMasterSingle target] setTarget:(id)self]; ! 72: [[popUpSlaveSingle target] setTarget:(id)self]; ! 73: [[popUpMasterSec target] setTarget:(id)self]; ! 74: [[popUpSlaveSec target] setTarget:(id)self]; ! 75: ! 76: [[popUpMasterDual target] setAction:@selector(selectMasterOverride:)]; ! 77: [[popUpSlaveDual target] setAction:@selector(selectSlaveOverride:)]; ! 78: [[popUpMasterSingle target] setAction:@selector(selectMasterOverride:)]; ! 79: [[popUpSlaveSingle target] setAction:@selector(selectSlaveOverride:)]; ! 80: [[popUpMasterSec target] setAction:@selector(selectMasterOverrideSec:)]; ! 81: [[popUpSlaveSec target] setAction:@selector(selectSlaveOverrideSec:)]; ! 82: ! 83: return self; ! 84: } ! 85: ! 86: /* ! 87: * Get current values of the buttons from the existing ! 88: * config table. If the current table has no entry for specified ! 89: * key, the associated button will be disabled. ! 90: */ ! 91: - (void)_initButton : button key : (const char *)key ! 92: { ! 93: const char *value; ! 94: int ival; ! 95: ! 96: value = [table valueForStringKey:key]; ! 97: if (value == NULL) { ! 98: [button setState:0]; ! 99: [button setEnabled:0]; ! 100: return; ! 101: } ! 102: else if (strcmp(value, "Yes") == 0) { ! 103: ival = 1; ! 104: } ! 105: else { ! 106: ival = 0; ! 107: } ! 108: [button setState:ival]; ! 109: } ! 110: ! 111: /* ! 112: * Set the state of the DMA enable buttons from the mask value in the ! 113: * config table. If the key is NULL, then the button shall be disabled. ! 114: */ ! 115: #define DMA_FIELDS_MASK 0xffffff00 ! 116: ! 117: - (void)_initDMAButton:button key:(const char *)key ! 118: { ! 119: const char *value; ! 120: unsigned int mask; ! 121: ! 122: if ((key == NULL) || ((value = [table valueForStringKey:key]) == NULL)) { ! 123: [button setState:0]; ! 124: [button setEnabled:NO]; ! 125: return; ! 126: } ! 127: ! 128: [button setEnabled:YES]; ! 129: mask = strtoul(value, NULL, 16); ! 130: if ((mask & DMA_FIELDS_MASK) == 0) ! 131: [button setState:NO]; ! 132: else ! 133: [button setState:YES]; ! 134: } ! 135: ! 136: - (const char *)_getKeyForDMAButton:button ! 137: { ! 138: char *key; ! 139: ! 140: if (button == enableDMAMaster) ! 141: key = MODES_MASK_MASTER; ! 142: else if (button == enableDMASlave) ! 143: key = MODES_MASK_SLAVE; ! 144: else if (button == enableDMAMasterPrimary) ! 145: key = MODES_MASK_MASTER; ! 146: else if (button == enableDMASlavePrimary) ! 147: key = MODES_MASK_SLAVE; ! 148: else if (button == enableDMAMasterSecondary) ! 149: key = MODES_MASK_MASTER_SEC; ! 150: else if (button == enableDMASlaveSecondary) ! 151: key = MODES_MASK_SLAVE_SEC; ! 152: else ! 153: key = NULL; ! 154: ! 155: return (key); ! 156: } ! 157: ! 158: - _initPopUp:popUp key:(const char *)key choices:(unsigned int)choices ! 159: { ! 160: int i; ! 161: int overrideIndex; ! 162: const char *overrideString = [table valueForStringKey:key]; ! 163: id popUpList = [popUp target]; ! 164: ! 165: // Remove all cells before populating the PopUpList ! 166: for (i = [popUpList count] - 1; i >= 0; i--) { ! 167: [popUpList removeItemAt:i]; ! 168: } ! 169: ! 170: // Populate the PopUp ! 171: for (i = 0; i < choices; i++) { ! 172: [popUpList addItem:OVERRIDE_STRING(overrideTable[i], myBundle)]; ! 173: [[[popUpList itemList] cellAt:i :0] setTag:i]; ! 174: } ! 175: ! 176: // Read the current configuration from the table ! 177: overrideIndex = OVERRIDE_AUTO; ! 178: if (overrideString) { ! 179: for (i = 0; i < choices; i++) { ! 180: if (strcmp(overrideTable[i], overrideString) == 0) { ! 181: overrideIndex = i; ! 182: break; ! 183: } ! 184: } ! 185: if (overrideIndex == OVERRIDE_TABLE_SIZE) ! 186: overrideIndex = OVERRIDE_AUTO; ! 187: } ! 188: ! 189: // Make a selection ! 190: [[popUpList itemList] selectCellWithTag:overrideIndex]; ! 191: [popUp setTitle:[popUpList selectedItem]]; ! 192: ! 193: return self; ! 194: } ! 195: ! 196: - setTable:(NXStringTable *)instance ! 197: { ! 198: char *str; ! 199: ! 200: [super setTable:instance]; ! 201: [self setAccessoryView:boundingBox]; ! 202: ! 203: /* ! 204: * Initialize the isBusMaster and isDualChannel variables. ! 205: */ ! 206: isDMACapable = NO; ! 207: isDualChannel = NO; ! 208: ! 209: // Cheesy, but assume the driver supports DMA modes if the ! 210: // controller is PCI based. ! 211: str = (char *)[table valueForStringKey:BUS_TYPE]; ! 212: if ((str != NULL) && (strcmp(str, "PCI") == 0)) { ! 213: isDMACapable = YES; ! 214: } ! 215: ! 216: // Hack to detect Dual EIDE case. ! 217: str = (char *)[table valueForStringKey:"Class Names"]; ! 218: if ((str != NULL) && (strstr(str, "Dual"))) ! 219: isDualChannel = YES; ! 220: ! 221: if (!isDMACapable) { ! 222: [self _initDMAButton:enableDMAMaster key:NULL]; ! 223: [self _initDMAButton:enableDMASlave key:NULL]; ! 224: [self _initDMAButton:enableDMAMasterPrimary key:NULL]; ! 225: [self _initDMAButton:enableDMASlavePrimary key:NULL]; ! 226: [self _initDMAButton:enableDMAMasterSecondary key:NULL]; ! 227: [self _initDMAButton:enableDMASlaveSecondary key:NULL]; ! 228: } ! 229: else { ! 230: [self _initDMAButton:enableDMAMaster ! 231: key:[self _getKeyForDMAButton:enableDMAMaster]]; ! 232: [self _initDMAButton:enableDMASlave ! 233: key:[self _getKeyForDMAButton:enableDMASlave]]; ! 234: [self _initDMAButton:enableDMAMasterPrimary ! 235: key:[self _getKeyForDMAButton:enableDMAMasterPrimary]]; ! 236: [self _initDMAButton:enableDMASlavePrimary ! 237: key:[self _getKeyForDMAButton:enableDMASlavePrimary]]; ! 238: [self _initDMAButton:enableDMAMasterSecondary ! 239: key:[self _getKeyForDMAButton:enableDMAMasterSecondary]]; ! 240: [self _initDMAButton:enableDMASlaveSecondary ! 241: key:[self _getKeyForDMAButton:enableDMASlaveSecondary]]; ! 242: } ! 243: ! 244: [self _initButton:multipleSectors key:MULTIPLE_SECTORS_ENABLE]; ! 245: [self _initPopUp:popUpMasterDual key:IDE_MASTER_KEY ! 246: choices:(OVERRIDE_TABLE_SIZE - 1)]; ! 247: [self _initPopUp:popUpSlaveDual key:IDE_SLAVE_KEY ! 248: choices:OVERRIDE_TABLE_SIZE]; ! 249: [self _initPopUp:popUpMasterSingle key:IDE_MASTER_KEY ! 250: choices:(OVERRIDE_TABLE_SIZE - 1)]; ! 251: [self _initPopUp:popUpSlaveSingle key:IDE_SLAVE_KEY ! 252: choices:OVERRIDE_TABLE_SIZE]; ! 253: [self _initPopUp:popUpMasterSec key:IDE_MASTER_KEY_SEC ! 254: choices:(OVERRIDE_TABLE_SIZE - 1)]; ! 255: [self _initPopUp:popUpSlaveSec key:IDE_SLAVE_KEY_SEC ! 256: choices:OVERRIDE_TABLE_SIZE]; ! 257: ! 258: #if SET_LOCAL_TITLES ! 259: [optionsBox setTitle:OPTION_BOX_STRING(myBundle)]; ! 260: [multipleSectors setTitle:MULTIPLE_SECTORS_STRING(myBundle)]; ! 261: [overrideButton setTitle:OPTIONS_BUTTON_STRING(myBundle)]; ! 262: ! 263: [titleMasterDual setStringValue:MASTER_STRING(myBundle)]; ! 264: [titleSlaveDual setStringValue:SLAVE_STRING(myBundle)]; ! 265: [titleMasterSingle setStringValue:MASTER_STRING(myBundle)]; ! 266: [titleSlaveSingle setStringValue:SLAVE_STRING(myBundle)]; ! 267: [titleMasterSec setStringValue:MASTER_STRING(myBundle)]; ! 268: [titleSlaveSec setStringValue:SLAVE_STRING(myBundle)]; ! 269: ! 270: [boxPriDual setTitle:PRI_CHANNEL_STRING(myBundle)]; ! 271: [boxSecDual setTitle:SEC_CHANNEL_STRING(myBundle)]; ! 272: [boxSingle setTitle:SINGLE_CHANNEL_STRING(myBundle)]; ! 273: [panelDualChannel setTitle:OPTIONS_BUTTON_STRING(myBundle)]; ! 274: [panelSingleChannel setTitle:OPTIONS_BUTTON_STRING(myBundle)]; ! 275: #endif SET_LOCAL_TITLES ! 276: ! 277: return self; ! 278: } ! 279: ! 280: - selectOverrides:sender ! 281: { ! 282: id panel; ! 283: ! 284: if (isDualChannel) ! 285: panel = panelDualChannel; ! 286: else ! 287: panel = panelSingleChannel; ! 288: ! 289: [panel center]; ! 290: [panel makeKeyAndOrderFront:self]; ! 291: [NXApp runModalFor:panel]; ! 292: [panel orderOut:self]; ! 293: ! 294: return self; ! 295: } ! 296: ! 297: - ok:sender ! 298: { ! 299: [NXApp stopModal:1]; ! 300: return self; ! 301: } ! 302: ! 303: - setDMAMode:sender ! 304: { ! 305: const char *key = [self _getKeyForDMAButton:sender]; ! 306: ! 307: if (key) { ! 308: char *value; ! 309: if ([sender state] == NO) ! 310: value = "0x000000ff"; ! 311: else ! 312: value = "0xffffffff"; ! 313: [table insertKey:key value:value]; ! 314: } ! 315: return self; ! 316: } ! 317: ! 318: - multipleSectors:sender ! 319: { ! 320: char *str; ! 321: ! 322: if ([sender state]) ! 323: str = "Yes"; ! 324: else ! 325: str = "No"; ! 326: ! 327: [table insertKey:MULTIPLE_SECTORS_ENABLE value:str]; ! 328: return self; ! 329: } ! 330: ! 331: - selectMasterOverride:sender ! 332: { ! 333: int i = [[sender selectedCell] tag]; ! 334: [table insertKey:IDE_MASTER_KEY value:(char *)overrideTable[i]]; ! 335: return self; ! 336: } ! 337: ! 338: - selectSlaveOverride:sender ! 339: { ! 340: int i = [[sender selectedCell] tag]; ! 341: [table insertKey:IDE_SLAVE_KEY value:(char *)overrideTable[i]]; ! 342: return self; ! 343: } ! 344: ! 345: - selectMasterOverrideSec:sender ! 346: { ! 347: int i = [[sender selectedCell] tag]; ! 348: [table insertKey:IDE_MASTER_KEY_SEC value:(char *)overrideTable[i]]; ! 349: return self; ! 350: } ! 351: ! 352: - selectSlaveOverrideSec:sender ! 353: { ! 354: int i = [[sender selectedCell] tag]; ! 355: [table insertKey:IDE_SLAVE_KEY_SEC value:(char *)overrideTable[i]]; ! 356: return self; ! 357: } ! 358: ! 359: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.