Mercurial > cpython-lru_cache-weakref
comparison Mac/PythonLauncher/FileSettings.m @ 38644:1cb2ece4b9e1 legacy-trunk
Move Mac/OSX/PythonLauncher one level up
| author | Ronald Oussoren <ronaldoussoren@mac.com> |
|---|---|
| date | Wed, 07 Jun 2006 18:58:01 +0000 |
| parents | Mac/OSX/PythonLauncher/FileSettings.m@1aa9057c38b4 |
| children | 232d156beb82 |
comparison
equal
deleted
inserted
replaced
| 38643:2af5757de7b1 | 38644:1cb2ece4b9e1 |
|---|---|
| 1 // | |
| 2 // FileSettings.m | |
| 3 // PythonLauncher | |
| 4 // | |
| 5 // Created by Jack Jansen on Sun Jul 21 2002. | |
| 6 // Copyright (c) 2002 __MyCompanyName__. All rights reserved. | |
| 7 // | |
| 8 | |
| 9 #import "FileSettings.h" | |
| 10 | |
| 11 @implementation FileSettings | |
| 12 | |
| 13 + (id)getFactorySettingsForFileType: (NSString *)filetype | |
| 14 { | |
| 15 static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc; | |
| 16 FileSettings **curdefault; | |
| 17 | |
| 18 if ([filetype isEqualToString: @"Python Script"]) { | |
| 19 curdefault = &fsdefault_py; | |
| 20 } else if ([filetype isEqualToString: @"Python GUI Script"]) { | |
| 21 curdefault = &fsdefault_pyw; | |
| 22 } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { | |
| 23 curdefault = &fsdefault_pyc; | |
| 24 } else { | |
| 25 NSLog(@"Funny File Type: %@\n", filetype); | |
| 26 curdefault = &fsdefault_py; | |
| 27 filetype = @"Python Script"; | |
| 28 } | |
| 29 if (!*curdefault) { | |
| 30 *curdefault = [[FileSettings new] initForFSDefaultFileType: filetype]; | |
| 31 } | |
| 32 return *curdefault; | |
| 33 } | |
| 34 | |
| 35 + (id)getDefaultsForFileType: (NSString *)filetype | |
| 36 { | |
| 37 static FileSettings *default_py, *default_pyw, *default_pyc; | |
| 38 FileSettings **curdefault; | |
| 39 | |
| 40 if ([filetype isEqualToString: @"Python Script"]) { | |
| 41 curdefault = &default_py; | |
| 42 } else if ([filetype isEqualToString: @"Python GUI Script"]) { | |
| 43 curdefault = &default_pyw; | |
| 44 } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { | |
| 45 curdefault = &default_pyc; | |
| 46 } else { | |
| 47 NSLog(@"Funny File Type: %@\n", filetype); | |
| 48 curdefault = &default_py; | |
| 49 filetype = @"Python Script"; | |
| 50 } | |
| 51 if (!*curdefault) { | |
| 52 *curdefault = [[FileSettings new] initForDefaultFileType: filetype]; | |
| 53 } | |
| 54 return *curdefault; | |
| 55 } | |
| 56 | |
| 57 + (id)newSettingsForFileType: (NSString *)filetype | |
| 58 { | |
| 59 FileSettings *cur; | |
| 60 | |
| 61 cur = [FileSettings new]; | |
| 62 [cur initForFileType: filetype]; | |
| 63 return [cur retain]; | |
| 64 } | |
| 65 | |
| 66 - (id)initWithFileSettings: (FileSettings *)source | |
| 67 { | |
| 68 self = [super init]; | |
| 69 if (!self) return self; | |
| 70 | |
| 71 interpreter = [source->interpreter retain]; | |
| 72 honourhashbang = source->honourhashbang; | |
| 73 debug = source->debug; | |
| 74 verbose = source->verbose; | |
| 75 inspect = source->inspect; | |
| 76 optimize = source->optimize; | |
| 77 nosite = source->nosite; | |
| 78 tabs = source->tabs; | |
| 79 others = [source->others retain]; | |
| 80 scriptargs = [source->scriptargs retain]; | |
| 81 with_terminal = source->with_terminal; | |
| 82 prefskey = source->prefskey; | |
| 83 if (prefskey) [prefskey retain]; | |
| 84 | |
| 85 return self; | |
| 86 } | |
| 87 | |
| 88 - (id)initForFileType: (NSString *)filetype | |
| 89 { | |
| 90 FileSettings *defaults; | |
| 91 | |
| 92 defaults = [FileSettings getDefaultsForFileType: filetype]; | |
| 93 self = [self initWithFileSettings: defaults]; | |
| 94 origsource = [defaults retain]; | |
| 95 return self; | |
| 96 } | |
| 97 | |
| 98 //- (id)init | |
| 99 //{ | |
| 100 // self = [self initForFileType: @"Python Script"]; | |
| 101 // return self; | |
| 102 //} | |
| 103 | |
| 104 - (id)initForFSDefaultFileType: (NSString *)filetype | |
| 105 { | |
| 106 int i; | |
| 107 NSString *filename; | |
| 108 NSDictionary *dict; | |
| 109 static NSDictionary *factorySettings; | |
| 110 | |
| 111 self = [super init]; | |
| 112 if (!self) return self; | |
| 113 | |
| 114 if (factorySettings == NULL) { | |
| 115 NSBundle *bdl = [NSBundle mainBundle]; | |
| 116 NSString *path = [ bdl pathForResource: @"factorySettings" | |
| 117 ofType: @"plist"]; | |
| 118 factorySettings = [[NSDictionary dictionaryWithContentsOfFile: | |
| 119 path] retain]; | |
| 120 if (factorySettings == NULL) { | |
| 121 NSLog(@"Missing %@", path); | |
| 122 return NULL; | |
| 123 } | |
| 124 } | |
| 125 dict = [factorySettings objectForKey: filetype]; | |
| 126 if (dict == NULL) { | |
| 127 NSLog(@"factorySettings.plist misses file type \"%@\"", filetype); | |
| 128 interpreter = [@"no default found" retain]; | |
| 129 return NULL; | |
| 130 } | |
| 131 [self applyValuesFromDict: dict]; | |
| 132 interpreters = [dict objectForKey: @"interpreter_list"]; | |
| 133 interpreter = NULL; | |
| 134 for (i=0; i < [interpreters count]; i++) { | |
| 135 filename = [interpreters objectAtIndex: i]; | |
| 136 filename = [filename stringByExpandingTildeInPath]; | |
| 137 if ([[NSFileManager defaultManager] fileExistsAtPath: filename]) { | |
| 138 interpreter = [filename retain]; | |
| 139 break; | |
| 140 } | |
| 141 } | |
| 142 if (interpreter == NULL) | |
| 143 interpreter = [@"no default found" retain]; | |
| 144 origsource = NULL; | |
| 145 return self; | |
| 146 } | |
| 147 | |
| 148 - (void)applyUserDefaults: (NSString *)filetype | |
| 149 { | |
| 150 NSUserDefaults *defaults; | |
| 151 NSDictionary *dict; | |
| 152 | |
| 153 defaults = [NSUserDefaults standardUserDefaults]; | |
| 154 dict = [defaults dictionaryForKey: filetype]; | |
| 155 if (!dict) | |
| 156 return; | |
| 157 [self applyValuesFromDict: dict]; | |
| 158 } | |
| 159 | |
| 160 - (id)initForDefaultFileType: (NSString *)filetype | |
| 161 { | |
| 162 FileSettings *fsdefaults; | |
| 163 | |
| 164 fsdefaults = [FileSettings getFactorySettingsForFileType: filetype]; | |
| 165 self = [self initWithFileSettings: fsdefaults]; | |
| 166 if (!self) return self; | |
| 167 interpreters = [fsdefaults->interpreters retain]; | |
| 168 scriptargs = [@"" retain]; | |
| 169 [self applyUserDefaults: filetype]; | |
| 170 prefskey = [filetype retain]; | |
| 171 return self; | |
| 172 } | |
| 173 | |
| 174 - (void)reset | |
| 175 { | |
| 176 if (origsource) { | |
| 177 [self updateFromSource: origsource]; | |
| 178 } else { | |
| 179 FileSettings *fsdefaults; | |
| 180 fsdefaults = [FileSettings getFactorySettingsForFileType: prefskey]; | |
| 181 [self updateFromSource: fsdefaults]; | |
| 182 } | |
| 183 } | |
| 184 | |
| 185 - (void)updateFromSource: (id <FileSettingsSource>)source | |
| 186 { | |
| 187 interpreter = [[source interpreter] retain]; | |
| 188 honourhashbang = [source honourhashbang]; | |
| 189 debug = [source debug]; | |
| 190 verbose = [source verbose]; | |
| 191 inspect = [source inspect]; | |
| 192 optimize = [source optimize]; | |
| 193 nosite = [source nosite]; | |
| 194 tabs = [source tabs]; | |
| 195 others = [[source others] retain]; | |
| 196 scriptargs = [[source scriptargs] retain]; | |
| 197 with_terminal = [source with_terminal]; | |
| 198 // And if this is a user defaults object we also save the | |
| 199 // values | |
| 200 if (!origsource) { | |
| 201 NSUserDefaults *defaults; | |
| 202 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: | |
| 203 interpreter, @"interpreter", | |
| 204 [NSNumber numberWithBool: honourhashbang], @"honourhashbang", | |
| 205 [NSNumber numberWithBool: debug], @"debug", | |
| 206 [NSNumber numberWithBool: verbose], @"verbose", | |
| 207 [NSNumber numberWithBool: inspect], @"inspect", | |
| 208 [NSNumber numberWithBool: optimize], @"optimize", | |
| 209 [NSNumber numberWithBool: nosite], @"nosite", | |
| 210 [NSNumber numberWithBool: nosite], @"nosite", | |
| 211 others, @"others", | |
| 212 scriptargs, @"scriptargs", | |
| 213 [NSNumber numberWithBool: with_terminal], @"with_terminal", | |
| 214 nil]; | |
| 215 defaults = [NSUserDefaults standardUserDefaults]; | |
| 216 [defaults setObject: dict forKey: prefskey]; | |
| 217 } | |
| 218 } | |
| 219 | |
| 220 - (void)applyValuesFromDict: (NSDictionary *)dict | |
| 221 { | |
| 222 id value; | |
| 223 | |
| 224 value = [dict objectForKey: @"interpreter"]; | |
| 225 if (value) interpreter = [value retain]; | |
| 226 value = [dict objectForKey: @"honourhashbang"]; | |
| 227 if (value) honourhashbang = [value boolValue]; | |
| 228 value = [dict objectForKey: @"debug"]; | |
| 229 if (value) debug = [value boolValue]; | |
| 230 value = [dict objectForKey: @"verbose"]; | |
| 231 if (value) verbose = [value boolValue]; | |
| 232 value = [dict objectForKey: @"inspect"]; | |
| 233 if (value) inspect = [value boolValue]; | |
| 234 value = [dict objectForKey: @"optimize"]; | |
| 235 if (value) optimize = [value boolValue]; | |
| 236 value = [dict objectForKey: @"nosite"]; | |
| 237 if (value) nosite = [value boolValue]; | |
| 238 value = [dict objectForKey: @"nosite"]; | |
| 239 if (value) tabs = [value boolValue]; | |
| 240 value = [dict objectForKey: @"others"]; | |
| 241 if (value) others = [value retain]; | |
| 242 value = [dict objectForKey: @"scriptargs"]; | |
| 243 if (value) scriptargs = [value retain]; | |
| 244 value = [dict objectForKey: @"with_terminal"]; | |
| 245 if (value) with_terminal = [value boolValue]; | |
| 246 } | |
| 247 | |
| 248 - (NSString *)commandLineForScript: (NSString *)script | |
| 249 { | |
| 250 NSString *cur_interp = NULL; | |
| 251 char hashbangbuf[1024]; | |
| 252 FILE *fp; | |
| 253 char *p; | |
| 254 | |
| 255 if (honourhashbang && | |
| 256 (fp=fopen([script cString], "r")) && | |
| 257 fgets(hashbangbuf, sizeof(hashbangbuf), fp) && | |
| 258 strncmp(hashbangbuf, "#!", 2) == 0 && | |
| 259 (p=strchr(hashbangbuf, '\n'))) { | |
| 260 *p = '\0'; | |
| 261 p = hashbangbuf + 2; | |
| 262 while (*p == ' ') p++; | |
| 263 cur_interp = [NSString stringWithCString: p]; | |
| 264 } | |
| 265 if (!cur_interp) | |
| 266 cur_interp = interpreter; | |
| 267 | |
| 268 return [NSString stringWithFormat: | |
| 269 @"\"%@\"%s%s%s%s%s%s %@ \"%@\" %@ %s", | |
| 270 cur_interp, | |
| 271 debug?" -d":"", | |
| 272 verbose?" -v":"", | |
| 273 inspect?" -i":"", | |
| 274 optimize?" -O":"", | |
| 275 nosite?" -S":"", | |
| 276 tabs?" -t":"", | |
| 277 others, | |
| 278 script, | |
| 279 scriptargs, | |
| 280 with_terminal? "&& echo Exit status: $? && exit 1" : " &"]; | |
| 281 } | |
| 282 | |
| 283 - (NSArray *) interpreters { return interpreters;}; | |
| 284 | |
| 285 // FileSettingsSource protocol | |
| 286 - (NSString *) interpreter { return interpreter;}; | |
| 287 - (BOOL) honourhashbang { return honourhashbang; }; | |
| 288 - (BOOL) debug { return debug;}; | |
| 289 - (BOOL) verbose { return verbose;}; | |
| 290 - (BOOL) inspect { return inspect;}; | |
| 291 - (BOOL) optimize { return optimize;}; | |
| 292 - (BOOL) nosite { return nosite;}; | |
| 293 - (BOOL) tabs { return tabs;}; | |
| 294 - (NSString *) others { return others;}; | |
| 295 - (NSString *) scriptargs { return scriptargs;}; | |
| 296 - (BOOL) with_terminal { return with_terminal;}; | |
| 297 | |
| 298 @end |
