Chameleon Applications

Chameleon Applications Commit Details

Date:2010-01-23 09:03:14 (14 years 3 months ago)
Author:Rekursor
Commit:47
Parents: 46
Message:Implemented automatized architecture for botConfigFlags, started cabling refresh states and default values, next step is load and savind the preferences almost automatically with the help of the dynamically created Id to Desc hascode dictionary. Some types like OptionsUnix[1] still have to be treated differently.
Changes:
R/trunk/ChameleonPrefPane/Sources/property_list.cpp → /trunk/ChameleonPrefPane/Sources/PropertyList.cpp
R/trunk/ChameleonPrefPane/Sources/property_list.h → /trunk/ChameleonPrefPane/Sources/PropertyList.h
R/trunk/ChameleonPrefPane/Sources/process.cpp → /trunk/ChameleonPrefPane/Sources/ShellProcess.cpp
R/trunk/ChameleonPrefPane/Sources/process.h → /trunk/ChameleonPrefPane/Sources/ShellProcess.h
A/trunk/ChameleonPrefPane/Sources/BootPropertyList.cpp
A/trunk/ChameleonPrefPane/Sources/BootPropertyList.h
M/trunk/ChameleonPrefPane/Sources/BootSetupController.mm
M/trunk/ChameleonPrefPane/Sources/AdvancedSetupController.mm
M/trunk/ChameleonPrefPane/Sources/ChameleonPrefPane.h
M/trunk/ChameleonPrefPane/English.lproj/Chameleon.xib
M/trunk/ChameleonPrefPane/Sources/PeripheralsController.h
M/trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.mm
M/trunk/ChameleonPrefPane/Sources/BootFlagsController.h
M/trunk/ChameleonPrefPane/Sources/BootSetupController.h
M/trunk/ChameleonPrefPane/ChameleonPrefPane.xcodeproj/project.pbxproj
M/trunk/ChameleonPrefPane/Sources/AdvancedSetupController.h
M/trunk/ChameleonPrefPane/Sources/ChameleonPrefPane.mm
M/trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.h
M/trunk/ChameleonPrefPane/Sources/PeripheralsController.mm
M/trunk/ChameleonPrefPane/Sources/BootFlagsController.mm

File differences

