Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/diebuche/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
13static const char* sPartDescSep = ";"; // cstring version
14static const char cPartDescSep = ';'; // partition descriptor separator
15
16static BootSetupController *gInstance = NULL;
17
18@implementation BootSetupController
19
20//--------------------------------------------------------------------------
21- (id) init
22{
23self = [super init];
24return (gInstance = self);
25}
26
27//--------------------------------------------------------------------------
28- (void) addOptionsDesc
29{
30 BootProp::instance().addOptionDesc(mDefaultPartition, mDefaultPartitionText, OptionString, "Default Partition", "");
31 BootProp::instance().addOptionDesc(mHidePartition , mHidePartitionText, OptionString, "Hide Partition", "");
32 BootProp::instance().addOptionDesc(mRenamePartition , mRenamePartitionText, OptionString, "Rename Partition", "");
33}
34
35//--------------------------------------------------------------------------
36- (void) refreshLockStates
37{
38// non boot config options (not automatized)
39 [PreferencesControllerBase refreshLockState: mSwapHD01 ];
40 [PreferencesControllerBase refreshLockState: mSwapHD02 ];
41 [PreferencesControllerBase refreshLockState: mFreezeParts ];
42 [PreferencesControllerBase refreshLockState: mInjectFrozenParts ];
43 [PreferencesControllerBase refreshLockState: mBootConfigPath ];
44 [PreferencesControllerBase refreshLockState: mBootConfigPathText ];
45}
46
47//--------------------------------------------------------------------------
48- (void) setDefaultsValues: (NSMutableDictionary*) dict
49{
50[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD01];
51[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD02];
52[dict setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
53[dict setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
54[dict setObject:[[NSString alloc] initWithString: @""] forKey: keyForceBootConfigPath];
55}
56//--------------------------------------------------------------------------
57-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
58{
59[mSwapHD01 setIntValue: [[dict objectForKey:keySwapHD01] intValue]];
60[mSwapHD02 setIntValue: [[dict objectForKey:keySwapHD02] intValue]];
61[mFreezeParts setIntValue: [[dict objectForKey: keyUseFrozenParts] intValue] ];
62id obj = [dict objectForKey: keyForceBootConfigPath];
63[mBootConfigPathText setStringValue: obj ? obj : @"" ];
64int val = (obj && [[mBootConfigPathText stringValue] length] >0 ? 1 : 0);
65[mBootConfigPath setIntValue: val];
66[dict setObject:[[NSString alloc] initWithString: [mBootConfigPathText stringValue]]
67 forKey: keyForceBootConfigPath];
68[mBootConfigPathText setEnabled: val ? true : false];
69[mBootConfigPathText setEditable: val ? true : false];
70
71}
72
73//--------------------------------------------------------------------------
74- (void) loadFrozenParts
75{
76std::vector<PartitionInfo>& partList = PartitionExtractor::instance().editPartList(); //rw
77// iterate for all entries to add
78char keyPartN[32] = "";
79char buffer[256]="";
80int k=0;
81
82partList.clear();
83for (int i=0; i< [[self preferencesParts] count]; i++)
84{
85// get the key
86snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
87NSString* obj = [[self preferencesParts] objectForKey: [[NSString alloc] initWithUTF8String: keyPartN] ];
88// assign this key if valid
89if (obj!=nil && [obj length]>0)
90{
91PartitionInfo p;
92// parse string
93strncpy(buffer, [obj UTF8String], sizeof(buffer)-1);
94k=0;
95for(const char* word = strtok(buffer,";"); word; word=strtok(NULL,sPartDescSep),k++)
96{
97switch (k) {
98case 0: // parse disk number
99if (isdigit(*word)) p.disk(*word-'0');
100break;
101case 1: // parse partition number
102if (isdigit(*word)) p.partition(*word-'0');
103break;
104case 2: // parse volume label
105p.label(word);
106case 3:
107p.fsType(word);
108break;
109default:
110break;
111}
112}
113partList.push_back(p);
114}
115}
116PartitionExtractor::instance().sortPartList();
117
118}
119
120//--------------------------------------------------------------------------
121- (void) swapDisks: (bool) bSwap src: (int) iSrc dst: (int) iDst;
122{
123if(!BootProp::instance().isValid()) return;
124if (bSwap)
125{
126PartitionExtractor::instance().swapHD(iSrc, iDst);
127}
128
129if ([mFreezeParts intValue]==0)
130PartitionExtractor::instance().extractPartitions();
131else
132[self loadFrozenParts ];
133
134[ [self chameleon] selectDefaultPartition];
135
136}
137
138//--------------------------------------------------------------------------
139- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst
140{
141
142if( val>0 && ![[BootSetupController instance]->mFreezeParts intValue]) //on
143{
144[self swapDisks: true src:isrc dst:idst ];
145}
146else
147{
148[self swapDisks: false src:isrc dst:idst ];
149}
150
151if(doSave)
152{
153if (isrc==0 && idst==1)
154[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD01];
155if (isrc==0 && idst==2)
156[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD02];
157[ [self chameleon] savePreferences:[self preferencesFile] ];
158}
159
160[[[TableViewsController instance] partitionsTable] reloadData];
161[[[TableViewsController instance] partitionsTable] scrollRowToVisible: 0];
162//[self tableViewSelectionDidChange: nil];
163
164}
165
166
167//--------------------------------------------------------------------------
168- (IBAction)onInjectPartsToFreeze: (id)sender
169{
170int size = PartitionExtractor::instance().partList().size();
171if (!size)
172{ // nothing to inject
173NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
174@"No current partitions to inject, did you check boot config file ?",@"OK", nil,nil);
175return;
176}
177// generate the parts list in preferences proplist
178NSInteger n = NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
179 @"Are you sure you want to overwrite your Freeze settings with current partition list ?",
180 @"OK", @"Cancel",nil);
181if (n==1)
182{
183// populate the dictionary with the current partitions
184
185// empty dictionary and update key in parent:
186[[self preferencesFile] removeObjectForKey: keyPartitionsList];
187[[self preferencesParts] removeAllObjects ];
188
189// iterate for all entries to add
190char partDesc[256]="";
191char keyPartN[32] = "";
192for (int i=0; i< size; i++)
193{
194
195const PartitionInfo& p =PartitionExtractor::instance().partList()[i];
196
197// format the partition key and descriptor string
198snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
199
200snprintf(partDesc, sizeof(partDesc)-1, "%d%c%d%c%s%c%s",
201 p.disk(), cPartDescSep,
202 p.partition(), cPartDescSep,
203 p.clabel(), cPartDescSep,
204 p.cfsType());
205
206// write it to the dictionary
207NSString * key = [[NSString alloc] initWithUTF8String: keyPartN];
208NSString * desc = [[NSString alloc] initWithUTF8String: partDesc];
209[[self preferencesParts] setObject: desc forKey: key];
210}
211[[self preferencesFile] setObject: [self preferencesParts] forKey: keyPartitionsList];
212[self savePreferences ];
213}
214}
215
216//--------------------------------------------------------------------------
217- (IBAction) onForceBootConfigPath: (id) sender
218{
219if (sender == mBootConfigPath)
220{
221int val = [mBootConfigPath intValue];
222[mBootConfigPathText setEnabled: val ? true : false];
223[mBootConfigPathText setEditable: val ? true : false];
224
225if (val)
226{
227NSString * f = [self selectPlistFile: @"com.Apple.boot.plist"];
228if(f) [mBootConfigPathText setStringValue:f];
229}
230
231
232[[self preferencesFile] setObject:
233 val ? [mBootConfigPathText stringValue] : [[NSString alloc] initWithUTF8String: ""]
234 forKey: keyForceBootConfigPath];
235
236}
237else
238[[self preferencesFile] setObject: [mBootConfigPathText stringValue] forKey: keyForceBootConfigPath];
239[self savePreferences ];
240
241
242[PreferencesControllerBase loadOptionsFromBootFile ];
243
244}
245//--------------------------------------------------------------------------
246-(IBAction) onCheckButtonChange: (NSButton*) sender
247{
248// IMPROVE ME: Should automatize the callback/load/save mechanism
249// for the preferences file like the bootConfig file
250if (sender == mSwapHD01 || sender == mSwapHD02)
251{
252PartitionExtractor::instance().resetSwapping();
253[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
254[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
255}
256else if (sender == mFreezeParts)
257{
258bool val = !![sender intValue];
259[[self preferencesFile] setObject: [NSNumber numberWithBool: val] forKey: keyUseFrozenParts];
260[[self chameleon] savePreferences: [self preferencesFile]];
261[ self onCheckButtonChange: mSwapHD01];
262}
263else if (sender == mInjectFrozenParts)
264{
265[self onInjectPartsToFreeze: mInjectFrozenParts];
266}
267else if (sender == mDefaultPartition || sender == mHidePartition
268 || sender == mRenamePartition )
269{ // sync with other panels
270[self handleSender:sender];
271}
272else if (sender == mBootConfigPath || (NSTextField*)sender == mBootConfigPathText)
273{ // sync with other panels
274[self onForceBootConfigPath: sender];
275}
276// Handle BootOptions generically:
277else
278[self handleSender:sender];
279}
280//--------------------------------------------------------------------------
281-(IBAction) onTextFiedChange: (NSTextField*) sender
282{
283if ( sender == mDefaultPartitionText || sender == mHidePartitionText ||
284 sender == mRenamePartitionText )
285{
286[self handleSender:sender];
287
288[PreferencesControllerBase loadOptionsFromBootFile ];
289PartitionExtractor::instance().extractPartitions(
290 [[mHidePartitionText stringValue] UTF8String],
291 [[mRenamePartitionText stringValue] UTF8String]
292 );
293[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
294[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
295}
296}
297
298//--------------------------------------------------------------------------
299+ (BootSetupController *)instance { return(gInstance);}
300
301@end
302

Archive Download this file

Revision: 82