Chameleon Applications

Chameleon Applications Svn Source Tree

Root/trunk/ChameleonPrefPane/Sources/BootSetupController.mm

1//
2// BootSetupController.mm
3// ChameleonPrefPane
4//
5// Created by Rekursor on 1/22/10.
6//
7
8#import "BootSetupController.h"
9#import "ChameleonPrefPane.h"
10#import "TableViewsController.h"
11#import "ShellProcess.h"
12#import "PartitionInfoManager.h"
13#include "ChameleonPropertyList.h"
14
15static const char cPartDescSep = ';'; // partition descriptor separator
16
17static BootSetupController *gInstance = NULL;
18
19@implementation BootSetupController
20
21//--------------------------------------------------------------------------
22- (id) init
23{
24self = [super init];
25return (gInstance = self);
26}
27
28//--------------------------------------------------------------------------
29- (void) addOptionsDesc
30{
31 BootProp::instance().addOptionDesc(mDefaultPartition, mDefaultPartitionText, OptionString, "Default Partition", "");
32 BootProp::instance().addOptionDesc(mHidePartition , mHidePartitionText, OptionString, "Hide Partition", "");
33 BootProp::instance().addOptionDesc(mRenamePartition , mRenamePartitionText, OptionString, "Rename Partition", "");
34}
35
36//--------------------------------------------------------------------------
37- (void) refreshLockStates
38{
39// non boot config options (not automatized)
40 [PreferencesControllerBase refreshLockState: mSwapHD01 ];
41 [PreferencesControllerBase refreshLockState: mSwapHD02 ];
42 [PreferencesControllerBase refreshLockState: mFreezeParts ];
43 [PreferencesControllerBase refreshLockState: mInjectFrozenParts ];
44 [PreferencesControllerBase refreshLockState: mBootConfigPath ];
45 [PreferencesControllerBase refreshLockState: mBootConfigPathText ];
46}
47
48//--------------------------------------------------------------------------
49- (void) setDefaultsValues: (NSMutableDictionary*) dict
50{
51[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD01];
52[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD02];
53[dict setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
54[dict setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
55[dict setObject:[[NSString alloc] initWithString: @""] forKey: keyForceBootConfigPath];
56}
57//--------------------------------------------------------------------------
58-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
59{
60[mSwapHD01 setIntValue: [[dict objectForKey:keySwapHD01] intValue]];
61[mSwapHD02 setIntValue: [[dict objectForKey:keySwapHD02] intValue]];
62[mFreezeParts setIntValue: [[dict objectForKey: keyUseFrozenParts] intValue] ];
63id obj = [dict objectForKey: keyForceBootConfigPath];
64[mBootConfigPathText setStringValue: obj ? obj : @"" ];
65int val = (obj && [[mBootConfigPathText stringValue] length] >0 ? 1 : 0);
66[mBootConfigPath setIntValue: val];
67[dict setObject:[[NSString alloc] initWithString: [mBootConfigPathText stringValue]]
68 forKey: keyForceBootConfigPath];
69[mBootConfigPathText setEnabled: val ? true : false];
70[mBootConfigPathText setEditable: val ? true : false];
71[mBootExtraPathText setStringValue: [[mBootConfigPathText stringValue] stringByDeletingLastPathComponent]];
72[mBootCdbootPathText setStringValue: [[mBootConfigPathText stringValue] stringByDeletingLastPathComponent]];
73}
74
75//--------------------------------------------------------------------------
76- (void) loadFrozenParts
77{
78// iterate for all entries to add
79char keyPartN[32] = "";
80int k=0;
81
82NSMutableArray* partList = (NSMutableArray*) [PartsInfoMgr parts];
83[partList removeAllObjects];
84
85for (int i=0; i< [[self preferencesParts] count]; i++)
86{
87// get the key
88snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
89NSString* obj = [[self preferencesParts] objectForKey: [[NSString alloc] initWithUTF8String: keyPartN] ];
90// assign this key if valid
91if (obj!=nil && [obj length]>0)
92{
93PartitionInfoElement* p = [[PartitionInfoElement alloc] init];
94// parse string
95NSArray* words = [obj componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @";"]];
96k=0;
97int diskNum=0, partNum=0;
98for (NSString * word in words)
99{
100switch (k) {
101case 0: // disk number
102diskNum = [word intValue] ;
103[ p setDiskNumber:diskNum];
104break;
105case 1: // partition number
106partNum = [word intValue] ;
107[ p setPartitionNumber: partNum];
108break;
109case 2: // volume label
110[p setVName: word];
111[p setVAliasName: word];
112break;
113case 3: // fstype
114[p setVKind: word];
115break;
116case 4: // vUUID
117[p setVUUID: word];
118break;
119default:
120break;
121}
122k++;
123}
124
125[partList addObject:p];
126}
127}
128// for mgr to refresh hide and rename attributes
129[PartsInfoMgr hideParts:nil];
130[PartsInfoMgr renameParts:nil];
131
132}
133
134//--------------------------------------------------------------------------
135- (void) swapDisks: (bool) bSwap src: (int) iSrc dst: (int) iDst;
136{
137//if(!BootProp::instance().isValid()) return;
138if ([mFreezeParts intValue]==0)
139[PartsInfoMgr reload];
140else
141[self loadFrozenParts ];
142
143if (bSwap)
144{
145[PartsInfoMgr swapHD:iSrc with: iDst ];
146}
147
148[ [self chameleon] selectDefaultPartition];
149
150}
151
152//--------------------------------------------------------------------------
153- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst
154{
155
156if( val>0 && ![[BootSetupController instance]->mFreezeParts intValue]) //on
157{
158[self swapDisks: true src:isrc dst:idst ];
159}
160else
161{
162[self swapDisks: false src:isrc dst:idst ];
163}
164
165if(doSave)
166{
167if (isrc==0 && idst==1)
168[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD01];
169if (isrc==0 && idst==2)
170[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD02];
171[ [self chameleon] savePreferences:[self preferencesFile] ];
172}
173
174[[[TableViewsController instance] partitionsTable] reloadData];
175[[[TableViewsController instance] partitionsTable] scrollRowToVisible: 0];
176//[self tableViewSelectionDidChange: nil];
177
178}
179
180
181//--------------------------------------------------------------------------
182- (IBAction)onInjectPartsToFreeze: (id)sender
183{
184int size = [[PartsInfoMgr parts] count ];
185NSString * title = GetLocStrDef(@"Freeze_Dialog", @"msgbox", @"Inject Partitions to Freeze Configuration");
186if (!size)
187{ // nothing to inject
188NSRunAlertPanel(title,
189GetLocStrDef(@"Freeze_NoPart", @"msgbox", @"No current partitions to inject, did you check boot config file ?"),
190@"OK", nil,nil);
191return;
192}
193// generate the parts list in preferences proplist
194NSInteger n = NSRunAlertPanel(title,
195 GetLocStrDef(@"Freeze_Overwrite", @"msgbox",
196 @"Are you sure you want to overwrite your Freeze settings with current partition list ?"),
197 @"OK", @"Cancel",nil);
198if (n==1)
199{
200// populate the dictionary with the current partitions
201
202// empty dictionary and update key in parent:
203[[self preferencesFile] removeObjectForKey: keyPartitionsList];
204[[self preferencesParts] removeAllObjects ];
205
206// iterate for all entries to add
207char partDesc[256]="";
208char keyPartN[32] = "";
209for (int i=0; i< size; i++)
210{
211
212PartitionInfoElement* p = [PartsInfoMgr objectAtIndex:i];
213
214// format the partition key and descriptor string
215snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
216
217snprintf(partDesc, sizeof(partDesc)-1, "%d%c%d%c%s%c%s%c%s",
218 [p diskNumber], cPartDescSep,
219 [p partitionNumber], cPartDescSep,
220 [[p vAliasName] UTF8String], cPartDescSep,
221 [[p vKind] UTF8String], cPartDescSep,
222 [[p vUUID] UTF8String]);
223
224// write it to the dictionary
225NSString * key = [[NSString alloc] initWithUTF8String: keyPartN];
226NSString * desc = [[NSString alloc] initWithUTF8String: partDesc];
227[[self preferencesParts] setObject: desc forKey: key];
228
229[p release];
230}
231[[self preferencesFile] setObject: [self preferencesParts] forKey: keyPartitionsList];
232[self savePreferences ];
233}
234}
235
236//--------------------------------------------------------------------------
237- (IBAction) onForceBootConfigPath: (id) sender
238{
239if (sender == mBootConfigPath)
240{
241int val = [mBootConfigPath intValue];
242[mBootConfigPathText setEnabled: val ? true : false];
243[mBootConfigPathText setEditable: val ? true : false];
244
245if (val)
246{
247NSString * f = [self selectPlistFile: @"org.chameleon.Boot.plist"];
248if(f)
249{
250[mBootConfigPathText setStringValue:f];
251[mBootExtraPathText setStringValue: [f stringByDeletingLastPathComponent] ];
252[mBootCdbootPathText setStringValue: [f stringByDeletingLastPathComponent]];
253
254[f release];
255}
256}
257
258
259[[self preferencesFile] setObject:
260 val ? [mBootConfigPathText stringValue] : [[NSString alloc] initWithUTF8String: ""]
261 forKey: keyForceBootConfigPath];
262
263}
264else{
265NSString * f = [mBootConfigPathText stringValue];
266[[self preferencesFile] setObject:f forKey: keyForceBootConfigPath];
267[mBootExtraPathText setStringValue: [f stringByDeletingLastPathComponent] ];
268[mBootCdbootPathText setStringValue: [f stringByDeletingLastPathComponent]];
269}
270[self savePreferences ];
271BootProp::instance().cleanup();
272[[ChameleonPrefPane instance ] initBootConfig];
273}
274//--------------------------------------------------------------------------
275-(IBAction) onCheckButtonChange: (NSButton*) sender
276{
277// IMPROVE ME: Should automatize the callback/load/save mechanism
278// for the preferences file like the bootConfig file
279if (sender == mSwapHD01 || sender == mSwapHD02)
280{
281[PartsInfoMgr resetSwapping];
282[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
283[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
284}
285else if (sender == mFreezeParts)
286{
287bool val = !![sender intValue];
288[[self preferencesFile] setObject: [NSNumber numberWithBool: val] forKey: keyUseFrozenParts];
289[[self chameleon] savePreferences: [self preferencesFile]];
290[ self onCheckButtonChange: mSwapHD01];
291}
292else if (sender == mInjectFrozenParts)
293{
294[self onInjectPartsToFreeze: mInjectFrozenParts];
295}
296else if (sender == mDefaultPartition || sender == mHidePartition
297 || sender == mRenamePartition )
298{ // sync with other panels
299[self handleSender:sender];
300}
301else if (sender == mBootConfigPath || (NSTextField*)sender == mBootConfigPathText)
302{ // sync with other panels
303[self onForceBootConfigPath: sender];
304}
305else if (sender == mBootExtraPath || (NSTextField*)sender == mBootExtraPathText)
306{ // sync with other panels
307[self onForceBootConfigPath: sender];
308}
309else if (sender == mBootCdbootPath || (NSTextField*)sender == mBootCdbootPathText)
310{ // sync with other panels
311[self onForceBootConfigPath: sender];
312}
313// Handle BootOptions generically:
314else
315[self handleSender:sender];
316}
317//--------------------------------------------------------------------------
318-(IBAction) onTextFiedChange: (NSTextField*) sender
319{
320if ( sender == mDefaultPartitionText || sender == mHidePartitionText ||
321 sender == mRenamePartitionText )
322{
323[self handleSender:sender];
324
325[PreferencesControllerBase loadOptionsFromBootFile ];
326[PartsInfoMgr reloadWithHideSpec: [mHidePartitionText stringValue] andRenameSpec: [mRenamePartitionText stringValue] ];
327
328[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
329[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
330}
331else if (sender == mBootConfigPathText)
332{
333[self onForceBootConfigPath: sender];
334}
335}
336//--------------------------------------------------------------------------
337- (IBAction) onCdBootConfigPath: (id) sender
338{
339if ( sender == mBootCdbootPath)
340{
341NSString * dir = [self selectDirectory:@"/"];
342if (dir!=nil)
343[mBootCdbootPathText setStringValue: dir];
344}
345
346}
347//--------------------------------------------------------------------------
348- (IBAction) onExtraConfigPath: (id) sender
349{
350if ( sender == mBootExtraPath)
351{
352NSString * dir = [self selectDirectory:@"/"];
353if (dir!=nil)
354[mBootExtraPathText setStringValue: dir];
355}
356}
357
358//--------------------------------------------------------------------------
359- (IBAction) onCreateBootCD: (id) sender
360{
361// using rek modified rohan script from Lizard boot cd creator:
362NSString* destination = @"~/Desktop/Chameleon";
363NSString* pathTask = [self getResourcePath:@"cdBootCreator" ofType:@"sh"];
364NSString* pathExtra = [mBootExtraPathText stringValue];
365NSString* pathCdboot = [mBootCdbootPathText stringValue];
366NSMutableArray* arr = [[NSMutableArray alloc] init];
367bool result;
368
369if (
370pathTask!=nil && [pathTask length] > 0
371&& pathExtra !=nil && [pathExtra length] > 0
372&& pathCdboot !=nil && [pathCdboot length] > 0
373 )
374{
375[arr addObject: pathExtra];
376[arr addObject: pathCdboot];
377result = [self executeTaskAndWaitForTermination: pathTask withArgs: arr];
378if (result)
379{
380[self msgBoxInfo:
381 [NSString stringWithFormat:
382 GetLocStrDef(@"CD_Success", @"msgbox", @"Boot cd creator script successfully executed. BootCD.iso created in %@."),
383 destination]];
384}
385else
386[self msgBoxError:
387GetLocStrDef(@"CD_Failure", @"msgbox", @"ERROR: Couldn't execute boot cd creator script successfully!")];
388}
389
390[arr release];
391}
392//--------------------------------------------------------------------------
393+ (BootSetupController *)instance { return(gInstance);}
394
395@end
396

Archive Download this file

Revision: 449