trunk/ChameleonPrefPane/Sources/process.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
* shell_process.cpp
*
* Created by Rekursor on 1/17/2010.
*
*/
#include "process.h"
#include <string.h>
#include <sys/stat.h>
#include <string_util.h>
//----------------------------------------------------------------
// portable open process:
FILE * ShellProcess::open(const char *cmd, const char *mode) {
_fpt=::popen(cmd,mode);
return _fpt;
}
//----------------------------------------------------------------
int ShellProcess::close() {
int ret = ::pclose(_fpt);
_fpt=NULL;
return ret;
}
//----------------------------------------------------------------
void PartitionInfo::removeSpaces(std::string &str)
{
if (!str.size()) return;
int posl=0,posr=0;
for (posl=0; posl<str.size()-1 && str[posl]==' '; posl++);
for (posr=str.size()-1; posr>0 && str[posr]==' '; posr--);
str = (posl>posr) ? "" : str.substr(posl, posr-posl+1);
}
//----------------------------------------------------------------
/**
* return the image index corresponding to a fs:
*/
int PartitionInfo::imageIndexFromFs() const
{
if (_fsType.find("Apple")!=std::string::npos ||
_fsType.find("HFS")!=std::string::npos)
return 0; // Windows
else if (_fsType.find("Windows")!=std::string::npos ||
_fsType.find("Microsoft")!=std::string::npos ||
_fsType.find("NTFS")!=std::string::npos ||
_fsType.find("FAT")!=std::string::npos)
return 1; // Windows
else if (_fsType.find("Linux")!=std::string::npos)
return 2; // Unknown
return 10; //Unknown
}
//----------------------------------------------------------------
bool PartitionInfo::fromPartitionHdString(const char * inHdStr)
{
if (!inHdStr || !(*inHdStr) ||
strlen(inHdStr)<7 || !strstr(inHdStr,"hd(")) return false;
// enhance me here: should not assume that we have less than 10 partitions per disk/ disks
_disk = inHdStr[3]-'0';
_part = inHdStr[5]-'0';
return true;
}
//----------------------------------------------------------------
const char * PartitionExtractor::checkForRename(const char * label, const char *szHd)
{
const int MAX_ALIAS_SIZE=31;
static char szAlias[MAX_ALIAS_SIZE+1];
char *q=szAlias;
const char* szAliases = _renamedParts.c_str();
if (!szHd || !*szHd || !szAliases || !*szAliases) return label; // no renaming wanted
const char * p = strstr(szAliases, szHd);
if(!p || !(*p)) return label; // this volume must not be renamed, or option is malformed
p+= strlen(szHd); // skip the "hd(n,m) " field
// multiple aliases can be found separated by a semi-column
while(*p && *p != ';' && q<(szAlias+MAX_ALIAS_SIZE)) *q++=*p++;
*q='\0';
return szAlias;
}
//----------------------------------------------------------------
const std::vector<PartitionInfo>&
PartitionExtractor::extractPartitions(const char* szHide, const char* szRenamed)
{
const char * const diskTag = "/dev/disk";
const char * const nameTag = "NAME";
const char * const sizeTag = "SIZE";
PartitionInfo partInfo;
char line[1024]="";
char label[32]="", fsType[32]="" ;
size_t len=0;
int disk =0, part=0;
int label_pos=0, size_pos=0;
char * p=0,*q=0;
int skipwhite=0;
_partList.clear();
if (szHide) hidePartitions(szHide);
if (szRenamed) renamedPartitions(szRenamed);
this->open("diskutil list");
while(get_line(line, sizeof(line)-1))
{
// printf("%s\n",line);
len = strlen(line);
for(skipwhite=0; line[skipwhite]==' ';skipwhite++);
const char * sdisk = strstr(line, diskTag);
const char * sName = strstr(line, nameTag);
const char * sSize = strstr(line, sizeTag);
if (sdisk)
{
// extract disk number
disk= sdisk[strlen(diskTag)]-'0';
if (disk>=0 && disk <MAX_HD)
disk = _hdRedirTable[disk];
}
else if (len && line[skipwhite]=='#' && line[skipwhite+1]==':')
{
label_pos = sName ? (sName - line) : 0;
size_pos = sSize ? (sSize - line) : 0;
}
else if (len && line[skipwhite+1]==':' && isdigit(line[skipwhite]))
{
for (p=&line[skipwhite+2], q=fsType; *p && p < &line[label_pos-1]; p++,q++) *q=*p;
for (p=&line[label_pos], q=label; *p && p < &line[size_pos]; p++,q++) *q=*p;
*q='\0';
part = line[skipwhite]-'0';
partInfo.fsType(fsType);
partInfo.disk(disk);
partInfo.partition(part);
partInfo.label(checkForRename(label, partInfo.toHdStr().c_str()));
size_t len = partInfo.label().length();
// filter useless partitions:
if ( len > 0 &&
partInfo.clabel()[len-1] !='*' &&
partInfo.fsType()!="EFI" &&
partInfo.fsType()!="Apple_partition_scheme" &&
partInfo.fsType()!="Apple_partition_map" &&
partInfo.fsType()!="Apple_Free"
)
{
std::string DiskLabel(label), UnixPath, WinPath;
DiskLabel.erase( DiskLabel.find_last_not_of(" ") + 1);
bool found=false;
// early bail out if we found what we need:
if (fileExists((UnixPath = "/Volumes/" + DiskLabel + "/usr/bin/man")))
found=true;
else if ((strstr(label,"System Reserved") ) || // don't filter system reserved windows 7 boot parts
fileExists((WinPath="/Volumes/" + DiskLabel + "/Windows/system.ini")))
found=true;
else if (strstr(fsType,"Linux") && !strstr(fsType, "Linux_Swap"))
found=true; // Added Linux case
if (found)
{ //check if one of them exists
if (partInfo.label().size()==0) partInfo.label("Untitled");
if(_hiddenParts.length()==0 ||
_hiddenParts.find(partInfo.toHdStr()) == std::string::npos)
_partList.push_back(partInfo);
}
}
}
}
close();
sort(_partList.begin(), _partList.end(), isDiskIndexInf);
return _partList;
}
/**
* Get the index in the internal partlist of the hd(n,m) partition specified by the input string
* return -1 if no match, >=0 if a match happens
*/
int PartitionExtractor::getIndexFromHdStringSpec(const char* inHDStr)
{
PartitionInfo info;
if (info.fromPartitionHdString(inHDStr)) // try decode the partition disk and part infos
{
for (int i=0; i<_partList.size(); i++)
{
if (_partList[i].disk() == info.disk() && _partList[i].partition() == info.partition())
return i;
}
}
return -1;
}
trunk/ChameleonPrefPane/Sources/property_list.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
/*
* property_list.cpp
*
* Created by Rekursor on 1/17/10.
*
*/
#include "property_list.h"
#include <string.h>
#include <sys/stat.h>
/****************************************************************************/
/**
* Simple parsing and splitting args function, does handle env. vars
*/
static void parseArgs(const char * args, const char* argv[], int argvlen)
{
// Create a list of args fron the space delimited args parameters
int n=0;
if (args && *args)
{
bool skipSpaces = true;
bool prevCharwasDelim =false;
char * buf = strdup(args);
char lastPriorityDelim=' ';
printf("Parsing <%s>\n", args);
int k=0;
for (int i=0; i< strlen(args); i++)
{
switch (args[i])
{
case ' ': case '\t':
if(!skipSpaces) {
buf[k++]=args[i];
}
else {
prevCharwasDelim = true; // // keep a track of delim to further split tokens
}
break;
case '\0':
case '\'':
case '"':
if (!skipSpaces &&lastPriorityDelim!=args[i])
{ // consider the imbricated delim as a simple char
buf[k++]=args[i];
break;
}
if (!skipSpaces) // end of priority substr
{
skipSpaces = true;
lastPriorityDelim=' ';
buf[k]='\0';
argv[n++]=strdup(buf); // copy the priority substr
k=0; // reset the buf index for next token
buf[0]='\0';
}
else
{ // start of priority substr
skipSpaces=false;
lastPriorityDelim=args[i];
if(k>0) // previous string to store first
{
buf[k++]='\0'; // finish the substr
argv[n++]=strdup(buf); // copy the substr
k=0; // rest the index for next token
buf[0]='\0';
}
//if (args[i] !='\0') buf[k++] = args[i]; // start the new priority substr
}
break;
default: // non delimiters chars
if(skipSpaces && prevCharwasDelim)
{
if(k>0) // a previous substr was before the space
{ // store previous token
buf[k++]='\0'; // finish the substr
argv[n++]=strdup(buf); // copy the substr
k=0; // rest the index for next token
buf[0]='\0';
}
}
prevCharwasDelim = false;
buf[k++]=args[i];
break;
}
}
if(*buf)
{
buf[k]='\0';
argv[n++]=strdup(buf); // copy the last buffer
}
free((void*) buf);
}
argv[n]=NULL;
}
/****************************************************************************/
bool executePrivilegedCmd(AuthorizationRef auth,
const char* pathToTool,
const char* args,
AuthorizationFlags flags)
{
const char * argv[16];
parseArgs(args, argv, sizeof(argv)/sizeof(const char*));
// Execute Cmd
OSStatus status = AuthorizationExecuteWithPrivileges(auth, pathToTool,flags, (char**)argv, NULL);
// Cleanup mem
for (int i=0; argv[i]; i++) free ((void*) argv[i]);
return status ? false : true;
}
/****************************************************************************/
/**
* Write a property list from a file
*/
bool WritePropertyListToFile( CFPropertyListRef propertyList, CFURLRef fileURL )
{
CFDataRef xmlData;
Boolean status;
SInt32 errorCode;
// Convert the property list into XML data.
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, propertyList );
// Write the XML data to the file.
status = CFURLWriteDataAndPropertiesToResource (
fileURL, // URL to use
xmlData, // data to write
NULL,
&errorCode);
CFRelease(xmlData);
return status ? true: false;
}
/****************************************************************************/
/**
* Read a property list from a file
*/
static CFPropertyListRef CreatePropertyListFromFile( CFURLRef fileURL, CFStringRef * errorString ) {
CFPropertyListRef propertyList;
CFDataRef resourceData;
Boolean status;
SInt32 errorCode;
// Read the XML file.
status = CFURLCreateDataAndPropertiesFromResource(
kCFAllocatorDefault,
fileURL,
&resourceData, // place to put file data
NULL,
NULL,
&errorCode);
if (!status) return NULL;
// Reconstitute the dictionary using the XML data.
propertyList = CFPropertyListCreateFromXMLData( kCFAllocatorDefault,
resourceData,
kCFPropertyListMutableContainersAndLeaves,
errorString);
CFRelease( resourceData );
return propertyList;
}
/****************************************************************************/
static void show(CFStringRef formatString, ...) {
CFStringRef resultString;
CFDataRef data;
va_list argList;
va_start(argList, formatString);
resultString = CFStringCreateWithFormatAndArguments(NULL, NULL, formatString, argList);
va_end(argList);
data = CFStringCreateExternalRepresentation(NULL, resultString, CFStringGetSystemEncoding(), '?');
if (data != NULL) {
printf ("%.*s\n\n", (int)CFDataGetLength(data), CFDataGetBytePtr(data));
CFRelease(data);
}
CFRelease(resultString);
}
/****************************************************************************/
/*
* Always return a valid static const string, if the CFSTR is not valid, then we return ""
*/
static const char * CfsToCs(CFStringRef inRef)
{
static char buffer[512]="";
if(CFStringGetFileSystemRepresentation (inRef, buffer, sizeof(buffer)))
return buffer;
return "";
}
/****************************************************************************/
/**
* Creates a PropertyList Incstance
*/
PropertyList::~PropertyList()
{
if (_CFURLRef) CFRelease(_CFURLRef);
if (_proplistRef) CFRelease(_proplistRef);
}
bool PropertyList::chmodFile(const char * path, const char * chmodMask,
AuthorizationRef auth, AuthorizationFlags flags)
{
if (!path || !*path) return false;
if (auth)
{ // give write temporary write rights to the file
std::string args = chmodMask;
args += ' ';
args += path;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
return true;
}
/****************************************************************************/
/**
* Open a properlist from a path name
*/
bool PropertyList::open(const char * path, CFStringRef * errorString, AuthorizationRef auth, AuthorizationFlags flags)
{
bool ret = false;
if (!path || !*path) return false;
struct stat st;
if(stat(path,&st) != 0) return false; // file does not exist;
// give write temporary write rights to the file
if (!chmodFile(path,"0777", auth, flags)) return false;
_propFilePath = path;
CFStringRef cfPath = CFStringCreateWithCString (kCFAllocatorDefault, path, kCFStringEncodingUTF8);
CFURLRef inURL = CFURLCreateWithFileSystemPath( kCFAllocatorDefault,
cfPath,
kCFURLPOSIXPathStyle, // interpret as POSIX path
false ); // is it a directory?
CFRelease(cfPath);
if (_CFURLRef) CFRelease(_CFURLRef);
_CFURLRef = inURL;
if (_CFURLRef)
{
_proplistRef = CreatePropertyListFromFile(inURL, errorString);
if (_proplistRef)
ret= true;
}
// restore rights
ret= chmodFile(path,"0644", auth, flags);
return ret;
}
/****************************************************************************/
/**
* Save the current property list
*/
bool PropertyList::save(AuthorizationRef auth, AuthorizationFlags flags)
{
bool ret=false;
if (auth)
{ // give write temporary write rights to the file
std::string args = " 0777 "+ _propFilePath;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
if (_proplistRef && _CFURLRef)
ret= WritePropertyListToFile(_proplistRef,_CFURLRef);
if (auth)
{ // give write temporary write rights to the file
std::string args = " 0644 "+ _propFilePath;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
return ret;
}
/****************************************************************************/
/**
* Extract a sring value from a property list key,
* value returned is not owned by caller, copy it necessary.
*/
const char * PropertyList::getStringForKey(const char *key)
{
if (!_proplistRef) return 0;
CFDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFDictionaryRef) _proplistRef : NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString;
if (myDict && CFDictionaryGetValueIfPresent(myDict, cfKey, (const void **) &myString))
{
// show(CFSTR("Key '%@' found , value = <%@>\n"), cfKey, !myString ? CFSTR("") : myString);
CFRelease(cfKey);
return CfsToCs(myString);
}
if(cfKey) CFRelease(cfKey);
return NULL;
}
/****************************************************************************/
/**
* replace a sring value from a property list key,
* value returned is not owned by caller, copy it necessary.
*/
bool PropertyList::setStringForKey(const char *key, const char * value)
{
if (!_proplistRef) return false;
bool ret = false;
CFMutableDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFMutableDictionaryRef) _proplistRef : NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString = CFStringCreateWithCString (kCFAllocatorDefault, value, kCFStringEncodingUTF8);
if (myDict) {
CFDictionaryReplaceValue(myDict, cfKey, myString);
ret=true;
}
if(cfKey) CFRelease(cfKey);
if(myString) CFRelease(myString);
return ret;
}
trunk/ChameleonPrefPane/Sources/process.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
* shell_process.h
*
* Created by Rekursor on 1/17/2010.
*
*/
#include <Security/Authorization.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <vector>
#include <string>
//----------------------------------------------------------------
const int MAX_HD = 10;
//----------------------------------------------------------------
/**
* Check whether file exists:
*/
inline bool fileExists(const char * str)
{
struct stat stFileInfo;
if((stat(str,&stFileInfo)) == 0) return true;
else return false;
}
inline bool fileExists(std::string str) {return fileExists(str.c_str());}
//----------------------------------------------------------------
class ShellProcess
{
public:
// construction / destruction
ShellProcess() {_fpt= NULL;}
~ShellProcess() {if (_fpt) close();}
FILE * open(const char *cmd, const char *mode="r");
int close();
FILE * desc() const { return _fpt;} // non null if file is open
char * get_line(char * line, size_t s) const {return _fpt ? fgets(line, s, _fpt) : NULL;}
protected:
FILE * _fpt;
};
//----------------------------------------------------------------
class PartitionInfo
{
public:
PartitionInfo() : _disk(0), _part(0) {}
PartitionInfo(int disk, int part) {set(disk, part);}
void disk(int disk) { _disk=disk;}
int disk() const { return _disk;}
void partition(int part) { _part=part;}
int partition () const { return _part;}
const char * clabel() const { return _label.c_str();}
const std::string& label() const { return _label;}
void label(const char * l) {
if (l) _label = l;
removeSpaces(_label);
}
const char * cfsType() const { return _fsType.c_str();}
const std::string& fsType() const { return _fsType;}
void fsType(const char * fs) {
if (fs) _fsType = fs;
removeSpaces(_fsType);
}
void set(int disk, int part) { _disk =disk; _part = part;}
bool fromPartitionHdString(const char * inHdStr);
std::string toHdStr() const
{
std::string buf = "hd(n,m)";
buf[3]= '0'+disk();
buf[5]='0'+partition();
return buf;
}
int imageIndexFromFs() const;
protected:
void removeSpaces(std::string & s);
private:
int _disk, _part;
std::string _fsType, _label;
};
static inline bool isDiskIndexInf(PartitionInfo i, PartitionInfo j)
{
return ((i.disk()*100+i.partition()) < (j.disk()*100 + j.partition()) ) ;
}
//----------------------------------------------------------------
class PartitionExtractor : public ShellProcess
{
public:
PartitionExtractor() :ShellProcess() { init(); }
const std::vector<PartitionInfo>& extractPartitions(
const char* szHide=NULL,
const char* szRenamed=NULL);
int getListCount() const {return (int) _partList.size();}
const std::vector<PartitionInfo>& partList() const {return _partList;}
std::vector<PartitionInfo>& editPartList() {return _partList;}
// get the index in the internal partlist of the hd(n,m) partition specified by the input string
// return -1 if no match, >=0 if a match happens
int getIndexFromHdStringSpec(const char*);
void hidePartitions(const char* szParts){ _hiddenParts = (szParts ? szParts : "");}
void renamedPartitions(const char* szParts){ _renamedParts = (szParts ? szParts : "");}
void sortPartList() {sort(_partList.begin(), _partList.end(), isDiskIndexInf);}
const char * checkForRename(const char * label, const char* szHd);
void swapHD(int src, int dst)
{
if(src < 0 || src > MAX_HD-1 || dst < 0 || dst > MAX_HD-1) return;
_hdRedirTable[src]=dst;
_hdRedirTable[dst]=src;
}
void resetSwapping() { init();}
protected:
void init() {
for (int i=0; i<MAX_HD; i++) _hdRedirTable[i]=i;
}
private:
std::vector<PartitionInfo> _partList;
int _hdRedirTable[MAX_HD];
std::string _hiddenParts;
std::string _renamedParts;
};
trunk/ChameleonPrefPane/Sources/property_list.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
* property_list.h
*
* Created by Rekursor on 1/17/10.
*
*/
#include <CoreFoundation/CFPropertyList.h>
#include <CoreFoundation/CFURLAccess.h>
#include <Security/Authorization.h>
#include <string>
/****************************************************************/
/**
* priviledged command run for cmds like property chmods and restard command
*/
bool executePrivilegedCmd(AuthorizationRef auth,
const char* pathToTool,
const char* args=NULL,
AuthorizationFlags flags=kAuthorizationFlagDefaults);
/****************************************************************/
/**
* Simple PropertyList Abstraction
*/
class PropertyList
{
public:
PropertyList() : _proplistRef(0), _CFURLRef(0) {}
virtual ~PropertyList();
bool open(const char *propListPath, CFStringRef* errString,
AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool save(AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool isValid() const { return _proplistRef!=NULL;}
const char * getStringForKey(const char *key);
bool setStringForKey(const char* key, const char* value);
const char * bootConfigPath() const {
return _propFilePath.c_str();
}
static bool chmodFile(const char * path, const char * chmodMask,
AuthorizationRef auth, AuthorizationFlags flags=kAuthorizationFlagDefaults);
private:
CFPropertyListRef _proplistRef;
CFURLRef _CFURLRef;
std::string _propFilePath; // keep a track of the proplist filename
};
trunk/ChameleonPrefPane/Sources/AdvancedSetupController.h
4545
4646
4747
48
49
50
4851
4952
5053
IBOutlet NSTextField*mWakeImageText;
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
+ (AdvancedSetupController *)instance;
@end
trunk/ChameleonPrefPane/Sources/ChameleonPrefPane.mm
1010
1111
1212
13
14
13
14
1515
1616
1717
......
2929
3030
3131
32
33
34
3532
36
37
3833
39
40
41
42
43
44
45
4634
4735
4836
4937
5038
51
52
39
40
5341
5442
5543
......
7361
7462
7563
64
65
66
67
68
69
7670
7771
7872
7973
80
74
75
76
77
78
79
8180
82
81
82
83
84
85
86
87
88
89
90
8391
8492
8593
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
86138
87139
88140
......
101153
102154
103155
104
105
106156
107
108
109157
110158
111159
......
132180
133181
134182
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192183
193
194184
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238185
239186
240187
......
242189
243190
244191
245
192
246193
247194
248195
......
261208
262209
263210
264
265
266
267
268
269
270211
271212
272213
......
303244
304245
305246
306
247
307248
308249
250
309251
310252
311253
......
315257
316258
317259
318
319
260
261
320262
321263
322
323
264
265
324266
325267
326268
......
354296
355297
356298
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466299
467300
468301
......
542375
543376
544377
545
378
546379
547380
548381
#import "PeripheralsController.h"
#import "AdvancedSetupController.h"
#include <process.h>
#include <property_list.h>
#include "ShellProcess.h"
#import "BootPropertyList.h"
#include <string>
//--------------------------------------------------------------------------
};
static const char* const szPropFileName = "com.apple.Boot.plist";
static const char* const kDefaultPartition = "Default Partition";
static const char* const kHidePartition = "Hide Partition";
static const char* const kRenamePartition = "Rename Partition";
static const NSString* const kPreferencesFilePath = @"/Library/Preferences/com.chameleon.prefPane.plist";
static const NSString* const keyPreferencesFileVersion = @"version"; // for future back compatibility
static const int CurrentPreferencesFileVersion = 0x01; // for future back compatibility
static const NSString* const keyForceBootConfigPath = @"forceBootConfigPath";
static const NSString* const keySwapHD01 = @"swapHD01";
static const NSString* const keySwapHD02 = @"swapHD02";
static const NSString* const keyUseFrozenParts = @"useFrozenParts";
static const NSString* const keyPartitionsList = @"partitionsList";
static const char cPartDescSep = ';'; // partition descriptor separator
static const char* sPartDescSep = ";"; // cstring version
//--------------------------------------------------------------------------
// Static file variables
//--------------------------------------------------------------------------
static std::string sCurrentDefaultPartition;
static PartitionExtractor * partExtractor=NULL;
static PropertyList * prop = NULL;
PartitionExtractor * partExtractor=NULL;
BootPropertyList * prop = NULL;
static int currentRowSel = -1;
static ChameleonPrefPane *gInstance = NULL;
mUnknownImage = [self getImageResource: @"Chameleon" ofType: @"tiff"];
// create the propertylist object that will handle com.apple.Boot.plist
if(!prop) prop = new BootPropertyList();
// create the process that will extract the diskutil list infos
if(!partExtractor) partExtractor = new PartitionExtractor();
// Retrieve the com.chameleon.prefPane.plist config
return self;
}
- (NSMutableDictionary*) getPreferencesFile
- (NSMutableDictionary*) preferencesFile {return mOptionsDict; }
- (NSMutableDictionary*) preferencesParts {return mPartitionsDict; }
- (NSTableView*) partitionsTable { return mPartitionsTable;}
//--------------------------------------------------------------------------
-(bool) savePreferences: (NSDictionary*) dict
{
return mOptionsDict;
std::string sPath = [kPreferencesFilePath UTF8String];
if(dict==nil || sPath.length()==0) return false;
AuthorizationRef auth = [self isUnlocked] ? [[authView authorization] authorizationRef] : NULL;
PropertyList::chmodFile(sPath.c_str(), "0777", auth);
[dict writeToFile:kPreferencesFilePath atomically:YES];
PropertyList::chmodFile(sPath.c_str(), "0644", auth);
return true;
}
//--------------------------------------------------------------------------
- (void) loadPreferences
{
id oldGlobalPreferences = [ [NSDictionary dictionaryWithContentsOfFile:
kPreferencesFilePath ] retain];
mPartitionsDict = [[NSMutableDictionary alloc] init];
[mPartitionsDict retain];
// Initialize bootConfig desc dict
[[BootSetupController instance] addOptionsDesc];
[[BootFlagsController instance] addOptionsDesc];
[[PeripheralsController instance] addOptionsDesc];
[[AdvancedSetupController instance] addOptionsDesc];
if (oldGlobalPreferences!=nil)
{
mPreferenceFileVersion= [[oldGlobalPreferences objectForKey: keyPreferencesFileVersion] intValue ];
[PreferencesControllerBase setDefaultValues: oldGlobalPreferences];
[mPartitionsDict addEntriesFromDictionary: [oldGlobalPreferences objectForKey: keyPartitionsList] ];
}
else
{ // Create a preference plist file with Defaults values
oldGlobalPreferences = [[NSMutableDictionary alloc] init];
[[BootSetupController instance]loadOptionsFromPreferencesFile: oldGlobalPreferences];
[[BootSetupController instance]loadOptionsFromPreferencesFile: oldGlobalPreferences];
[[BootSetupController instance]loadOptionsFromPreferencesFile: oldGlobalPreferences];
[[BootSetupController instance]loadOptionsFromPreferencesFile: oldGlobalPreferences];
// Initialize defaults
[oldGlobalPreferences setObject: [[NSNumber alloc] initWithInt: CurrentPreferencesFileVersion]
forKey: keyPreferencesFileVersion];
[oldGlobalPreferences setObject: mPartitionsDict forKey: keyPartitionsList];
// Save the preferences file
[ self savePreferences:oldGlobalPreferences ];
}
mOptionsDict = [[NSMutableDictionary alloc] init];
[mOptionsDict addEntriesFromDictionary:oldGlobalPreferences];
if (mPartitionsDict!=nil) [mPartitionsDict retain];
[oldGlobalPreferences release];
}
//--------------------------------------------------------------------------
/**
* SFAuthorization delegates
*/
- (void) refreshLockStates
{
[mPartitionsTable setEnabled:[self isUnlocked]];
[mSwapHD01 setEnabled:[self isUnlocked]];
[mSwapHD02 setEnabled:[self isUnlocked]];
[mStatusText setEnabled:[self isUnlocked]];
[mFreezeParts setEnabled:[self isUnlocked]];
[mInjectFrozenParts setEnabled:[self isUnlocked]];
// Refresh other panels
[[BootSetupController instance] refreshLockStates];
return img;
}
//--------------------------------------------------------------------------
-(bool) savePreferences: (NSDictionary*) dict
{
std::string sPath = [kPreferencesFilePath UTF8String];
if(dict==nil || sPath.length()==0) return false;
AuthorizationRef auth = [self isUnlocked] ? [[authView authorization] authorizationRef] : NULL;
PropertyList::chmodFile(sPath.c_str(), "0777", auth);
[dict writeToFile:kPreferencesFilePath atomically:YES];
PropertyList::chmodFile(sPath.c_str(), "0644", auth);
return true;
}
//--------------------------------------------------------------------------
- (void) loadFrozenParts
{
std::vector<PartitionInfo>& partList = partExtractor->editPartList(); //rw
// iterate for all entries to add
char keyPartN[32] = "";
char buffer[256]="";
int k=0;
partList.clear();
for (int i=0; i<[mPartitionsDict count]; i++)
{
// get the key
snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
NSString* obj = [mPartitionsDict objectForKey: [[NSString alloc] initWithUTF8String: keyPartN] ];
// assign this key if valid
if (obj!=nil && [obj length]>0)
{
PartitionInfo p;
// parse string
strncpy(buffer, [obj UTF8String], sizeof(buffer)-1);
k=0;
for(const char* word = strtok(buffer,";"); word; word=strtok(NULL,sPartDescSep),k++)
{
switch (k) {
case 0: // parse disk number
if (isdigit(*word)) p.disk(*word-'0');
break;
case 1: // parse partition number
if (isdigit(*word)) p.partition(*word-'0');
break;
case 2: // parse volume label
p.label(word);
case 3:
p.fsType(word);
break;
default:
break;
}
}
partList.push_back(p);
}
}
partExtractor->sortPartList();
}
//--------------------------------------------------------------------------
- (void) loadPreferences
{
id oldGlobalPreferences = [ [NSDictionary dictionaryWithContentsOfFile:
kPreferencesFilePath ] retain];
mPartitionsDict = [[NSMutableDictionary alloc] init];
[mPartitionsDict retain];
if (oldGlobalPreferences!=nil)
{
mPreferenceFileVersion= [[oldGlobalPreferences objectForKey: keyPreferencesFileVersion] intValue ];
[mSwapHD01 setIntValue: [[oldGlobalPreferences objectForKey:keySwapHD01] intValue]];
[mSwapHD02 setIntValue: [[oldGlobalPreferences objectForKey:keySwapHD02] intValue]];
[mFreezeParts setIntValue: [[oldGlobalPreferences objectForKey: keyUseFrozenParts] intValue] ];
[mPartitionsDict addEntriesFromDictionary: [oldGlobalPreferences objectForKey: keyPartitionsList] ];
}
else
{ // Create a preference plist file with Defaults values
[mSwapHD01 setIntValue: 0];
[mSwapHD02 setIntValue: 0];
[mFreezeParts setIntValue: 0];
// Initialize defaults
oldGlobalPreferences = [[NSMutableDictionary alloc] init];
[oldGlobalPreferences setObject: [[NSNumber alloc] initWithInt: CurrentPreferencesFileVersion]
forKey: keyPreferencesFileVersion];
[oldGlobalPreferences setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD01];
[oldGlobalPreferences setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD02];
[oldGlobalPreferences setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
[oldGlobalPreferences setObject: mPartitionsDict forKey: keyPartitionsList];
// Save the preferences file
[ self savePreferences:oldGlobalPreferences ];
}
mOptionsDict = [[NSMutableDictionary alloc] init];
[mOptionsDict addEntriesFromDictionary:oldGlobalPreferences];
if (mPartitionsDict!=nil) [mPartitionsDict retain];
[oldGlobalPreferences release];
}
//--------------------------------------------------------------------------
/** When called here, all outlets references are initialized */
- (void)awakeFromNib
{ // called more than once, we only need one resource init
if(ft)
{
ft=false;
[self loadPreferences];
[selfloadPreferences];
[self initBootConfig];
}
}
authView.delegate = self;
[authView updateStatus:nil];
// create the propertylist object that will handle com.apple.Boot.plist
if(!prop) prop = new PropertyList();
// create the process that will extract the diskutil list infos
if(!partExtractor) partExtractor = new PartitionExtractor();
if (!prop->isValid())
{
std::string sPath;
else
{
[mStatusText setTextColor: [NSColor grayColor] ];
NSString* ns = [ [NSString alloc] initWithUTF8String:prop->bootConfigPath() ];
NSString* ns = [ [NSString alloc] initWithUTF8String:prop->propFilePath() ];
[mStatusText setStringValue: [NSString stringWithFormat: @"bootConfig: %@", ns] ];
}
if (prop->isValid())
{
// read options in the plist file
// partExtractor->resetSwapping();
id val = [mOptionsDict valueForKey: keySwapHD01];
[mSwapHD01 setIntValue: [val intValue] ];
[self doSwapHD: [val boolValue] save: false src:0 dst:1];
[[BootSetupController instance]->mSwapHD01 setIntValue: [val intValue] ];
[[BootSetupController instance] doSwapHD: [val boolValue] save: false src:0 dst:1];
val = [mOptionsDict valueForKey: keySwapHD02];
[mSwapHD02 setIntValue: [val intValue] ];
[self doSwapHD: [val boolValue] save: false src:0 dst:2];
[[BootSetupController instance]->mSwapHD02 setIntValue: [val intValue] ];
[[BootSetupController instance] doSwapHD: [val boolValue] save: false src:0 dst:2];
[self selectDefaultPartition];
}
}
//--------------------------------------------------------------------------
- (void) swapDisks: (bool) bSwap src: (int) iSrc dst: (int) iDst;
{
if(!partExtractor || !prop || !prop->isValid()) return;
if (bSwap)
{
partExtractor->swapHD(iSrc, iDst);
}
if ([mFreezeParts intValue]==0)
partExtractor->extractPartitions();
else
[self loadFrozenParts ];
[ self selectDefaultPartition];
}
//--------------------------------------------------------------------------
- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst
{
if( val>0 && ![mFreezeParts intValue]) //on
{
[self swapDisks: true src:isrc dst:idst ];
}
else
{
[self swapDisks: false src:isrc dst:idst ];
}
if(doSave)
{
if (isrc==0 && idst==1)
[mOptionsDict setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD01];
if (isrc==0 && idst==2)
[mOptionsDict setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD02];
[ self savePreferences:mOptionsDict ];
}
[mPartitionsTable reloadData];
[mPartitionsTable scrollRowToVisible: 0];
//[self tableViewSelectionDidChange: nil];
}
//--------------------------------------------------------------------------
- (IBAction)onSwapHD: (id)sender
{
partExtractor->resetSwapping();
[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
}
//--------------------------------------------------------------------------
- (IBAction)onUseFrozenParts: (id)sender
{
bool val = !![sender intValue];
[mOptionsDict setObject: [NSNumber numberWithBool: val] forKey: keyUseFrozenParts];
[self savePreferences: mOptionsDict];
[self onSwapHD: nil];
}
//--------------------------------------------------------------------------
- (IBAction)onInjectPartsToFreeze: (id)sender
{
int size = partExtractor ? partExtractor->partList().size() : 0;
if (!size)
{ // nothing to inject
NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
@"No current partitions to inject, did you check boot config file ?",@"OK", nil,nil);
return;
}
// generate the parts list in preferences proplist
NSInteger n = NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
@"Are you sure you want to overwrite your Freeze settings with current partition list ?",
@"OK", @"Cancel",nil);
if (n==1)
{
// populate the dictionary with the current partitions
// empty dictionary and update key in parent:
[mOptionsDict removeObjectForKey: keyPartitionsList];
[mPartitionsDict removeAllObjects ];
// iterate for all entries to add
char partDesc[256]="";
char keyPartN[32] = "";
for (int i=0; i< size; i++)
{
const PartitionInfo& p =partExtractor->partList()[i];
// format the partition key and descriptor string
snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
snprintf(partDesc, sizeof(partDesc)-1, "%d%c%d%c%s%c%s",
p.disk(), cPartDescSep,
p.partition(), cPartDescSep,
p.clabel(), cPartDescSep,
p.cfsType());
// write it to the dictionary
NSString * key = [[NSString alloc] initWithUTF8String: keyPartN];
NSString * desc = [[NSString alloc] initWithUTF8String: partDesc];
[mPartitionsDict setObject: desc forKey: key];
}
[mOptionsDict setObject: mPartitionsDict forKey: keyPartitionsList];
[self savePreferences: mOptionsDict];
}
}
//--------------------------------------------------------------------------
// following DieBuch recommendation : using applescript and system events (thanks!):
- (IBAction)onRestart: (id)sender
{
case 2:
ret = mLinuxImage;
break;
defualt:
default:
ret = mUnknownImage;
break;
trunk/ChameleonPrefPane/Sources/BootPropertyList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
* BootPropertyList.cpp
* ChameleonPrefPane
*
* Created by Rekursor on 1/22/10.
*
*/
#include "BootPropertyList.h"
void BootPropertyList::deleteOptionDesc()
{
// delete all alloc'ed pointers
std::map<void*, BootOptionDesc*>::iterator bod;
for (bod=_idToDescDict.begin(); bod!=_idToDescDict.end(); bod++)
if(bod->second) delete bod->second;
}
void BootPropertyList::clearOptionDesc()
{
deleteOptionDesc();
_idToDescDict.clear();// now clear the pairs
}
trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.h
77
88
99
10
11
1012
13
14
15
16
17
18
1119
1220
1321
1422
23
24
25
26
27
28
29
30
31
32
33
1534
16
17
18
1935
36
37
38
39
2040
2141
2242
2343
2444
25
2645
2746
28
47
48
2949
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
3065
#import <Cocoa/Cocoa.h>
#import <ChameleonPrefPane.h>
#import "BootPropertyList.h"
#import <ShellProcess.h>
// ENHANCE ME: remove this globals and integrate them in ChameleonPrefPan or at least
// add function accessor entry points
extern PartitionExtractor * partExtractor;
extern BootPropertyList * prop;
// Defintion of the required protocol for any derived classes of PreferencesControllerBase
@protocol PreferenceController
@required
// must be implemented in all derived classes
// Called by all buttons of each group in therface
- (IBAction) onCheckButtonChange: (NSButton*) sender;
// Called by all text fields of each group in therface
- (IBAction) onTextFiedChange: (NSTextField*) sender;
// Add the boot config options descriptors to the consolidated dictionary
- (void) addOptionsDesc;
// Set refresh all group states {enabled | disabled} depending on the authorizations state
- (void) refreshLockStates;
-(IBAction) onCheckButtonChange: (id) sender;
-(IBAction) onTextFiedChange: (id) sender;
-(void) loadOptionsFromPreferencesFile;
// load the corresponding Options from the interface
- (void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict;
@end
// Define common expected behavior for all derived controllers
@interface PreferencesControllerBase : NSObject
{
}
-(NSMutableDictionary*) getPreferencesDictionary;
// from the id to desc map in prop, set all default values for dict
+ (void) setDefaultValues: (NSMutableDictionary*) dict;
// Set refresh state {enabled | disabled} depending on the authorizations state
- (void) refreshLockState: (id) item;
- (void) loadPreferences;
- (bool) savePreferences;
- (bool) handleSender: (id) sender withButton: (NSButton*) button forKey: (const char *) key;
- (bool) handleSender: (id) sender withButton: (NSButton*) button andField:(NSTextField*) field
forKey: (const char *) key;
-(NSMutableDictionary*) preferencesFile;
-(NSMutableDictionary*) preferencesParts;
-(ChameleonPrefPane*) chameleon;
@end
trunk/ChameleonPrefPane/Sources/ShellProcess.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
* shell_process.cpp
*
* Created by Rekursor on 1/17/2010.
*
*/
#include "ShellProcess.h"
#include <string.h>
#include <sys/stat.h>
#include <string_util.h>
//----------------------------------------------------------------
// portable open process:
FILE * ShellProcess::open(const char *cmd, const char *mode) {
_fpt=::popen(cmd,mode);
return _fpt;
}
//----------------------------------------------------------------
int ShellProcess::close() {
int ret = ::pclose(_fpt);
_fpt=NULL;
return ret;
}
//----------------------------------------------------------------
void PartitionInfo::removeSpaces(std::string &str)
{
if (!str.size()) return;
int posl=0,posr=0;
for (posl=0; posl<str.size()-1 && str[posl]==' '; posl++);
for (posr=str.size()-1; posr>0 && str[posr]==' '; posr--);
str = (posl>posr) ? "" : str.substr(posl, posr-posl+1);
}
//----------------------------------------------------------------
/**
* return the image index corresponding to a fs:
*/
int PartitionInfo::imageIndexFromFs() const
{
if (_fsType.find("Apple")!=std::string::npos ||
_fsType.find("HFS")!=std::string::npos)
return 0; // Windows
else if (_fsType.find("Windows")!=std::string::npos ||
_fsType.find("Microsoft")!=std::string::npos ||
_fsType.find("NTFS")!=std::string::npos ||
_fsType.find("FAT")!=std::string::npos)
return 1; // Windows
else if (_fsType.find("Linux")!=std::string::npos)
return 2; // Unknown
return 10; //Unknown
}
//----------------------------------------------------------------
bool PartitionInfo::fromPartitionHdString(const char * inHdStr)
{
if (!inHdStr || !(*inHdStr) ||
strlen(inHdStr)<7 || !strstr(inHdStr,"hd(")) return false;
// enhance me here: should not assume that we have less than 10 partitions per disk/ disks
_disk = inHdStr[3]-'0';
_part = inHdStr[5]-'0';
return true;
}
//----------------------------------------------------------------
const char * PartitionExtractor::checkForRename(const char * label, const char *szHd)
{
const int MAX_ALIAS_SIZE=31;
static char szAlias[MAX_ALIAS_SIZE+1];
char *q=szAlias;
const char* szAliases = _renamedParts.c_str();
if (!szHd || !*szHd || !szAliases || !*szAliases) return label; // no renaming wanted
const char * p = strstr(szAliases, szHd);
if(!p || !(*p)) return label; // this volume must not be renamed, or option is malformed
p+= strlen(szHd); // skip the "hd(n,m) " field
// multiple aliases can be found separated by a semi-column
while(*p && *p != ';' && q<(szAlias+MAX_ALIAS_SIZE)) *q++=*p++;
*q='\0';
return szAlias;
}
//----------------------------------------------------------------
const std::vector<PartitionInfo>&
PartitionExtractor::extractPartitions(const char* szHide, const char* szRenamed)
{
const char * const diskTag = "/dev/disk";
const char * const nameTag = "NAME";
const char * const sizeTag = "SIZE";
PartitionInfo partInfo;
char line[1024]="";
char label[32]="", fsType[32]="" ;
size_t len=0;
int disk =0, part=0;
int label_pos=0, size_pos=0;
char * p=0,*q=0;
int skipwhite=0;
_partList.clear();
if (szHide) hidePartitions(szHide);
if (szRenamed) renamedPartitions(szRenamed);
this->open("diskutil list");
while(get_line(line, sizeof(line)-1))
{
// printf("%s\n",line);
len = strlen(line);
for(skipwhite=0; line[skipwhite]==' ';skipwhite++);
const char * sdisk = strstr(line, diskTag);
const char * sName = strstr(line, nameTag);
const char * sSize = strstr(line, sizeTag);
if (sdisk)
{
// extract disk number
disk= sdisk[strlen(diskTag)]-'0';
if (disk>=0 && disk <MAX_HD)
disk = _hdRedirTable[disk];
}
else if (len && line[skipwhite]=='#' && line[skipwhite+1]==':')
{
label_pos = sName ? (sName - line) : 0;
size_pos = sSize ? (sSize - line) : 0;
}
else if (len && line[skipwhite+1]==':' && isdigit(line[skipwhite]))
{
for (p=&line[skipwhite+2], q=fsType; *p && p < &line[label_pos-1]; p++,q++) *q=*p;
for (p=&line[label_pos], q=label; *p && p < &line[size_pos]; p++,q++) *q=*p;
*q='\0';
part = line[skipwhite]-'0';
partInfo.fsType(fsType);
partInfo.disk(disk);
partInfo.partition(part);
partInfo.label(checkForRename(label, partInfo.toHdStr().c_str()));
size_t len = partInfo.label().length();
// filter useless partitions:
if ( len > 0 &&
partInfo.clabel()[len-1] !='*' &&
partInfo.fsType()!="EFI" &&
partInfo.fsType()!="Apple_partition_scheme" &&
partInfo.fsType()!="Apple_partition_map" &&
partInfo.fsType()!="Apple_Free"
)
{
std::string DiskLabel(label), UnixPath, WinPath;
DiskLabel.erase( DiskLabel.find_last_not_of(" ") + 1);
bool found=false;
// early bail out if we found what we need:
if (fileExists((UnixPath = "/Volumes/" + DiskLabel + "/usr/bin/man")))
found=true;
else if ((strstr(label,"System Reserved") ) || // don't filter system reserved windows 7 boot parts
fileExists((WinPath="/Volumes/" + DiskLabel + "/Windows/system.ini")))
found=true;
else if (strstr(fsType,"Linux") && !strstr(fsType, "Linux_Swap"))
found=true; // Added Linux case
if (found)
{ //check if one of them exists
if (partInfo.label().size()==0) partInfo.label("Untitled");
if(_hiddenParts.length()==0 ||
_hiddenParts.find(partInfo.toHdStr()) == std::string::npos)
_partList.push_back(partInfo);
}
}
}
}
close();
sort(_partList.begin(), _partList.end(), isDiskIndexInf);
return _partList;
}
/**
* Get the index in the internal partlist of the hd(n,m) partition specified by the input string
* return -1 if no match, >=0 if a match happens
*/
int PartitionExtractor::getIndexFromHdStringSpec(const char* inHDStr)
{
PartitionInfo info;
if (info.fromPartitionHdString(inHDStr)) // try decode the partition disk and part infos
{
for (int i=0; i<_partList.size(); i++)
{
if (_partList[i].disk() == info.disk() && _partList[i].partition() == info.partition())
return i;
}
}
return -1;
}
trunk/ChameleonPrefPane/Sources/BootPropertyList.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* BootPropertyList.h
* ChameleonPrefPane
*
* Created by Rekursor on 1/22/10.
*
*/
#ifndef __CHBOOT_PROPERTYLIST_LIST_H
#define __CHBOOT_PROPERTYLIST_LIST_H
#include "PropertyList.h"
#include <map>
// Chameleon Boot options type
typedef enum
{
OptionYesNo=0,// "Yes" or "No"
OptionString,// String Content
OptionUnix,// Unix like command option like -x, -v ...
OptionKernel,// kernel cmd like "mach_kernel" or "blacklist=0"
OptionKernel1// kernel cmd like "mach_kernel" or "blacklist=0"
} BootOptionType;
// Boot Option descriptor : used by all derived class to permit parameters handling automation ...
struct BootOptionDesc
{
BootOptionDesc(void* i, void * cID, BootOptionType t, const char* n, const char* d) {
ID=i; contentID=cID, Type=t; Name=n; Default=d;
}
void*ID; // the corresponding button or textfield in the interface
void*contentID; // the corresponding content ID (i.e: the string content for text fields)
BootOptionTypeType;
const char *Name;
const char *Default;
} ;
/**
* Specialization of PropertyList with Chameleon Boot Config, fast id key to desc search features
*/
class BootPropertyList : public PropertyList
{
public:
BootPropertyList() {}
virtual ~BootPropertyList() {deleteOptionDesc(); }
// id to map BootOptionDesc handling
void addOptionDesc(void * ID, void* cID, BootOptionType t, const char * szName, const char* szDefault)
{
if (ID) _idToDescDict[ID] = new BootOptionDesc(ID, cID, t, szName? szName : "", szDefault ? szDefault : "");
}
// find the desc corresponding to id:
const BootOptionDesc* findOption(void *ID) const
{
std::map<void*, BootOptionDesc*>::const_iterator bod;
if (!ID || (bod=_idToDescDict.find(ID))==_idToDescDict.end()) return NULL;
return bod->second;
}
// opaque enumeration for the map
const BootOptionDesc* firstOption()
{
_bod=_idToDescDict.begin();
if (_bod!= _idToDescDict.end()) return _bod->second; else return NULL;
}
const BootOptionDesc* nextOption()
{
if(_bod++ ==_idToDescDict.end()) return NULL;
if (_bod != _idToDescDict.end()) return _bod->second; else return NULL;
}
// remove all elements in dict, calls deleteOptionsDesc()
void clearOptionDesc();
protected:
void deleteOptionDesc();
private:
std::map<void *, BootOptionDesc*> _idToDescDict; // dictionary for id -> desc association type
std::map<void*, BootOptionDesc*>::const_iterator _bod;
};
#endif
trunk/ChameleonPrefPane/Sources/PeripheralsController.mm
1414
1515
1616
17
18
17
1918
2019
21
22
23
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2434
2535
2636
27
28
29
30
31
32
33
34
35
36
37
38
37
38
39
40
41
42
43
44
45
46
47
48
3949
4050
41
51
4252
4353
4454
4555
46
56
4757
4858
4959
5060
51
61
5262
5363
5464
- (id) init
{
self = [super init];
gInstance = self;
return (gInstance = self);
}
// TODO implement a smart & reusable option modification, usable by all controllers
// these pair of methods in each controller should all rely on a single external class instance (singleton)
// that would implement in an opaque way the options streaming between the panels and the pref. file
//--------------------------------------------------------------------------
- (void) addOptionsDesc
{
prop->addOptionDesc(mLegacyLogo, nil, OptionYesNo, "Legacy Logo", "No");
prop->addOptionDesc(mBootBanner, nil, OptionYesNo, "Boot Banner", "No");
prop->addOptionDesc(mVBIOS, nil, OptionYesNo, "VBIOS", "No");
prop->addOptionDesc(mVideoROM, mVideoROMText, OptionString, "VideoROM", "");
prop->addOptionDesc(mGraphicsMode, mGraphicsModeText, OptionString, "Graphics Mode", "");
prop->addOptionDesc(mGraphicsEnabler, nil, OptionYesNo, "GraphicsEnabler", "No");
prop->addOptionDesc(mUSBBusFix, nil, OptionYesNo, "USBBusFix", "No");
prop->addOptionDesc(mEHCIacquire, nil, OptionYesNo, "EHCIacquire", "No");
prop->addOptionDesc(mUHCIreset, nil,OptionYesNo, "UHCIreset", "No");
prop->addOptionDesc(mEthernetBuiltIn, nil, OptionYesNo, "EthernetBuiltIn", "No");
}
- (void) refreshLockStates
{
[mLegacyLogo setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mBootBanner setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mVBIOS setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mVideoROM setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mVideoROMText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mGraphicsMode setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mGraphicsModeText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mGraphicsEnabler setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mUSBBusFix setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mEHCIacquire setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mUHCIreset setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mEthernetBuiltIn setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[self refreshLockState: mLegacyLogo ];
[self refreshLockState: mBootBanner ];
[self refreshLockState: mVBIOS ];
[self refreshLockState: mVideoROM ];
[self refreshLockState: mVideoROMText ];
[self refreshLockState: mGraphicsMode ];
[self refreshLockState: mGraphicsModeText ];
[self refreshLockState: mGraphicsEnabler ];
[self refreshLockState: mUSBBusFix ];
[self refreshLockState: mEHCIacquire ];
[self refreshLockState: mUHCIreset ];
[self refreshLockState: mEthernetBuiltIn ];
}
-(IBAction) onCheckButtonChange: (id) sender
-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
{
}
-(IBAction) onTextFiedChange: (id) sender
-(IBAction) onCheckButtonChange: (NSButton*) sender
{
}
-(void) loadOptionsFromPreferencesFile
-(IBAction) onTextFiedChange: (NSTextField*) sender
{
}
trunk/ChameleonPrefPane/Sources/ShellProcess.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
* shell_process.h
*
* Created by Rekursor on 1/17/2010.
*
*/
#ifndef __CHSHELL_PROCESS_H
#define __CHSHELL_PROCESS_H
#include <Security/Authorization.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <vector>
#include <string>
//----------------------------------------------------------------
const int MAX_HD = 10;
//----------------------------------------------------------------
/**
* Check whether file exists:
*/
inline bool fileExists(const char * str)
{
struct stat stFileInfo;
if((stat(str,&stFileInfo)) == 0) return true;
else return false;
}
inline bool fileExists(std::string str) {return fileExists(str.c_str());}
//----------------------------------------------------------------
class ShellProcess
{
public:
// construction / destruction
ShellProcess() {_fpt= NULL;}
~ShellProcess() {if (_fpt) close();}
FILE * open(const char *cmd, const char *mode="r");
int close();
FILE * desc() const { return _fpt;} // non null if file is open
char * get_line(char * line, size_t s) const {return _fpt ? fgets(line, s, _fpt) : NULL;}
protected:
FILE * _fpt;
};
//----------------------------------------------------------------
class PartitionInfo
{
public:
PartitionInfo() : _disk(0), _part(0) {}
PartitionInfo(int disk, int part) {set(disk, part);}
void disk(int disk) { _disk=disk;}
int disk() const { return _disk;}
void partition(int part) { _part=part;}
int partition () const { return _part;}
const char * clabel() const { return _label.c_str();}
const std::string& label() const { return _label;}
void label(const char * l) {
if (l) _label = l;
removeSpaces(_label);
}
const char * cfsType() const { return _fsType.c_str();}
const std::string& fsType() const { return _fsType;}
void fsType(const char * fs) {
if (fs) _fsType = fs;
removeSpaces(_fsType);
}
void set(int disk, int part) { _disk =disk; _part = part;}
bool fromPartitionHdString(const char * inHdStr);
std::string toHdStr() const
{
std::string buf = "hd(n,m)";
buf[3]= '0'+disk();
buf[5]='0'+partition();
return buf;
}
int imageIndexFromFs() const;
protected:
void removeSpaces(std::string & s);
private:
int _disk, _part;
std::string _fsType, _label;
};
static inline bool isDiskIndexInf(PartitionInfo i, PartitionInfo j)
{
return ((i.disk()*100+i.partition()) < (j.disk()*100 + j.partition()) ) ;
}
//----------------------------------------------------------------
class PartitionExtractor : public ShellProcess
{
public:
PartitionExtractor() :ShellProcess() { init(); }
const std::vector<PartitionInfo>& extractPartitions(
const char* szHide=NULL,
const char* szRenamed=NULL);
int getListCount() const {return (int) _partList.size();}
const std::vector<PartitionInfo>& partList() const {return _partList;}
std::vector<PartitionInfo>& editPartList() {return _partList;}
// get the index in the internal partlist of the hd(n,m) partition specified by the input string
// return -1 if no match, >=0 if a match happens
int getIndexFromHdStringSpec(const char*);
void hidePartitions(const char* szParts){ _hiddenParts = (szParts ? szParts : "");}
void renamedPartitions(const char* szParts){ _renamedParts = (szParts ? szParts : "");}
void sortPartList() {sort(_partList.begin(), _partList.end(), isDiskIndexInf);}
const char * checkForRename(const char * label, const char* szHd);
void swapHD(int src, int dst)
{
if(src < 0 || src > MAX_HD-1 || dst < 0 || dst > MAX_HD-1) return;
_hdRedirTable[src]=dst;
_hdRedirTable[dst]=src;
}
void resetSwapping() { init();}
protected:
void init() {
for (int i=0; i<MAX_HD; i++) _hdRedirTable[i]=i;
}
private:
std::vector<PartitionInfo> _partList;
int _hdRedirTable[MAX_HD];
std::string _hiddenParts;
std::string _renamedParts;
};
#endif
trunk/ChameleonPrefPane/Sources/BootFlagsController.mm
77
88
99
10
11
12
1013
1114
15
1216
1317
1418
......
1721
1822
1923
20
21
22
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2338
2439
2540
26
27
28
29
30
31
32
33
34
35
36
37
38
39
41
42
43
44
45
46
47
48
49
50
51
52
4053
4154
42
55
4356
4457
4558
4659
47
60
4861
4962
5063
5164
52
65
5366
5467
5568
#import "BootFlagsController.h"
// Constants
// File static variables
static BootFlagsController *gInstance = NULL;
@implementation BootFlagsController
- (id) init
return (gInstance = self);
}
// TODO implement a smart & reusable option modification, usable by all controllers
// these pair of methods in each controller should all rely on a single external class instance (singleton)
// that would implement in an opaque way the options streaming between the panels and the pref. file
-(void) addOptionsDesc
{
prop->addOptionDesc(mVerbose, nil, OptionUnix, "-v", "");
prop->addOptionDesc(mSafeBoot, nil, OptionUnix, "-x", "");
prop->addOptionDesc(mIgnoreBootConfig, nil, OptionUnix, "-F", "");
prop->addOptionDesc(mSingleUser, nil, OptionUnix, "-s", "");
prop->addOptionDesc(mTimeOut, mTimeOutText, OptionString,"Timeout", "5");
prop->addOptionDesc(mQuietBoot, nil, OptionYesNo, "Quiet Boot", "No");
prop->addOptionDesc(mInstantMenu, nil, OptionYesNo, "Instant Menu", "No");
prop->addOptionDesc(mWait, nil, OptionYesNo, "Wait", "No");
prop->addOptionDesc(mRescan, nil, OptionYesNo, "Rescan", "No");
prop->addOptionDesc(mRescanPrompt, nil, OptionYesNo, "Rescan Prompt", "No");
prop->addOptionDesc(mRescanSingleDrive, nil, OptionYesNo, "Rescan SingleDrive", "No");
}
- (void) refreshLockStates
{
[mVerbose setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSafeBoot setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mIgnoreBootConfig setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mTimeOut setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mTimeOutText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSingleUser setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mQuietBoot setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mInstantMenu setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mWait setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSafeBoot setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mIgnoreBootConfig setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mRescan setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mRescanPrompt setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mRescanSingleDrive setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[self refreshLockState: mVerbose];
[self refreshLockState: mSafeBoot];
[self refreshLockState: mIgnoreBootConfig];
[self refreshLockState: mTimeOut];
[self refreshLockState: mTimeOutText];
[self refreshLockState: mSingleUser];
[self refreshLockState: mQuietBoot];
[self refreshLockState: mInstantMenu];
[self refreshLockState: mWait];
[self refreshLockState: mRescan];
[self refreshLockState: mRescanPrompt];
[self refreshLockState: mRescanSingleDrive];
}
-(IBAction) onCheckButtonChange: (id) sender
-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
{
}
-(IBAction) onTextFiedChange: (id) sender
-(IBAction) onCheckButtonChange: (NSButton*) sender
{
}
-(void) loadOptionsFromPreferencesFile
-(IBAction) onTextFiedChange: (NSTextField*) sender
{
}
trunk/ChameleonPrefPane/Sources/BootSetupController.mm
11
2
2
33
44
55
66
77
88
9
910
11
12
1013
1114
1215
1316
1417
18
1519
1620
1721
1822
1923
2024
21
22
23
25
26
27
28
29
30
31
32
33
2434
2535
26
27
28
29
30
31
36
37
38
39
40
41
42
43
44
45
3246
3347
34
48
49
3550
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
36107
37108
38109
39
110
111
40112
113
114
115
116
117
41118
119
120
121
122
123
124
125
42126
43127
44
128
129
45130
46131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
47154
48155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
49247
50248
51249
//
// PartitionsSetupController.mm
// BootSetupController.mm
// ChameleonPrefPane
//
// Created by Rekursor on 1/22/10.
//
#import "BootSetupController.h"
#import "ChameleonPrefPane.h"
static const char* sPartDescSep = ";"; // cstring version
static const char cPartDescSep = ';'; // partition descriptor separator
static BootSetupController *gInstance = NULL;
@implementation BootSetupController
//--------------------------------------------------------------------------
- (id) init
{
self = [super init];
return (gInstance = self);
}
// TODO implement a smart & reusable option modification, usable by all controllers
// these pair of methods in each controller should all rely on a single external class instance (singleton)
// that would implement in an opaque way the options streaming between the panels and the pref. file
//--------------------------------------------------------------------------
- (void) addOptionsDesc
{
prop->addOptionDesc(mDefaultPartition, nil, OptionString, "Default Partition", "");
prop->addOptionDesc(mHidePartition , mHidePartitionText, OptionString, "HidePartition", "");
prop->addOptionDesc(mRenamePartition , mRenamePartitionText, OptionString, "RenamePartition", "");
}
//--------------------------------------------------------------------------
- (void) refreshLockStates
{
[mDefaultPartition setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDefaultPartitionText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mHidePartition setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mHidePartitionText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mRenamePartition setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mRenamePartitionText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[self refreshLockState: mSwapHD01 ];
[self refreshLockState: mSwapHD02 ];
[self refreshLockState: mFreezeParts ];
[self refreshLockState: mInjectFrozenParts ];
[self refreshLockState: mDefaultPartition ];
[self refreshLockState: mDefaultPartitionText ];
[self refreshLockState: mHidePartition ];
[self refreshLockState: mHidePartitionText ];
[self refreshLockState: mRenamePartition ];
[self refreshLockState: mRenamePartitionText ];
}
-(IBAction) onCheckButtonChange: (id) sender
//--------------------------------------------------------------------------
-(void) setDefaultsValues: (NSMutableDictionary*) dict
{
[mSwapHD01 setIntValue: [[dict objectForKey:keySwapHD01] intValue]];
[mSwapHD02 setIntValue: [[dict objectForKey:keySwapHD02] intValue]];
[mFreezeParts setIntValue: [[dict objectForKey: keyUseFrozenParts] intValue] ];
}
//--------------------------------------------------------------------------
-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
{
[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD01];
[dict setObject: [[NSNumber alloc] initWithBool: false] forKey: keySwapHD02];
[dict setObject:[[NSNumber alloc] initWithBool: false] forKey: keyUseFrozenParts];
}
//--------------------------------------------------------------------------
- (void) loadFrozenParts
{
std::vector<PartitionInfo>& partList = partExtractor->editPartList(); //rw
// iterate for all entries to add
char keyPartN[32] = "";
char buffer[256]="";
int k=0;
partList.clear();
for (int i=0; i< [[self preferencesParts] count]; i++)
{
// get the key
snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
NSString* obj = [[self preferencesParts] objectForKey: [[NSString alloc] initWithUTF8String: keyPartN] ];
// assign this key if valid
if (obj!=nil && [obj length]>0)
{
PartitionInfo p;
// parse string
strncpy(buffer, [obj UTF8String], sizeof(buffer)-1);
k=0;
for(const char* word = strtok(buffer,";"); word; word=strtok(NULL,sPartDescSep),k++)
{
switch (k) {
case 0: // parse disk number
if (isdigit(*word)) p.disk(*word-'0');
break;
case 1: // parse partition number
if (isdigit(*word)) p.partition(*word-'0');
break;
case 2: // parse volume label
p.label(word);
case 3:
p.fsType(word);
break;
default:
break;
}
}
partList.push_back(p);
}
}
partExtractor->sortPartList();
}
-(IBAction) onTextFiedChange: (id) sender
//--------------------------------------------------------------------------
- (void) swapDisks: (bool) bSwap src: (int) iSrc dst: (int) iDst;
{
if(!partExtractor || !prop || !prop->isValid()) return;
if (bSwap)
{
partExtractor->swapHD(iSrc, iDst);
}
if ([mFreezeParts intValue]==0)
partExtractor->extractPartitions();
else
[self loadFrozenParts ];
[ [self chameleon] selectDefaultPartition];
}
-(void) loadOptionsFromPreferencesFile
//--------------------------------------------------------------------------
- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst
{
if( val>0 && ![[BootSetupController instance]->mFreezeParts intValue]) //on
{
[self swapDisks: true src:isrc dst:idst ];
}
else
{
[self swapDisks: false src:isrc dst:idst ];
}
if(doSave)
{
if (isrc==0 && idst==1)
[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD01];
if (isrc==0 && idst==2)
[[self preferencesFile] setObject: [NSNumber numberWithBool: val ? true : false] forKey: keySwapHD02];
[ [self chameleon] savePreferences:[self preferencesFile] ];
}
[[[ChameleonPrefPane instance] partitionsTable] reloadData];
[[[ChameleonPrefPane instance] partitionsTable] scrollRowToVisible: 0];
//[self tableViewSelectionDidChange: nil];
}
//--------------------------------------------------------------------------
- (IBAction)onInjectPartsToFreeze: (id)sender
{
int size = partExtractor ? partExtractor->partList().size() : 0;
if (!size)
{ // nothing to inject
NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
@"No current partitions to inject, did you check boot config file ?",@"OK", nil,nil);
return;
}
// generate the parts list in preferences proplist
NSInteger n = NSRunAlertPanel(@"Inject Partitions to Freeze Configuration",
@"Are you sure you want to overwrite your Freeze settings with current partition list ?",
@"OK", @"Cancel",nil);
if (n==1)
{
// populate the dictionary with the current partitions
// empty dictionary and update key in parent:
[[self preferencesFile] removeObjectForKey: keyPartitionsList];
[[self preferencesParts] removeAllObjects ];
// iterate for all entries to add
char partDesc[256]="";
char keyPartN[32] = "";
for (int i=0; i< size; i++)
{
const PartitionInfo& p =partExtractor->partList()[i];
// format the partition key and descriptor string
snprintf(keyPartN, sizeof(keyPartN)-1, "partition%02d",i);
snprintf(partDesc, sizeof(partDesc)-1, "%d%c%d%c%s%c%s",
p.disk(), cPartDescSep,
p.partition(), cPartDescSep,
p.clabel(), cPartDescSep,
p.cfsType());
// write it to the dictionary
NSString * key = [[NSString alloc] initWithUTF8String: keyPartN];
NSString * desc = [[NSString alloc] initWithUTF8String: partDesc];
[[self preferencesParts] setObject: desc forKey: key];
}
[[self preferencesFile] setObject: [self preferencesParts] forKey: keyPartitionsList];
[self savePreferences ];
}
}
//--------------------------------------------------------------------------
-(IBAction) onCheckButtonChange: (NSButton*) sender
{
if (sender == mSwapHD01 || sender == mSwapHD01)
{
partExtractor->resetSwapping();
[self doSwapHD: [mSwapHD01 intValue] save:true src:0 dst:1];
[self doSwapHD: [mSwapHD02 intValue] save:true src:0 dst:2];
}
else if (sender == mFreezeParts)
{
bool val = !![sender intValue];
[[self preferencesFile] setObject: [NSNumber numberWithBool: val] forKey: keyUseFrozenParts];
[[self chameleon] savePreferences: [self preferencesFile]];
[ self onCheckButtonChange: mSwapHD01];
}
else if (sender == mInjectFrozenParts)
{
[self onInjectPartsToFreeze: mInjectFrozenParts];
}
else if ( [self handleSender:sender withButton: mDefaultPartition andField: mDefaultPartitionText
forKey: kDefaultPartition] )
{
}
else if ( [self handleSender:sender withButton: mHidePartition andField: mHidePartitionText
forKey: kHidePartition] )
{
}
else if ( [self handleSender:sender withButton: mRenamePartition andField: mRenamePartitionText
forKey: kHidePartition] )
{
}
}
//--------------------------------------------------------------------------
-(IBAction) onTextFiedChange: (id) sender
{
}
//--------------------------------------------------------------------------
+ (BootSetupController *)instance { return(gInstance);}
@end
trunk/ChameleonPrefPane/Sources/PropertyList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
/*
* property_list.cpp
*
* Created by Rekursor on 1/17/10.
*
*/
#import "BootPropertyList.h"
#include <string.h>
#include <sys/stat.h>
/****************************************************************************/
/**
* Simple parsing and splitting args function, does handle env. vars
*/
static void parseArgs(const char * args, const char* argv[], int argvlen)
{
// Create a list of args fron the space delimited args parameters
int n=0;
if (args && *args)
{
bool skipSpaces = true;
bool prevCharwasDelim =false;
char * buf = strdup(args);
char lastPriorityDelim=' ';
printf("Parsing <%s>\n", args);
int k=0;
for (int i=0; i< strlen(args); i++)
{
switch (args[i])
{
case ' ': case '\t':
if(!skipSpaces) {
buf[k++]=args[i];
}
else {
prevCharwasDelim = true; // // keep a track of delim to further split tokens
}
break;
case '\0':
case '\'':
case '"':
if (!skipSpaces &&lastPriorityDelim!=args[i])
{ // consider the imbricated delim as a simple char
buf[k++]=args[i];
break;
}
if (!skipSpaces) // end of priority substr
{
skipSpaces = true;
lastPriorityDelim=' ';
buf[k]='\0';
argv[n++]=strdup(buf); // copy the priority substr
k=0; // reset the buf index for next token
buf[0]='\0';
}
else
{ // start of priority substr
skipSpaces=false;
lastPriorityDelim=args[i];
if(k>0) // previous string to store first
{
buf[k++]='\0'; // finish the substr
argv[n++]=strdup(buf); // copy the substr
k=0; // rest the index for next token
buf[0]='\0';
}
//if (args[i] !='\0') buf[k++] = args[i]; // start the new priority substr
}
break;
default: // non delimiters chars
if(skipSpaces && prevCharwasDelim)
{
if(k>0) // a previous substr was before the space
{ // store previous token
buf[k++]='\0'; // finish the substr
argv[n++]=strdup(buf); // copy the substr
k=0; // rest the index for next token
buf[0]='\0';
}
}
prevCharwasDelim = false;
buf[k++]=args[i];
break;
}
}
if(*buf)
{
buf[k]='\0';
argv[n++]=strdup(buf); // copy the last buffer
}
free((void*) buf);
}
argv[n]=NULL;
}
/****************************************************************************/
bool executePrivilegedCmd(AuthorizationRef auth,
const char* pathToTool,
const char* args,
AuthorizationFlags flags)
{
const char * argv[16];
parseArgs(args, argv, sizeof(argv)/sizeof(const char*));
// Execute Cmd
OSStatus status = AuthorizationExecuteWithPrivileges(auth, pathToTool,flags, (char**)argv, NULL);
// Cleanup mem
for (int i=0; argv[i]; i++) free ((void*) argv[i]);
return status ? false : true;
}
/****************************************************************************/
/**
* Write a property list from a file
*/
bool WritePropertyListToFile( CFPropertyListRef propertyList, CFURLRef fileURL )
{
CFDataRef xmlData;
Boolean status;
SInt32 errorCode;
// Convert the property list into XML data.
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, propertyList );
// Write the XML data to the file.
status = CFURLWriteDataAndPropertiesToResource (
fileURL, // URL to use
xmlData, // data to write
NULL,
&errorCode);
CFRelease(xmlData);
return status ? true: false;
}
/****************************************************************************/
/**
* Read a property list from a file
*/
static CFPropertyListRef CreatePropertyListFromFile( CFURLRef fileURL, CFStringRef * errorString ) {
CFPropertyListRef propertyList;
CFDataRef resourceData;
Boolean status;
SInt32 errorCode;
// Read the XML file.
status = CFURLCreateDataAndPropertiesFromResource(
kCFAllocatorDefault,
fileURL,
&resourceData, // place to put file data
NULL,
NULL,
&errorCode);
if (!status) return NULL;
// Reconstitute the dictionary using the XML data.
propertyList = CFPropertyListCreateFromXMLData( kCFAllocatorDefault,
resourceData,
kCFPropertyListMutableContainersAndLeaves,
errorString);
CFRelease( resourceData );
return propertyList;
}
/****************************************************************************/
static void show(CFStringRef formatString, ...) {
CFStringRef resultString;
CFDataRef data;
va_list argList;
va_start(argList, formatString);
resultString = CFStringCreateWithFormatAndArguments(NULL, NULL, formatString, argList);
va_end(argList);
data = CFStringCreateExternalRepresentation(NULL, resultString, CFStringGetSystemEncoding(), '?');
if (data != NULL) {
printf ("%.*s\n\n", (int)CFDataGetLength(data), CFDataGetBytePtr(data));
CFRelease(data);
}
CFRelease(resultString);
}
/****************************************************************************/
/*
* Always return a valid static const string, if the CFSTR is not valid, then we return ""
*/
static const char * CfsToCs(CFStringRef inRef)
{
static char buffer[512]="";
if(CFStringGetFileSystemRepresentation (inRef, buffer, sizeof(buffer)))
return buffer;
return "";
}
/****************************************************************************/
/**
* Creates a PropertyList Incstance
*/
PropertyList::~PropertyList()
{
if (_CFURLRef) CFRelease(_CFURLRef);
if (_proplistRef) CFRelease(_proplistRef);
}
bool PropertyList::chmodFile(const char * path, const char * chmodMask,
AuthorizationRef auth, AuthorizationFlags flags)
{
if (!path || !*path) return false;
if (auth)
{ // give write temporary write rights to the file
std::string args = chmodMask;
args += ' ';
args += path;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
return true;
}
/****************************************************************************/
/**
* Open a properlist from a path name
*/
bool PropertyList::open(const char * path, CFStringRef * errorString, AuthorizationRef auth, AuthorizationFlags flags)
{
bool ret = false;
if (!path || !*path) return false;
struct stat st;
if(stat(path,&st) != 0) return false; // file does not exist;
// give write temporary write rights to the file
if (!chmodFile(path,"0777", auth, flags)) return false;
_propFilePath = path;
CFStringRef cfPath = CFStringCreateWithCString (kCFAllocatorDefault, path, kCFStringEncodingUTF8);
CFURLRef inURL = CFURLCreateWithFileSystemPath( kCFAllocatorDefault,
cfPath,
kCFURLPOSIXPathStyle, // interpret as POSIX path
false ); // is it a directory?
CFRelease(cfPath);
if (_CFURLRef) CFRelease(_CFURLRef);
_CFURLRef = inURL;
if (_CFURLRef)
{
_proplistRef = CreatePropertyListFromFile(inURL, errorString);
if (_proplistRef)
ret= true;
}
// restore rights
ret= chmodFile(path,"0644", auth, flags);
return ret;
}
/****************************************************************************/
/**
* Save the current property list
*/
bool PropertyList::save(AuthorizationRef auth, AuthorizationFlags flags)
{
bool ret=false;
if (auth)
{ // give write temporary write rights to the file
std::string args = " 0777 "+ _propFilePath;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
if (_proplistRef && _CFURLRef)
ret= WritePropertyListToFile(_proplistRef,_CFURLRef);
if (auth)
{ // give write temporary write rights to the file
std::string args = " 0644 "+ _propFilePath;
if(!executePrivilegedCmd(auth, "/bin/chmod", args.c_str(), flags))
return false;
}
return ret;
}
/****************************************************************************/
/**
* Extract a sring value from a property list key,
* value returned is not owned by caller, copy it necessary.
*/
const char * PropertyList::getStringForKey(const char *key)
{
if (!_proplistRef) return 0;
CFDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFDictionaryRef) _proplistRef : NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString;
if (myDict && CFDictionaryGetValueIfPresent(myDict, cfKey, (const void **) &myString))
{
// show(CFSTR("Key '%@' found , value = <%@>\n"), cfKey, !myString ? CFSTR("") : myString);
CFRelease(cfKey);
return CfsToCs(myString);
}
if(cfKey) CFRelease(cfKey);
return NULL;
}
/****************************************************************************/
/**
* replace a sring value from a property list key,
* value returned is not owned by caller, copy it necessary.
*/
bool PropertyList::setStringForKey(const char *key, const char * value)
{
if (!_proplistRef) return false;
bool ret = false;
CFMutableDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFMutableDictionaryRef) _proplistRef : NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString = CFStringCreateWithCString (kCFAllocatorDefault, value, kCFStringEncodingUTF8);
if (myDict) {
CFDictionaryReplaceValue(myDict, cfKey, myString);
ret=true;
}
if(cfKey) CFRelease(cfKey);
if(myString) CFRelease(myString);
return ret;
}
trunk/ChameleonPrefPane/Sources/AdvancedSetupController.mm
1717
1818
1919
20
21
22
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2339
2440
2541
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
5167
5268
53
69
5470
5571
5672
5773
58
74
5975
6076
6177
6278
63
79
6480
6581
6682
83
6784
6885
6986
return (gInstance = self);
}
// TODO implement a smart & reusable option modification, usable by all controllers
// these pair of methods in each controller should all rely on a single external class instance (singleton)
// that would implement in an opaque way the options streaming between the panels and the pref. file
//--------------------------------------------------------------------------
- (void) addOptionsDesc
{
prop->addOptionDesc(mKernel, mKernelText, OptionKernel1, "", "mach_kernel"); // empty field for 1 field only "i.e: mach_kernel" syntax
prop->addOptionDesc(mDeviceRd, mDeviceRdText, OptionKernel, "rd", "disk0s1");
prop->addOptionDesc(mArch, mArchText, OptionKernel, "arch", "X86_64");
prop->addOptionDesc(mCPU, mCPUText, OptionKernel, "cpus", "4");
prop->addOptionDesc(mBusRatio, mBusRatioText, OptionKernel, "busratio", "20");
prop->addOptionDesc(mDebug, mDebugText, OptionString, "debug", "0x144");
prop->addOptionDesc(mIO, mIOText, OptionString, "io", "0xffffffff");
prop->addOptionDesc(mDisableKextsBlacklisting, nil, OptionString, "blacklist", "1");
prop->addOptionDesc(mDSDTFile, mDSDTFileText, OptionString, "DSDT", "");
prop->addOptionDesc(mDSDTDrop, nil, OptionYesNo, "DropSSDT", "No");
prop->addOptionDesc(mSMBIOSFile,mSMBIOSFileText, OptionString, "SMBIOS", "");
prop->addOptionDesc(mSMBIOSDefaults, nil, OptionYesNo, "SMBIOSdefaults", "No");
prop->addOptionDesc(mWake, nil, OptionYesNo, "Wake", "No");
prop->addOptionDesc(mForceWake, nil, OptionYesNo, "ForceWake", "No");
prop->addOptionDesc(mWakeImage, mWakeImageText, OptionString, "WakeImage", "");
}
- (void) refreshLockStates
{
[mKernel setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mKernelText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDeviceRd setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDeviceRdText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mArch setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mArchText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mCPU setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mCPUText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mBusRatio setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mBusRatioText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDebug setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDebugText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mIO setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mIOText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDisableKextsBlacklisting setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDSDTFile setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDSDTFileText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mDSDTDrop setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSMBIOSFile setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSMBIOSFileText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mSMBIOSDefaults setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mWake setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mForceWake setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mWakeImage setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[mWakeImageText setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
[self refreshLockState: mKernel ];
[self refreshLockState: mKernelText ];
[self refreshLockState: mDeviceRd ];
[self refreshLockState: mDeviceRdText ];
[self refreshLockState: mArch ];
[self refreshLockState: mArchText ];
[self refreshLockState: mCPU ];
[self refreshLockState: mCPUText ];
[self refreshLockState: mBusRatio ];
[self refreshLockState: mBusRatioText ];
[self refreshLockState: mDebug ];
[self refreshLockState: mDebugText ];
[self refreshLockState: mIO ];
[self refreshLockState: mIOText ];
[self refreshLockState: mDisableKextsBlacklisting ];
[self refreshLockState: mDSDTFile ];
[self refreshLockState: mDSDTFileText ];
[self refreshLockState: mDSDTDrop ];
[self refreshLockState: mSMBIOSFile ];
[self refreshLockState: mSMBIOSFileText ];
[self refreshLockState: mSMBIOSDefaults ];
[self refreshLockState: mWake ];
[self refreshLockState: mForceWake ];
[self refreshLockState: mWakeImage ];
[self refreshLockState: mWakeImageText ];
}
-(IBAction) onCheckButtonChange: (id) sender
-(void) loadOptionsFromPreferencesFile: (NSMutableDictionary*) dict
{
}
-(IBAction) onTextFiedChange: (id) sender
-(IBAction) onCheckButtonChange: (NSButton*) sender
{
}
-(void) loadOptionsFromPreferencesFile
-(IBAction) onTextFiedChange: (NSTextField*) sender
{
}
+ (AdvancedSetupController *)instance { return(gInstance);}
@end
trunk/ChameleonPrefPane/Sources/ChameleonPrefPane.h
99
1010
1111
12
13
14
15
16
17
18
19
1220
21
22
1323
1424
25
26
27
28
1529
1630
1731
......
2236
2337
2438
25
26
27
28
2939
3040
31
3241
42
43
44
45
3346
3447
3548
3649
3750
38
39
4051
4152
4253
4354
4455
56
57
58
59
4560
61
62
4663
4764
4865
49
50
51
5266
53
54
5567
5668
5769
58
59
6070
6171
6272
6373
6474
6575
66
6776
6877
69
70
7178
#import <SecurityFoundation/SFAuthorization.h>
#import <SecurityInterface/SFAuthorizationView.h>
// Constants
static const NSString* const keyForceBootConfigPath = @"forceBootConfigPath";
static const NSString* const keySwapHD01 = @"swapHD01";
static const NSString* const keySwapHD02 = @"swapHD02";
static const NSString* const keyUseFrozenParts = @"useFrozenParts";
static const NSString* const keyPartitionsList = @"partitionsList";
static const NSString* const kPreferencesFilePath = @"/Library/Preferences/com.chameleon.prefPane.plist";
static const NSString* const keyPreferencesFileVersion = @"version"; // for future back compatibility
// Interface
@interface ChameleonPrefPane : NSPreferencePane
{
@public
IBOutlet SFAuthorizationView *authView;
@private
// Objects corresponding to the interface mapping:
IBOutlet NSTableView *mPartitionsTable;
IBOutlet NSButton *mSleepButton;
IBOutlet NSButton *mShutDownButton;
IBOutlet NSButton *mRestartButton;
IBOutlet NSButton *mSwapHD01;
IBOutlet NSButton *mSwapHD02;
IBOutlet NSButton *mFreezeParts;
IBOutlet NSButton *mInjectFrozenParts;
IBOutlet NSTextField*mStatusText;
IBOutlet NSBox*mOptions;
IBOutlet SFAuthorizationView *authView;
NSMutableDictionary*mOptionsDict;
NSMutableDictionary*mPartitionsDict;
NSImage*mMacOSXImage;
NSImage*mWindowsImage;
NSImage*mLinuxImage;
NSImage*mUnknownImage;
NSImage*mCDROMImage;
NSMutableDictionary*mOptionsDict;
NSMutableDictionary*mPartitionsDict;
NSString*mOptionsPlistPath;
intmPreferenceFileVersion;
}
+ (ChameleonPrefPane*) instance; // return the current instance
- (void) loadPreferences;
- (bool) savePreferences: (NSDictionary*) dict;
- (NSMutableDictionary*) preferencesFile;
- (NSMutableDictionary*) preferencesParts;
- (NSTableView*) partitionsTable;
- (IBAction)onRestart: (id)sender;
- (IBAction)onShutdown: (id)sender;
- (IBAction)onSleep: (id)sender;
- (IBAction)onSwapHD: (id)sender;
- (IBAction)onUseFrozenParts: (id)sender;
- (IBAction)onInjectPartsToFreeze: (id)sender;
- (NSMutableDictionary*) getPreferencesFile;
- (void)awakeFromNib;
- (void)initBootConfig;
- (id) getImageResource: (NSString *) str ofType: (NSString*) sType;
- (void) loadPreferences;
- (bool) savePreferences: (NSDictionary*) dict;
- (void)tableViewSelectionDidChange:(NSNotification *)notification;
- (void) selectDefaultPartition;
- (bool)isUnlocked;
- (void) refreshLockStates;
- (void) doSwapHD: (int) val save: (bool) doSave src: (int)isrc dst: (int) idst;
- (void)tableViewSelectionDidChange:(NSNotification *)notification;
- (void) swapDisks: (bool) bSwap src: (int) iSrc dst: (int) iDst;
@end
trunk/ChameleonPrefPane/Sources/PropertyList.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
* property_list.h
*
* Created by Rekursor on 1/17/10.
*
*/
#ifndef __CHPROPERTYLIST_LIST_H
#define __CHPROPERTYLIST_LIST_H
#include <CoreFoundation/CFPropertyList.h>
#include <CoreFoundation/CFURLAccess.h>
#include <Security/Authorization.h>
#include <string>
/****************************************************************/
/**
* priviledged command run for cmds like property chmods and restard command
*/
bool executePrivilegedCmd(AuthorizationRef auth,
const char* pathToTool,
const char* args=NULL,
AuthorizationFlags flags=kAuthorizationFlagDefaults);
/****************************************************************/
/**
* Simple PropertyList Abstraction
*/
class PropertyList
{
public:
PropertyList() : _proplistRef(0), _CFURLRef(0) {}
virtual ~PropertyList();
bool open(const char *propListPath, CFStringRef* errString,
AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool save(AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool isValid() const { return _proplistRef!=NULL;}
const char * getStringForKey(const char *key);
bool setStringForKey(const char* key, const char* value);
const char * propFilePath() const {return _propFilePath.c_str(); }
static bool chmodFile(const char * path, const char * chmodMask,
AuthorizationRef auth, AuthorizationFlags flags=kAuthorizationFlagDefaults);
protected:
CFPropertyListRef _proplistRef;
CFURLRef _CFURLRef;
std::string _propFilePath; // keep a track of the proplist filename
};
#endif
trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.mm
66
77
88
9
910
1011
1112
1213
13
14
15
16
17
1418
15
19
20
21
22
23
24
25
26
1627
17
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1850
51
52
53
54
55
56
1957
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
20115
//
#import "PreferencesControllerBase.h"
#include <string>
@implementation PreferencesControllerBase
-(NSMutableDictionary*) getPreferencesDictionary
-(ChameleonPrefPane*) chameleon { return [ChameleonPrefPane instance]; }
//--------------------------------------------------------------------------
- (id) init
{
if ([ChameleonPrefPane instance]==nil) return nil;
self = [super init];
return self;
}
//--------------------------------------------------------------------------
// from the id to desc map in prop, set all default values for dict
+ (void) setDefaultValues: (NSMutableDictionary*) dict
{
return [[ChameleonPrefPane instance] getPreferencesFile];
for(const BootOptionDesc* bod = prop->firstOption();bod; bod=prop->nextOption())
{
switch (bod->Type)
{
case OptionYesNo:
[(NSButton*)bod->ID setIntValue: (toupper(bod->Default[0])=='Y' ? 1 : 0) ];
break;
case OptionKernel:
case OptionString:
[(NSButton*)bod->ID setIntValue: 0 ];
case OptionKernel1:
[(NSTextField*)bod->contentID setStringValue:
[[NSString alloc] initWithUTF8String: bod->Default] ];
break;
case OptionUnix:
[(NSButton*)bod->ID setIntValue: 0 ];
break;
default:
break;
}
}
}
//--------------------------------------------------------------------------
- (void) refreshLockState: (id) item
{
[item setEnabled:[[ChameleonPrefPane instance] isUnlocked]];
}
//--------------------------------------------------------------------------
- (void) loadPreferences
{
[ [ChameleonPrefPane instance] loadPreferences];
}
//--------------------------------------------------------------------------
- (bool) savePreferences
{
return [ [ChameleonPrefPane instance] savePreferences: [self preferencesFile] ];
}
//--------------------------------------------------------------------------
-(NSMutableDictionary*) preferencesFile
{
return [[ChameleonPrefPane instance] preferencesFile];
}
//--------------------------------------------------------------------------
-(NSMutableDictionary*) preferencesParts
{
return [[ChameleonPrefPane instance] preferencesParts];
}
//--------------------------------------------------------------------------
- (bool) handleSender: (id) sender withButton: (NSButton*) button forKey:(const char*) key
{
return [self handleSender: sender withButton: button andField: nil forKey: key];
}
//--------------------------------------------------------------------------
- (bool) handleSender: (id) sender withButton: (NSButton*) button andField:(NSTextField*) field forKey:(const char*) key
{
if((NSButton*)sender!=button || (NSTextField*)sender !=field) return false;
if ((NSButton*)sender==button)
{
if (prop && prop->isValid())
{
std::string keyValue = prop->getStringForKey(key);
if ( !![button intValue])
{
}
else
{
}
}
}
else
{ // field
}
return true;
}
@end
trunk/ChameleonPrefPane/Sources/PeripheralsController.h
1717
1818
1919
20
20
2121
2222
2323
......
3030
3131
3232
33
34
35
36
3337
3438
3539
IBOutlet NSButton*mBootBanner;
IBOutlet NSButton*mVBIOS;
IBOutlet NSButton*mVideoROM;
IBOutlet NSTextField*mVideoROMText;
IBOutlet NSTextField*mVideoROMText;
IBOutlet NSButton*mGraphicsMode;
IBOutlet NSTextField*mGraphicsModeText;
IBOutlet NSButton*mEthernetBuiltIn;
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
+ (PeripheralsController *)instance;
@end
trunk/ChameleonPrefPane/Sources/BootFlagsController.h
66
77
88
9
9
1010
1111
1212
......
3030
3131
3232
33
34
35
3336
3437
3538
//
#import <Cocoa/Cocoa.h>
#import <PreferencesControllerBase.h>
#import "PreferencesControllerBase.h"
// TabView subpane controller definition
IBOutlet NSButton*mRescanSingleDrive;
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
+ (BootFlagsController *)instance;
@end
trunk/ChameleonPrefPane/Sources/BootSetupController.h
66
77
88
9
9
1010
11
12
13
14
1115
1216
1317
1418
15
16
17
19
20
21
22
23
24
1825
1926
2027
......
2633
2734
2835
36
37
2938
39
40
3041
3142
3243
//
#import <Cocoa/Cocoa.h>
#import <PreferencesControllerBase.h>
#import "PreferencesControllerBase.h"
// Constants definitions
static const char* const kDefaultPartition = "Default Partition";
static const char* const kHidePartition = "Hide Partition";
static const char* const kRenamePartition = "Rename Partition";
// TabView subpane controller definition
@interface BootSetupController : PreferencesControllerBase <PreferenceController>
{
// TODO move swap hds and freeze buttons to this class
@public
IBOutlet NSButton *mSwapHD01;
IBOutlet NSButton *mSwapHD02;
IBOutlet NSButton *mFreezeParts;
IBOutlet NSButton *mInjectFrozenParts;
IBOutlet NSButton*mDefaultPartition;
IBOutlet NSTextField*mDefaultPartitionText;
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst;
+ (BootSetupController *)instance;
@end
trunk/ChameleonPrefPane/ChameleonPrefPane.xcodeproj/project.pbxproj
2323
2424
2525
26
27
2628
2729
2830
29
30
31
32
31
32
33
34
3335
3436
3537
......
6365
6466
6567
68
69
6670
6771
6872
69
70
71
72
73
74
75
76
7377
7478
7579
......
148152
149153
150154
155
156
151157
152158
153
154
155159
156160
157161
......
160164
161165
162166
163
164
165
166
167
168
169
170
171
172
167173
168174
169175
......
219225
220226
221227
222
223
228
229
224230
225231
226232
227233
228234
229235
236
230237
231238
232239
......
311318
312319
313320
314
315
321
322
316323
317324
318325
319326
320327
328
321329
322330
323331
01993199110A2C61003B056E /* string_util.h in Headers */ = {isa = PBXBuildFile; fileRef = 01993198110A2C61003B056E /* string_util.h */; };
019931DD110A37FA003B056E /* PreferencesControllerBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 019931DB110A37FA003B056E /* PreferencesControllerBase.h */; };
019931DE110A37FA003B056E /* PreferencesControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 019931DC110A37FA003B056E /* PreferencesControllerBase.mm */; };
01993567110AA9FA003B056E /* BootPropertyList.h in Headers */ = {isa = PBXBuildFile; fileRef = 01993565110AA9FA003B056E /* BootPropertyList.h */; };
01993568110AA9FA003B056E /* BootPropertyList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01993566110AA9FA003B056E /* BootPropertyList.cpp */; };
01A40F75110550F4002A74CD /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 01A40F74110550F4002A74CD /* CHANGES */; };
01B0E8141108B85A00ACF21B /* ChameleonPrefPane.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B0E80E1108B85A00ACF21B /* ChameleonPrefPane.h */; };
01B0E8151108B85A00ACF21B /* ChameleonPrefPane.mm in Sources */ = {isa = PBXBuildFile; fileRef = 01B0E80F1108B85A00ACF21B /* ChameleonPrefPane.mm */; };
01B0E8161108B85A00ACF21B /* process.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01B0E8101108B85A00ACF21B /* process.cpp */; };
01B0E8171108B85A00ACF21B /* process.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B0E8111108B85A00ACF21B /* process.h */; };
01B0E8181108B85A00ACF21B /* property_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01B0E8121108B85A00ACF21B /* property_list.cpp */; };
01B0E8191108B85A00ACF21B /* property_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B0E8131108B85A00ACF21B /* property_list.h */; };
01B0E8161108B85A00ACF21B /* ShellProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01B0E8101108B85A00ACF21B /* ShellProcess.cpp */; };
01B0E8171108B85A00ACF21B /* ShellProcess.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B0E8111108B85A00ACF21B /* ShellProcess.h */; };
01B0E8181108B85A00ACF21B /* PropertyList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01B0E8121108B85A00ACF21B /* PropertyList.cpp */; };
01B0E8191108B85A00ACF21B /* PropertyList.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B0E8131108B85A00ACF21B /* PropertyList.h */; };
01B0E8201108B87A00ACF21B /* CDROM.png in Resources */ = {isa = PBXBuildFile; fileRef = 01B0E81A1108B87A00ACF21B /* CDROM.png */; };
01B0E8211108B87A00ACF21B /* Chameleon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 01B0E81B1108B87A00ACF21B /* Chameleon.icns */; };
01B0E8221108B87A00ACF21B /* Chameleon.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 01B0E81C1108B87A00ACF21B /* Chameleon.tiff */; };
01993198110A2C61003B056E /* string_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_util.h; path = Sources/string_util.h; sourceTree = SOURCE_ROOT; };
019931DB110A37FA003B056E /* PreferencesControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreferencesControllerBase.h; path = Sources/PreferencesControllerBase.h; sourceTree = "<group>"; };
019931DC110A37FA003B056E /* PreferencesControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PreferencesControllerBase.mm; path = Sources/PreferencesControllerBase.mm; sourceTree = "<group>"; };
01993565110AA9FA003B056E /* BootPropertyList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BootPropertyList.h; path = Sources/BootPropertyList.h; sourceTree = "<group>"; };
01993566110AA9FA003B056E /* BootPropertyList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BootPropertyList.cpp; path = Sources/BootPropertyList.cpp; sourceTree = "<group>"; };
01A40F74110550F4002A74CD /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES; sourceTree = "<group>"; };
01B0E80E1108B85A00ACF21B /* ChameleonPrefPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ChameleonPrefPane.h; path = Sources/ChameleonPrefPane.h; sourceTree = "<group>"; };
01B0E80F1108B85A00ACF21B /* ChameleonPrefPane.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ChameleonPrefPane.mm; path = Sources/ChameleonPrefPane.mm; sourceTree = "<group>"; };
01B0E8101108B85A00ACF21B /* process.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = process.cpp; path = Sources/process.cpp; sourceTree = "<group>"; };
01B0E8111108B85A00ACF21B /* process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = process.h; path = Sources/process.h; sourceTree = "<group>"; };
01B0E8121108B85A00ACF21B /* property_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = property_list.cpp; path = Sources/property_list.cpp; sourceTree = "<group>"; };
01B0E8131108B85A00ACF21B /* property_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = property_list.h; path = Sources/property_list.h; sourceTree = "<group>"; };
01B0E8101108B85A00ACF21B /* ShellProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ShellProcess.cpp; path = Sources/ShellProcess.cpp; sourceTree = "<group>"; };
01B0E8111108B85A00ACF21B /* ShellProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ShellProcess.h; path = Sources/ShellProcess.h; sourceTree = "<group>"; };
01B0E8121108B85A00ACF21B /* PropertyList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PropertyList.cpp; path = Sources/PropertyList.cpp; sourceTree = "<group>"; };
01B0E8131108B85A00ACF21B /* PropertyList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PropertyList.h; path = Sources/PropertyList.h; sourceTree = "<group>"; };
01B0E81A1108B87A00ACF21B /* CDROM.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CDROM.png; path = Resources/CDROM.png; sourceTree = "<group>"; };
01B0E81B1108B87A00ACF21B /* Chameleon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Chameleon.icns; path = Resources/Chameleon.icns; sourceTree = "<group>"; };
01B0E81C1108B87A00ACF21B /* Chameleon.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Chameleon.tiff; path = Resources/Chameleon.tiff; sourceTree = "<group>"; };
isa = PBXGroup;
children = (
01993198110A2C61003B056E /* string_util.h */,
019931DB110A37FA003B056E /* PreferencesControllerBase.h */,
019931DC110A37FA003B056E /* PreferencesControllerBase.mm */,
01B0E80E1108B85A00ACF21B /* ChameleonPrefPane.h */,
01B0E80F1108B85A00ACF21B /* ChameleonPrefPane.mm */,
019931DB110A37FA003B056E /* PreferencesControllerBase.h */,
019931DC110A37FA003B056E /* PreferencesControllerBase.mm */,
019930DF110A0CB4003B056E /* BootSetupController.h */,
019930E0110A0CB4003B056E /* BootSetupController.mm */,
019930E6110A0D80003B056E /* BootFlagsController.h */,
019930FD110A0E6F003B056E /* PeripheralsController.mm */,
01993113110A0EB9003B056E /* AdvancedSetupController.h */,
01993114110A0EB9003B056E /* AdvancedSetupController.mm */,
01B0E8111108B85A00ACF21B /* process.h */,
01B0E8101108B85A00ACF21B /* process.cpp */,
01B0E8131108B85A00ACF21B /* property_list.h */,
01B0E8121108B85A00ACF21B /* property_list.cpp */,
01B0E8111108B85A00ACF21B /* ShellProcess.h */,
01B0E8101108B85A00ACF21B /* ShellProcess.cpp */,
01B0E8131108B85A00ACF21B /* PropertyList.h */,
01B0E8121108B85A00ACF21B /* PropertyList.cpp */,
01993565110AA9FA003B056E /* BootPropertyList.h */,
01993566110AA9FA003B056E /* BootPropertyList.cpp */,
);
name = Classes;
sourceTree = "<group>";
files = (
8D202CEA0486D31800D8A456 /* StartupPrefPane_Prefix.pch in Headers */,
01B0E8141108B85A00ACF21B /* ChameleonPrefPane.h in Headers */,
01B0E8171108B85A00ACF21B /* process.h in Headers */,
01B0E8191108B85A00ACF21B /* property_list.h in Headers */,
01B0E8171108B85A00ACF21B /* ShellProcess.h in Headers */,
01B0E8191108B85A00ACF21B /* PropertyList.h in Headers */,
019930E1110A0CB4003B056E /* BootSetupController.h in Headers */,
019930E8110A0D80003B056E /* BootFlagsController.h in Headers */,
019930FE110A0E6F003B056E /* PeripheralsController.h in Headers */,
01993115110A0EB9003B056E /* AdvancedSetupController.h in Headers */,
01993199110A2C61003B056E /* string_util.h in Headers */,
019931DD110A37FA003B056E /* PreferencesControllerBase.h in Headers */,
01993567110AA9FA003B056E /* BootPropertyList.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
buildActionMask = 2147483647;
files = (
01B0E8151108B85A00ACF21B /* ChameleonPrefPane.mm in Sources */,
01B0E8161108B85A00ACF21B /* process.cpp in Sources */,
01B0E8181108B85A00ACF21B /* property_list.cpp in Sources */,
01B0E8161108B85A00ACF21B /* ShellProcess.cpp in Sources */,
01B0E8181108B85A00ACF21B /* PropertyList.cpp in Sources */,
019930E2110A0CB4003B056E /* BootSetupController.mm in Sources */,
019930E9110A0D80003B056E /* BootFlagsController.mm in Sources */,
019930FF110A0E6F003B056E /* PeripheralsController.mm in Sources */,
01993116110A0EB9003B056E /* AdvancedSetupController.mm in Sources */,
019931DE110A37FA003B056E /* PreferencesControllerBase.mm in Sources */,
01993568110AA9FA003B056E /* BootPropertyList.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
trunk/ChameleonPrefPane/English.lproj/Chameleon.xib
1212
1313
1414
15
15
1616
1717
1818
......
7272
7373
7474
75
75
7676
7777
7878
......
724724
725725
726726
727
728727
729728
730729
......
733732
734733
735734
736
735
737736
738737
739738
......
762761
763762
764763
765
764
766765
767766
768767
......
818817
819818
820819
821
820
822821
823822
824823
......
859858
860859
861860
862
861
863862
864863
865864
......
913912
914913
915914
916
915
917916
918917
919918
920919
921
922
920
921
923922
924923
925924
926
927
925
926
928927
929928
930
929
931930
932931
933
932
934933
935934
936935
937936
938
937
939938
940939
941
940
942941
943942
944943
......
946945
947946
948947
949
950
948
949
951950
952951
953
952
954953
955954
956
955
957956
958957
959958
960959
961
960
962961
963962
964
963
965964
966965
967966
......
969968
970969
971970
972
973
971
972
974973
975974
976
975
977976
978977
979
978
980979
981980
982981
983982
984
983
985984
986985
987
986
988987
989988
990989
......
992991
993992
994993
995
996
994
995
997996
998997
999
998
1000999
10011000
1002
1001
10031002
10041003
10051004
10061005
1007
1006
10081007
10091008
10101009
......
10151014
10161015
10171016
1018
1017
10191018
10201019
10211020
......
10351034
10361035
10371036
1038
1037
10391038
10401039
10411040
......
10431042
10441043
10451044
1045
10461046
10471047
10481048
......
10791079
10801080
10811081
1082
1082
10831083
10841084
10851085
......
11011101
11021102
11031103
1104
1104
11051105
11061106
11071107
......
11231123
11241124
11251125
1126
1126
11271127
11281128
11291129
......
11451145
11461146
11471147
1148
1148
11491149
11501150
11511151
......
11841184
11851185
11861186
1187
1187
11881188
11891189
11901190
......
12061206
12071207
12081208
1209
1209
12101210
12111211
12121212
......
12281228
12291229
12301230
1231
1231
12321232
12331233
12341234
......
12361236
12371237
12381238
1239
1239
12401240
12411241
12421242
12431243
12441244
1245
1245
12461246
12471247
12481248
12491249
1250
1250
12511251
12521252
1253
1253
12541254
12551255
12561256
......
13071307
13081308
13091309
1310
1310
13111311
13121312
13131313
......
13291329
13301330
13311331
1332
1332
13331333
13341334
13351335
......
13511351
13521352
13531353
1354
1354
13551355
13561356
13571357
......
14221422
14231423
14241424
1425
1425
14261426
14271427
14281428
......
14441444
14451445
14461446
1447
1447
14481448
14491449
14501450
......
14831483
14841484
14851485
1486
1486
14871487
14881488
14891489
......
15051505
15061506
15071507
1508
1508
15091509
15101510
15111511
......
15441544
15451545
15461546
1547
1547
15481548
15491549
15501550
......
15521552
15531553
15541554
1555
1555
15561556
15571557
15581558
15591559
15601560
1561
1561
15621562
15631563
15641564
15651565
1566
1566
15671567
15681568
1569
1569
15701570
15711571
15721572
......
16231623
16241624
16251625
1626
1626
16271627
16281628
16291629
......
16451645
16461646
16471647
1648
1648
16491649
16501650
16511651
......
16671667
16681668
16691669
1670
1670
16711671
16721672
16731673
......
17241724
17251725
17261726
1727
1727
17281728
17291729
17301730
......
17951795
17961796
17971797
1798
1798
17991799
18001800
18011801
......
18171817
18181818
18191819
1820
1820
18211821
18221822
18231823
......
18391839
18401840
18411841
1842
1842
18431843
18441844
18451845
......
18781878
18791879
18801880
1881
1881
18821882
18831883
18841884
......
19171917
19181918
19191919
1920
1920
19211921
19221922
19231923
......
19391939
19401940
19411941
1942
1942
19431943
19441944
19451945
......
19781978
19791979
19801980
1981
1981
19821982
19831983
19841984
......
20542054
20552055
20562056
2057
2057
20582058
20592059
20602060
20612061
20622062
2063
2063
20642064
20652065
20662066
20672067
2068
2068
20692069
20702070
2071
2071
20722072
20732073
20742074
......
21252125
21262126
21272127
2128
2128
21292129
21302130
21312131
......
21472147
21482148
21492149
2150
2150
21512151
21522152
21532153
......
22382238
22392239
22402240
2241
2241
22422242
22432243
22442244
......
22602260
22612261
22622262
2263
2263
22642264
22652265
22662266
......
23172317
23182318
23192319
2320
2320
23212321
23222322
23232323
......
23392339
23402340
23412341
2342
2342
23432343
23442344
23452345
......
23642364
23652365
23662366
2367
2367
23682368
23692369
23702370
23712371
23722372
2373
2373
23742374
23752375
23762376
23772377
2378
2378
23792379
23802380
2381
2381
23822382
23832383
23842384
......
24192419
24202420
24212421
2422
2422
24232423
24242424
24252425
24262426
24272427
24282428
2429
2429
24302430
24312431
24322432
......
24652465
24662466
24672467
2468
2468
24692469
24702470
24712471
......
24732473
24742474
24752475
2476
2476
24772477
24782478
24792479
24802480
2481
2482
2481
2482
24832483
24842484
2485
2485
24862486
24872487
2488
2488
24892489
24902490
24912491
24922492
2493
2493
24942494
24952495
24962496
......
24982498
24992499
25002500
2501
2502
2501
2502
25032503
25042504
2505
2505
25062506
25072507
2508
2508
25092509
25102510
25112511
25122512
2513
2513
25142514
25152515
25162516
25172517
2518
2519
2518
2519
25202520
25212521
2522
2522
25232523
25242524
2525
2525
25262526
25272527
25282528
25292529
25302530
25312531
2532
2532
25332533
25342534
25352535
......
25482548
25492549
25502550
2551
2551
25522552
25532553
2554
2554
25552555
25562556
2557
2557
25582558
25592559
2560
2560
25612561
25622562
25632563
......
26952695
26962696
26972697
2698
2698
26992699
27002700
27012701
......
27032703
27042704
27052705
2706
2706
27072707
27082708
27092709
......
27112711
27122712
27132713
2714
2714
27152715
27162716
27172717
27182718
27192719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
27522720
27532721
2754
2722
27552723
27562724
27572725
......
27592727
27602728
27612729
2762
2763
2730
2731
27642732
27652733
27662734
27672735
27682736
27692737
2770
2738
27712739
27722740
27732741
......
27752743
27762744
27772745
2778
2746
27792747
27802748
27812749
......
27832751
27842752
27852753
2786
2754
27872755
27882756
27892757
......
27912759
27922760
27932761
2794
2762
27952763
27962764
27972765
......
27992767
28002768
28012769
2802
2770
28032771
28042772
28052773
......
28072775
28082776
28092777
2810
2778
28112779
28122780
28132781
......
28152783
28162784
28172785
2818
2786
28192787
28202788
28212789
......
28232791
28242792
28252793
2826
2794
28272795
28282796
28292797
......
28312799
28322800
28332801
2834
2802
28352803
28362804
28372805
......
28392807
28402808
28412809
2842
2810
28432811
28442812
28452813
......
28472815
28482816
28492817
2850
2818
28512819
28522820
28532821
......
28552823
28562824
28572825
2858
2826
28592827
28602828
28612829
......
28632831
28642832
28652833
2866
2834
28672835
28682836
28692837
......
28712839
28722840
28732841
2874
2875
2842
2843
28762844
28772845
28782846
28792847
28802848
28812849
2882
2850
28832851
28842852
28852853
......
28872855
28882856
28892857
2890
2858
28912859
28922860
28932861
......
28952863
28962864
28972865
2898
2866
28992867
29002868
29012869
......
29032871
29042872
29052873
2906
2874
29072875
29082876
29092877
......
29112879
29122880
29132881
2914
2882
29152883
29162884
29172885
......
29192887
29202888
29212889
2922
2890
29232891
29242892
29252893
......
29272895
29282896
29292897
2930
2898
29312899
29322900
29332901
......
29352903
29362904
29372905
2938
2906
29392907
29402908
29412909
......
29432911
29442912
29452913
2946
2914
29472915
29482916
29492917
......
29512919
29522920
29532921
2954
2922
29552923
29562924
29572925
......
29592927
29602928
29612929
2962
2930
29632931
29642932
29652933
......
29672935
29682936
29692937
2970
2938
29712939
29722940
29732941
......
29752943
29762944
29772945
2978
2946
29792947
29802948
29812949
......
29832951
29842952
29852953
2986
2954
29872955
29882956
29892957
......
29912959
29922960
29932961
2994
2962
29952963
29962964
29972965
......
29992967
30002968
30012969
3002
2970
30032971
30042972
30052973
......
30072975
30082976
30092977
3010
2978
30112979
30122980
30132981
......
30152983
30162984
30172985
3018
2986
30192987
30202988
30212989
......
30232991
30242992
30252993
3026
2994
30272995
30282996
30292997
......
30312999
30323000
30333001
3034
3002
30353003
30363004
30373005
......
30393007
30403008
30413009
3042
3010
30433011
30443012
30453013
......
30473015
30483016
30493017
3050
3018
30513019
30523020
30533021
......
30553023
30563024
30573025
3058
3026
30593027
30603028
30613029
......
30633031
30643032
30653033
3066
3034
30673035
30683036
30693037
......
30713039
30723040
30733041
3074
3042
30753043
30763044
30773045
......
30793047
30803048
30813049
3082
3083
3050
3051
30843052
30853053
30863054
30873055
30883056
30893057
3090
3058
30913059
30923060
30933061
......
30953063
30963064
30973065
3098
3066
30993067
31003068
31013069
......
31033071
31043072
31053073
3106
3074
31073075
31083076
31093077
......
31113079
31123080
31133081
3114
3082
31153083
31163084
31173085
......
31193087
31203088
31213089
3122
3090
31233091
31243092
31253093
......
31273095
31283096
31293097
3130
3098
31313099
31323100
31333101
......
31353103
31363104
31373105
3138
3139
3106
3107
31403108
31413109
31423110
31433111
31443112
31453113
3146
3114
31473115
31483116
31493117
......
31513119
31523120
31533121
3154
3122
31553123
31563124
31573125
......
31593127
31603128
31613129
3162
3130
31633131
31643132
31653133
......
31673135
31683136
31693137
3170
3138
31713139
31723140
31733141
......
31753143
31763144
31773145
3178
3146
31793147
31803148
31813149
......
31833151
31843152
31853153
3186
3154
31873155
31883156
31893157
......
31913159
31923160
31933161
3194
3162
31953163
31963164
31973165
......
31993167
32003168
32013169
3202
3170
32033171
32043172
32053173
......
32073175
32083176
32093177
3210
3211
3178
3179
32123180
32133181
32143182
32153183
32163184
32173185
3218
3186
32193187
32203188
32213189
......
32233191
32243192
32253193
3226
3194
32273195
32283196
32293197
......
32313199
32323200
32333201
3234
3202
32353203
32363204
32373205
......
32393207
32403208
32413209
3242
3210
32433211
32443212
32453213
......
32473215
32483216
32493217
3250
3218
32513219
32523220
32533221
......
32553223
32563224
32573225
3258
3226
32593227
32603228
32613229
......
32633231
32643232
32653233
3266
3234
32673235
32683236
32693237
......
32713239
32723240
32733241
3274
3242
32753243
32763244
32773245
......
32793247
32803248
32813249
3282
3250
32833251
32843252
32853253
......
32873255
32883256
32893257
3290
3258
32913259
32923260
32933261
......
32953263
32963264
32973265
3298
3266
32993267
33003268
33013269
33023270
33033271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
33043304
33053305
3306
3307
3306
3307
33083308
3309
3309
33103310
33113311
33123312
33133313
3314
3315
3314
3315
33163316
3317
3317
33183318
33193319
33203320
33213321
3322
3323
3322
3323
33243324
3325
3325
33263326
33273327
33283328
33293329
3330
3331
3330
3331
33323332
3333
3333
33343334
33353335
33363336
......
34433443
34443444
34453445
3446
3446
34473447
34483448
34493449
......
36443644
36453645
36463646
3647
3647
36483648
36493649
36503650
......
39033903
39043904
39053905
3906
3906
39073907
39083908
39093909
......
40394039
40404040
40414041
4042
4042
40434043
40444044
40454045
......
44364436
44374437
44384438
4439
4439
44404440
44414441
44424442
......
45374537
45384538
45394539
4540
4540
45414541
45424542
4543
4543
45444544
45454545
45464546
45474547
45484548
4549
4549
45504550
45514551
4552
4553
4554
4552
4553
4554
45554555
4556
4556
45574557
45584558
45594559
4560
4560
45614561
45624562
4563
4563
45644564
4565
4565
45664566
45674567
45684568
4569
4570
4569
4570
45714571
45724572
45734573
4574
4574
45754575
45764576
4577
4577
45784578
4579
4579
45804580
45814581
45824582
4583
4584
4583
4584
45854585
45864586
45874587
4588
4588
45894589
45904590
4591
4591
45924592
4593
4593
45944594
45954595
45964596
4597
4598
4597
4598
45994599
46004600
46014601
4602
4602
46034603
46044604
4605
4605
46064606
46074607
46084608
46094609
46104610
4611
4612
4611
4612
46134613
46144614
46154615
4616
4616
46174617
46184618
4619
4619
46204620
46214621
46224622
46234623
46244624
4625
4626
4625
4626
46274627
46284628
46294629
4630
4630
46314631
46324632
4633
4633
46344634
46354635
46364636
46374637
46384638
4639
4640
4639
4640
46414641
46424642
46434643
4644
4644
46454645
46464646
4647
4647
46484648
46494649
46504650
46514651
46524652
4653
4654
4653
4654
46554655
46564656
46574657
4658
4658
46594659
46604660
46614661
46624662
4663
4663
46644664
46654665
46664666
46674667
4668
4668
46694669
46704670
46714671
46724672
4673
4673
46744674
46754675
46764676
46774677
4678
4678
46794679
46804680
4681
4682
4683
4684
4681
4682
4683
4684
46854685
46864686
46874687
46884688
46894689
4690
4690
46914691
46924692
4693
4693
46944694
4695
4695
46964696
46974697
46984698
4699
4699
47004700
47014701
4702
4702
47034703
4704
4704
47054705
47064706
47074707
4708
4708
47094709
47104710
4711
4711
47124712
4713
4713
47144714
47154715
47164716
4717
4717
47184718
47194719
4720
4720
47214721
4722
4722
47234723
47244724
47254725
4726
4727
4726
4727
47284728
47294729
47304730
4731
4732
4731
4732
47334733
47344734
47354735
4736
4737
4736
4737
47384738
47394739
47404740
4741
4742
4741
4742
47434743
47444744
47454745
......
50075007
50085008
50095009
5010
5010
50115011
5012
5012
50135013
50145014
50155015
......
54815481
54825482
54835483
5484
5484
54855485
54865486
54875487
......
54915491
54925492
54935493
5494
5494
54955495
54965496
54975497
......
55015501
55025502
55035503
5504
5504
55055505
55065506
55075507
......
55205520
55215521
55225522
5523
5523
55245524
55255525
55265526
......
55295529
55305530
55315531
5532
5532
55335533
55345534
55355535
......
55385538
55395539
55405540
5541
5541
55425542
55435543
55445544
......
55475547
55485548
55495549
5550
5550
55515551
55525552
55535553
......
55835583
55845584
55855585
5586
5586
55875587
55885588
55895589
......
56005600
56015601
56025602
5603
56035604
5604
56055605
56065606
56075607
......
56805680
56815681
56825682
5683
56835684
5684
56855685
56865686
56875687
......
57345734
57355735
57365736
5737
57375738
5738
57395739
57405740
57415741
......
57445744
57455745
57465746
5747
57475748
57485749
5750
57495751
57505752
5753
5754
57515755
57525756
57535757
57545758
57555759
57565760
5761
57575762
57585763
5764
57595765
5766
5767
57605768
57615769
57625770
......
57715779
57725780
57735781
5774
57755782
57765783
57775784
5778
5779
57805785
57815786
57825787
57835788
57845789
57855790
5786
5787
5788
57895791
57905792
57915793
......
57945796
57955797
57965798
5797
5798
57995799
58005800
58015801
......
58055805
58065806
58075807
5808
5809
58105808
58115809
58125810
58135811
58145812
5815
5816
58175813
58185814
58195815
......
58235819
58245820
58255821
5826
5827
58285822
58295823
58305824
......
58605854
58615855
58625856
5857
58635858
5864
58655859
58665860
58675861
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="172"/>
<integer value="603"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTabViewItem" id="210384195">
<string key="NSIdentifier">1</string>
<object class="NSView" key="NSView" id="389526238">
<reference key="NSNextResponder" ref="869599070"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">292</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<string key="NSFrame">{{10, 33}, {640, 267}}</string>
<reference key="NSSuperview" ref="869599070"/>
</object>
<string key="NSLabel">Boot From ...</string>
<reference key="NSColor" ref="1061310622"/>
<object class="NSTabViewItem" id="1039429426">
<string key="NSIdentifier">2</string>
<object class="NSView" key="NSView" id="451295758">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder" ref="869599070"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="NSControlView" ref="778294972"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="934619686">
<object class="NSCustomResource" key="NSNormalImage" id="459398604">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
</object>
<reference key="NSControlView" ref="276176519"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="18675440"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSTitlePosition">2</int>
<bool key="NSTransparent">NO</bool>
</object>
<object class="NSBox" id="553496908">
<object class="NSBox" id="1043374456">
<reference key="NSNextResponder" ref="451295758"/>
<int key="NSvFlags">12</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSView" id="1009386940">
<reference key="NSNextResponder" ref="553496908"/>
<object class="NSView" id="776534053">
<reference key="NSNextResponder" ref="1043374456"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSButton" id="292597271">
<reference key="NSNextResponder" ref="1009386940"/>
<object class="NSButton" id="37616634">
<reference key="NSNextResponder" ref="776534053"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{12, 13}, {128, 18}}</string>
<reference key="NSSuperview" ref="1009386940"/>
<reference key="NSSuperview" ref="776534053"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="202851389">
<object class="NSButtonCell" key="NSCell" id="268393823">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Swap hd 0&lt;-&gt;1</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="292597271"/>
<reference key="NSControlView" ref="37616634"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="142232122">
<reference key="NSNextResponder" ref="1009386940"/>
<object class="NSButton" id="399108788">
<reference key="NSNextResponder" ref="776534053"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{150, 13}, {124, 18}}</string>
<reference key="NSSuperview" ref="1009386940"/>
<reference key="NSSuperview" ref="776534053"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="849958821">
<object class="NSButtonCell" key="NSCell" id="909560157">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Swap hd 0&lt;-&gt;2</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="142232122"/>
<reference key="NSControlView" ref="399108788"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="102885086">
<reference key="NSNextResponder" ref="1009386940"/>
<object class="NSButton" id="1067138506">
<reference key="NSNextResponder" ref="776534053"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{297, 13}, {161, 18}}</string>
<reference key="NSSuperview" ref="1009386940"/>
<reference key="NSSuperview" ref="776534053"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="940283145">
<object class="NSButtonCell" key="NSCell" id="565603593">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Use Freezed Parts List</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="102885086"/>
<reference key="NSControlView" ref="1067138506"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="606405827">
<reference key="NSNextResponder" ref="1009386940"/>
<object class="NSButton" id="748817052">
<reference key="NSNextResponder" ref="776534053"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{459, 7}, {159, 28}}</string>
<reference key="NSSuperview" ref="1009386940"/>
<reference key="NSSuperview" ref="776534053"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="633046573">
<object class="NSButtonCell" key="NSCell" id="806094313">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134348800</int>
<string key="NSContents">Inject Parts in Freeze File</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="606405827"/>
<reference key="NSControlView" ref="748817052"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
</object>
</object>
<string key="NSFrame">{{1, 1}, {626, 47}}</string>
<reference key="NSSuperview" ref="553496908"/>
<reference key="NSSuperview" ref="1043374456"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
</object>
</object>
<bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
</object>
</object>
<reference key="NSContentView" ref="1009386940"/>
<reference key="NSContentView" ref="776534053"/>
<int key="NSBorderType">1</int>
<int key="NSBoxType">0</int>
<int key="NSTitlePosition">2</int>
</object>
</object>
<string key="NSFrame">{{10, 33}, {640, 267}}</string>
<reference key="NSSuperview" ref="869599070"/>
</object>
<string key="NSLabel">Boot Setup</string>
<reference key="NSColor" ref="1061310622"/>
<reference key="NSControlView" ref="334542109"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="958084214"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="629897331"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="724579405"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="601436105"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="90016923"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="793808229"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="642724982">
<object class="NSButton" id="744752273">
<reference key="NSNextResponder" ref="252867636"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{141, 75}, {109, 18}}</string>
<reference key="NSSuperview" ref="252867636"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="296462912">
<object class="NSButtonCell" key="NSCell" id="450162552">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Safe Boot (-x)</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="642724982"/>
<reference key="NSControlView" ref="744752273"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="1050615289"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="728009658"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="712902523"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="732855392"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="915217355"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="668416335"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="552874632"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="455218521"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="452950132">
<object class="NSButton" id="628549159">
<reference key="NSNextResponder" ref="673251209"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{316, 44}, {98, 18}}</string>
<reference key="NSSuperview" ref="673251209"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="201615768">
<object class="NSButtonCell" key="NSCell" id="1025798338">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Video ROM</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="452950132"/>
<reference key="NSControlView" ref="628549159"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="512120668"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="498570608"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="767062089"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="698099005"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="317712564"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="366999"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="292282216"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="339794873"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="561126957"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="867800924"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="323622459"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSTextColor" ref="866655721"/>
</object>
</object>
<object class="NSButton" id="600093947">
<object class="NSButton" id="489715876">
<reference key="NSNextResponder" ref="1000898384"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{307, 15}, {184, 18}}</string>
<reference key="NSSuperview" ref="1000898384"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="5664459">
<object class="NSButtonCell" key="NSCell" id="612718662">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Disable kexts blacklisting</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="600093947"/>
<reference key="NSControlView" ref="489715876"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="969759846"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="787406084"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="100027946"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="478279075"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="353259796"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSControlView" ref="449337560"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSTextColor" ref="866655721"/>
</object>
</object>
<object class="NSButton" id="562928307">
<object class="NSButton" id="344346433">
<reference key="NSNextResponder" ref="59588505"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {63, 18}}</string>
<reference key="NSSuperview" ref="59588505"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="267208272">
<object class="NSButtonCell" key="NSCell" id="836463679">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Wake</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="562928307"/>
<reference key="NSControlView" ref="344346433"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="934619686"/>
<reference key="NSNormalImage" ref="459398604"/>
<reference key="NSAlternateImage" ref="731537593"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<reference key="NSTabView" ref="869599070"/>
</object>
</object>
<reference key="NSSelectedTabViewItem" ref="210384195"/>
<reference key="NSSelectedTabViewItem" ref="1039429426"/>
<reference key="NSFont" ref="930899267"/>
<int key="NSTvFlags">0</int>
<bool key="NSAllowTruncatedLabels">YES</bool>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="389526238"/>
<reference ref="451295758"/>
</object>
</object>
<object class="NSButton" id="474865121">
<string key="NSMinSize">{224.664, 32}</string>
<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
</object>
<object class="NSWindowTemplate" id="702156620">
<object class="NSWindowTemplate" id="8349391">
<int key="NSWindowStyleMask">8223</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{235, 265}, {464, 255}}</string>
<string key="NSWindowTitle">About the Chameleon Preferences Pane</string>
<string key="NSWindowClass">NSPanel</string>
<nil key="NSViewClass"/>
<object class="NSView" key="NSWindowView" id="887949744">
<object class="NSView" key="NSWindowView" id="908319067">
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextField" id="391488284">
<reference key="NSNextResponder" ref="887949744"/>
<object class="NSTextField" id="807647820">
<reference key="NSNextResponder" ref="908319067"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{245, 218}, {38, 17}}</string>
<reference key="NSSuperview" ref="887949744"/>
<reference key="NSSuperview" ref="908319067"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="877262205">
<object class="NSTextFieldCell" key="NSCell" id="413394443">
<int key="NSCellFlags">68288064</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">2.0.0</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="391488284"/>
<reference key="NSControlView" ref="807647820"/>
<reference key="NSBackgroundColor" ref="1061310622"/>
<object class="NSColor" key="NSTextColor" id="781028059">
<int key="NSColorSpace">1</int>
</object>
</object>
</object>
<object class="NSTextField" id="454658438">
<reference key="NSNextResponder" ref="887949744"/>
<object class="NSTextField" id="329015339">
<reference key="NSNextResponder" ref="908319067"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{182, 218}, {52, 17}}</string>
<reference key="NSSuperview" ref="887949744"/>
<reference key="NSSuperview" ref="908319067"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="205055722">
<object class="NSTextFieldCell" key="NSCell" id="807339214">
<int key="NSCellFlags">68288064</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">Version</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="454658438"/>
<reference key="NSControlView" ref="329015339"/>
<reference key="NSBackgroundColor" ref="1061310622"/>
<reference key="NSTextColor" ref="781028059"/>
</object>
</object>
<object class="NSTextField" id="1013031189">
<reference key="NSNextResponder" ref="887949744"/>
<object class="NSTextField" id="417745275">
<reference key="NSNextResponder" ref="908319067"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{46, 49}, {373, 154}}</string>
<reference key="NSSuperview" ref="887949744"/>
<reference key="NSSuperview" ref="908319067"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="565613597">
<object class="NSTextFieldCell" key="NSCell" id="294587452">
<int key="NSCellFlags">-1805517311</int>
<int key="NSCellFlags2">272629760</int>
<string type="base64-UTF8" key="NSContents">ICBJbml0aWFsIENvbmNlcHRpb24gJiBEZXNpZ246ICAKCVJla3Vyc29yCiAgCiAgQ3JldyBNZW1iZXJz
OiAgCglSZWt1cnNvciwgICBEaWVCdWNoZQogIAogIENvbnRyaWJ1dG9ycyAmIFRlc3RlcnM6ICAKCUJs
YWNrT1NYLCAgTWFzdGVyQ2hpZWYsICBkaWdpdGFsX2RyZWFtZXIsICBzbWl0aEBAA</string>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="1013031189"/>
<reference key="NSControlView" ref="417745275"/>
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MCAwIDAAA</bytes>
<object class="NSCustomObject" id="513945847">
<string key="NSClassName">ChameleonPrefPane</string>
</object>
<object class="NSCustomObject" id="765871699">
<object class="NSCustomObject" id="770879448">
<string key="NSClassName">BootSetupController</string>
</object>
<object class="NSCustomObject" id="597359082">
<object class="NSCustomObject" id="276543394">
<string key="NSClassName">BootFlagsController</string>
</object>
<object class="NSCustomObject" id="225164805">
<object class="NSCustomObject" id="2692381">
<string key="NSClassName">PeripheralsController</string>
</object>
<object class="NSCustomObject" id="422539145">
<object class="NSCustomObject" id="523685185">
<string key="NSClassName">AdvancedSetupController</string>
</object>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDefaultPartition</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="778294972"/>
</object>
<int key="connectionID">600</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mHidePartition</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="276176519"/>
</object>
<int key="connectionID">601</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mRenamePartition</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="18675440"/>
</object>
<int key="connectionID">602</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onSwapHD:</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="292597271"/>
</object>
<int key="connectionID">612</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onSwapHD:</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="142232122"/>
</object>
<int key="connectionID">613</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onUseFrozenParts:</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="102885086"/>
</object>
<int key="connectionID">614</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onInjectPartsToFreeze:</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="633046573"/>
</object>
<int key="connectionID">615</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mVerbose</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="334542109"/>
</object>
<int key="connectionID">616</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSafeBoot</string>
<reference key="source" ref="597359082"/>
<reference key="destination" ref="642724982"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="744752273"/>
</object>
<int key="connectionID">617</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mIgnoreBootConfig</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="958084214"/>
</object>
<int key="connectionID">618</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mTimeOut</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="724579405"/>
</object>
<int key="connectionID">619</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mTimeOutText</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="390095704"/>
</object>
<int key="connectionID">620</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSingleUser</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="629897331"/>
</object>
<int key="connectionID">621</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mQuietBoot</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="601436105"/>
</object>
<int key="connectionID">622</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mInstantMenu</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="90016923"/>
</object>
<int key="connectionID">623</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mWait</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="793808229"/>
</object>
<int key="connectionID">624</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mRescan</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="1050615289"/>
</object>
<int key="connectionID">625</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mRescanPrompt</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="712902523"/>
</object>
<int key="connectionID">626</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mRescanSingleDrive</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="728009658"/>
</object>
<int key="connectionID">627</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mLegacyLogo</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="455218521"/>
</object>
<int key="connectionID">628</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mBootBanner</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="732855392"/>
</object>
<int key="connectionID">629</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mVBIOS</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="552874632"/>
</object>
<int key="connectionID">631</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mVideoROM</string>
<reference key="source" ref="225164805"/>
<reference key="destination" ref="452950132"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="628549159"/>
</object>
<int key="connectionID">632</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mGraphicsMode</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="915217355"/>
</object>
<int key="connectionID">633</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mGraphicsModeText</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="174976306"/>
</object>
<int key="connectionID">634</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mGraphicsEnabler</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="668416335"/>
</object>
<int key="connectionID">635</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mUSBBusFix</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="498570608"/>
</object>
<int key="connectionID">636</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mEHCIacquire</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="767062089"/>
</object>
<int key="connectionID">637</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mUHCIreset</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="512120668"/>
</object>
<int key="connectionID">638</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mEthernetBuiltIn</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="698099005"/>
</object>
<int key="connectionID">639</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mKernel</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="292282216"/>
</object>
<int key="connectionID">640</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mKernelText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="971254835"/>
</object>
<int key="connectionID">641</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDeviceRd</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="317712564"/>
</object>
<int key="connectionID">642</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mVideoROMText</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="961902576"/>
</object>
<int key="connectionID">643</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mHidePartitionText</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="316034842"/>
</object>
<int key="connectionID">644</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mRenamePartitionText</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="386809836"/>
</object>
<int key="connectionID">645</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDefaultPartitionText</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="592293744"/>
</object>
<int key="connectionID">646</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDeviceRdText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="921716680"/>
</object>
<int key="connectionID">647</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mArch</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="323622459"/>
</object>
<int key="connectionID">648</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mArchText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="955621909"/>
</object>
<int key="connectionID">649</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mCPU</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="561126957"/>
</object>
<int key="connectionID">650</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mCPUText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="286479560"/>
</object>
<int key="connectionID">651</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mBusRatio</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="867800924"/>
</object>
<int key="connectionID">652</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mBusRatioText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="706656551"/>
</object>
<int key="connectionID">653</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDebug</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="366999"/>
</object>
<int key="connectionID">654</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDebugText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="515185243"/>
</object>
<int key="connectionID">655</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mIO</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="339794873"/>
</object>
<int key="connectionID">656</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mIOText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="426436104"/>
</object>
<int key="connectionID">657</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDisableKextsBlacklisting</string>
<reference key="source" ref="422539145"/>
<reference key="destination" ref="600093947"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="489715876"/>
</object>
<int key="connectionID">658</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDSDTFile</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="969759846"/>
</object>
<int key="connectionID">659</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDSDTFileText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="659879104"/>
</object>
<int key="connectionID">660</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mDSDTDrop</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="787406084"/>
</object>
<int key="connectionID">661</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSMBIOSFile</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="478279075"/>
</object>
<int key="connectionID">662</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSMBIOSFileText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="343027692"/>
</object>
<int key="connectionID">663</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSMBIOSDefaults</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="100027946"/>
</object>
<int key="connectionID">664</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mWake</string>
<reference key="source" ref="422539145"/>
<reference key="destination" ref="562928307"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="344346433"/>
</object>
<int key="connectionID">665</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mForceWake</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="353259796"/>
</object>
<int key="connectionID">666</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mWakeImage</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="449337560"/>
</object>
<int key="connectionID">667</int>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mWakeImageText</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="824428292"/>
</object>
<int key="connectionID">668</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="778294972"/>
</object>
<int key="connectionID">669</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="765871699"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="592293744"/>
</object>
<int key="connectionID">670</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="958084214"/>
</object>
<int key="connectionID">671</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="390095704"/>
</object>
<int key="connectionID">672</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="597359082"/>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="728009658"/>
</object>
<int key="connectionID">673</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="225164805"/>
<reference key="destination" ref="452950132"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="628549159"/>
</object>
<int key="connectionID">674</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="961902576"/>
</object>
<int key="connectionID">675</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="512120668"/>
</object>
<int key="connectionID">676</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="225164805"/>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="698099005"/>
</object>
<int key="connectionID">677</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="317712564"/>
</object>
<int key="connectionID">678</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="921716680"/>
</object>
<int key="connectionID">679</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="787406084"/>
</object>
<int key="connectionID">680</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="659879104"/>
</object>
<int key="connectionID">681</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="100027946"/>
</object>
<int key="connectionID">682</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="343027692"/>
</object>
<int key="connectionID">683</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="449337560"/>
</object>
<int key="connectionID">684</int>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="422539145"/>
<reference key="source" ref="523685185"/>
<reference key="destination" ref="824428292"/>
</object>
<int key="connectionID">685</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="399108788"/>
</object>
<int key="connectionID">691</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="37616634"/>
</object>
<int key="connectionID">692</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="1067138506"/>
</object>
<int key="connectionID">693</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="748817052"/>
</object>
<int key="connectionID">694</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSwapHD01</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="292597271"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="37616634"/>
</object>
<int key="connectionID">686</int>
<int key="connectionID">695</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mSwapHD02</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="142232122"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="399108788"/>
</object>
<int key="connectionID">687</int>
<int key="connectionID">696</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mFreezeParts</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="102885086"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="1067138506"/>
</object>
<int key="connectionID">688</int>
<int key="connectionID">697</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">mInjectFrozenParts</string>
<reference key="source" ref="513945847"/>
<reference key="destination" ref="606405827"/>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="748817052"/>
</object>
<int key="connectionID">689</int>
<int key="connectionID">698</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1030284511"/>
<reference ref="553496908"/>
<reference ref="1043374456"/>
</object>
<reference key="parent" ref="1039429426"/>
</object>
<reference ref="601436105"/>
<reference ref="90016923"/>
<reference ref="793808229"/>
<reference ref="642724982"/>
<reference ref="744752273"/>
</object>
<reference key="parent" ref="798772941"/>
</object>
<reference ref="915217355"/>
<reference ref="552874632"/>
<reference ref="455218521"/>
<reference ref="452950132"/>
<reference ref="628549159"/>
<reference ref="961902576"/>
</object>
<reference key="parent" ref="495127110"/>
<reference ref="366999"/>
<reference ref="292282216"/>
<reference ref="323622459"/>
<reference ref="600093947"/>
<reference ref="489715876"/>
<reference ref="921716680"/>
<reference ref="971254835"/>
<reference ref="955621909"/>
<reference ref="449337560"/>
<reference ref="824428292"/>
<reference ref="353259796"/>
<reference ref="562928307"/>
<reference ref="344346433"/>
</object>
<reference key="parent" ref="241622967"/>
</object>
</object>
<object class="IBObjectRecord">
<int key="objectID">576</int>
<reference key="object" ref="702156620"/>
<reference key="object" ref="8349391"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="887949744"/>
<reference ref="908319067"/>
</object>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">577</int>
<reference key="object" ref="887949744"/>
<reference key="object" ref="908319067"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1013031189"/>
<reference ref="454658438"/>
<reference ref="391488284"/>
<reference ref="417745275"/>
<reference ref="329015339"/>
<reference ref="807647820"/>
</object>
<reference key="parent" ref="702156620"/>
<reference key="parent" ref="8349391"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">580</int>
<reference key="object" ref="1013031189"/>
<reference key="object" ref="417745275"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="565613597"/>
<reference ref="294587452"/>
</object>
<reference key="parent" ref="887949744"/>
<reference key="parent" ref="908319067"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">581</int>
<reference key="object" ref="565613597"/>
<reference key="parent" ref="1013031189"/>
<reference key="object" ref="294587452"/>
<reference key="parent" ref="417745275"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">579</int>
<reference key="object" ref="454658438"/>
<reference key="object" ref="329015339"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="205055722"/>
<reference ref="807339214"/>
</object>
<reference key="parent" ref="887949744"/>
<reference key="parent" ref="908319067"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">582</int>
<reference key="object" ref="205055722"/>
<reference key="parent" ref="454658438"/>
<reference key="object" ref="807339214"/>
<reference key="parent" ref="329015339"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">578</int>
<reference key="object" ref="391488284"/>
<reference key="object" ref="807647820"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="877262205"/>
<reference ref="413394443"/>
</object>
<reference key="parent" ref="887949744"/>
<reference key="parent" ref="908319067"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">583</int>
<reference key="object" ref="877262205"/>
<reference key="parent" ref="391488284"/>
<reference key="object" ref="413394443"/>
<reference key="parent" ref="807647820"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">584</int>
<reference key="object" ref="452950132"/>
<reference key="object" ref="628549159"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="201615768"/>
<reference ref="1025798338"/>
</object>
<reference key="parent" ref="71889788"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">585</int>
<reference key="object" ref="201615768"/>
<reference key="parent" ref="452950132"/>
<reference key="object" ref="1025798338"/>
<reference key="parent" ref="628549159"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">586</int>
<reference key="object" ref="600093947"/>
<reference key="object" ref="489715876"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="5664459"/>
<reference ref="612718662"/>
</object>
<reference key="parent" ref="138697471"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">587</int>
<reference key="object" ref="5664459"/>
<reference key="parent" ref="600093947"/>
<reference key="object" ref="612718662"/>
<reference key="parent" ref="489715876"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">588</int>
<reference key="object" ref="642724982"/>
<reference key="object" ref="744752273"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="296462912"/>
<reference ref="450162552"/>
</object>
<reference key="parent" ref="927992596"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">589</int>
<reference key="object" ref="296462912"/>
<reference key="parent" ref="642724982"/>
<reference key="object" ref="450162552"/>
<reference key="parent" ref="744752273"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">590</int>
<reference key="object" ref="562928307"/>
<reference key="object" ref="344346433"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="267208272"/>
<reference ref="836463679"/>
</object>
<reference key="parent" ref="965868050"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">591</int>
<reference key="object" ref="267208272"/>
<reference key="parent" ref="562928307"/>
<reference key="object" ref="836463679"/>
<reference key="parent" ref="344346433"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">596</int>
<reference key="object" ref="765871699"/>
<reference key="object" ref="770879448"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">597</int>
<reference key="object" ref="597359082"/>
<reference key="object" ref="276543394"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">598</int>
<reference key="object" ref="225164805"/>
<reference key="object" ref="2692381"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">599</int>
<reference key="object" ref="422539145"/>
<reference key="object" ref="523685185"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">603</int>
<reference key="object" ref="553496908"/>
<reference key="object" ref="1043374456"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="102885086"/>
<reference ref="142232122"/>
<reference ref="606405827"/>
<reference ref="292597271"/>
<reference ref="1067138506"/>
<reference ref="399108788"/>
<reference ref="748817052"/>
<reference ref="37616634"/>
</object>
<reference key="parent" ref="451295758"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">604</int>
<reference key="object" ref="102885086"/>
<reference key="object" ref="1067138506"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="940283145"/>
<reference ref="565603593"/>
</object>
<reference key="parent" ref="553496908"/>
<reference key="parent" ref="1043374456"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">605</int>
<reference key="object" ref="142232122"/>
<reference key="object" ref="399108788"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="849958821"/>
<reference ref="909560157"/>
</object>
<reference key="parent" ref="553496908"/>
<reference key="parent" ref="1043374456"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">606</int>
<reference key="object" ref="606405827"/>
<reference key="object" ref="748817052"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="633046573"/>
<reference ref="806094313"/>
</object>
<reference key="parent" ref="553496908"/>
<reference key="parent" ref="1043374456"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">607</int>
<reference key="object" ref="292597271"/>
<reference key="object" ref="37616634"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="202851389"/>
<reference ref="268393823"/>
</object>
<reference key="parent" ref="553496908"/>
<reference key="parent" ref="1043374456"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">608</int>
<reference key="object" ref="202851389"/>
<reference key="parent" ref="292597271"/>
<reference key="object" ref="268393823"/>
<reference key="parent" ref="37616634"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">609</int>
<reference key="object" ref="633046573"/>
<reference key="parent" ref="606405827"/>
<reference key="object" ref="806094313"/>
<reference key="parent" ref="748817052"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">610</int>
<reference key="object" ref="849958821"/>
<reference key="parent" ref="142232122"/>
<reference key="object" ref="909560157"/>
<reference key="parent" ref="399108788"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">611</int>
<reference key="object" ref="940283145"/>
<reference key="parent" ref="102885086"/>
<reference key="object" ref="565603593"/>
<reference key="parent" ref="1067138506"/>
</object>
</object>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{107, 164}, {668, 368}}</string>
<string>{{62, 335}, {668, 368}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{107, 164}, {668, 368}}</string>
<string>{{62, 335}, {668, 368}}</string>
<integer value="1"/>
<integer value="1"/>
<string>{224.664, 10}</string>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="452950132"/>
<reference key="object" ref="628549159"/>
<string key="toolTip">Define the GFX card video ROM file that should be loaded at boot</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="600093947"/>
<reference key="object" ref="489715876"/>
<string key="toolTip">Disable the blacklist kexts filtering in voodoo based kernels. Has no effect on vanilla kernels. (Enabled by default)</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="642724982"/>
<reference key="object" ref="744752273"/>
<string key="toolTip">Force displaying the partition selection menu (default=No)</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="102885086"/>
<reference key="object" ref="1067138506"/>
<string key="toolTip">Use the freezed partitions list in located in the preference file for locking and manual handling purpose</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="142232122"/>
<reference key="object" ref="399108788"/>
<string key="toolTip">Swap disks indexes 0&lt;-&gt;2, use this option if your disk sequence in osx does not match the chameleon boot disk sequence</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="606405827"/>
<reference key="object" ref="748817052"/>
<string key="toolTip">Use this feature to initially inject the current dynamically listed partitions. Then you can change manually the partition disk numbers and labels in the preference file</string>
</object>
</object>
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="292597271"/>
<reference key="object" ref="37616634"/>
<string key="toolTip">Swap disks indexes 0&lt;-&gt;1, use this option if your disk sequence in osx does not match the chameleon boot disk sequence</string>
</object>
</object>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">689</int>
<int key="maxID">698</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>mDefaultPartition</string>
<string>mDefaultPartitionText</string>
<string>mFreezeParts</string>
<string>mHidePartition</string>
<string>mHidePartitionText</string>
<string>mInjectFrozenParts</string>
<string>mRenamePartition</string>
<string>mRenamePartitionText</string>
<string>mSwapHD01</string>
<string>mSwapHD02</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSButton</string>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSButton</string>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSButton</string>
<string>NSButton</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>onInjectPartsToFreeze:</string>
<string>onRestart:</string>
<string>onShutdown:</string>
<string>onSleep:</string>
<string>onSwapHD:</string>
<string>onUseFrozenParts:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>authView</string>
<string>mFileSystemColumn</string>
<string>mFreezeParts</string>
<string>mInjectFrozenParts</string>
<string>mOptions</string>
<string>mPartitionIDColumn</string>
<string>mPartitionImgColumn</string>
<string>mShutDownButton</string>
<string>mSleepButton</string>
<string>mStatusText</string>
<string>mSwapHD01</string>
<string>mSwapHD02</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>SFAuthorizationView</string>
<string>NSTableColumn</string>
<string>NSButton</string>
<string>NSButton</string>
<string>NSBox</string>
<string>NSTableColumn</string>
<string>NSTableColumn</string>
<string>NSButton</string>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSButton</string>
<string>NSButton</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">

Archive Download the corresponding diff file

Revision: 47