/Mac/PythonLauncher/FileSettings.m
Objective C | 313 lines | 261 code | 34 blank | 18 comment | 48 complexity | 8d218759c93dcdbf27e04178b0807d32 MD5 | raw file
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: tabs], @"tabs", 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: @"tabs"]; 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*)_replaceSingleQuotes: (NSString*)string 249{ 250 /* Replace all single-quotes by '"'"', that way shellquoting will 251 * be correct when the result value is delimited using single quotes. 252 */ 253 NSArray* components = [string componentsSeparatedByString:@"'"]; 254 255 return [components componentsJoinedByString:@"'\"'\"'"]; 256} 257 258- (NSString *)commandLineForScript: (NSString *)script 259{ 260 NSString *cur_interp = NULL; 261 NSString* script_dir = NULL; 262 char hashbangbuf[1024]; 263 FILE *fp; 264 char *p; 265 266 script_dir = [script substringToIndex: 267 [script length]-[[script lastPathComponent] length]]; 268 269 if (honourhashbang && 270 (fp=fopen([script cString], "r")) && 271 fgets(hashbangbuf, sizeof(hashbangbuf), fp) && 272 strncmp(hashbangbuf, "#!", 2) == 0 && 273 (p=strchr(hashbangbuf, '\n'))) { 274 *p = '\0'; 275 p = hashbangbuf + 2; 276 while (*p == ' ') p++; 277 cur_interp = [NSString stringWithCString: p]; 278 } 279 if (!cur_interp) 280 cur_interp = interpreter; 281 282 return [NSString stringWithFormat: 283 @"cd '%@' && '%@'%s%s%s%s%s%s %@ '%@' %@ %s", 284 [self _replaceSingleQuotes:script_dir], 285 [self _replaceSingleQuotes:cur_interp], 286 debug?" -d":"", 287 verbose?" -v":"", 288 inspect?" -i":"", 289 optimize?" -O":"", 290 nosite?" -S":"", 291 tabs?" -t":"", 292 others, 293 [self _replaceSingleQuotes:script], 294 scriptargs ? scriptargs : @"", 295 with_terminal? "&& echo Exit status: $? && exit 1" : " &"]; 296} 297 298- (NSArray *) interpreters { return interpreters;}; 299 300// FileSettingsSource protocol 301- (NSString *) interpreter { return interpreter;}; 302- (BOOL) honourhashbang { return honourhashbang; }; 303- (BOOL) debug { return debug;}; 304- (BOOL) verbose { return verbose;}; 305- (BOOL) inspect { return inspect;}; 306- (BOOL) optimize { return optimize;}; 307- (BOOL) nosite { return nosite;}; 308- (BOOL) tabs { return tabs;}; 309- (NSString *) others { return others;}; 310- (NSString *) scriptargs { return scriptargs;}; 311- (BOOL) with_terminal { return with_terminal;}; 312 313@end