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

Archive Download this file

Revision: 47