|
|
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.