| // | |
| // FileSettings.m | |
| // PythonLauncher | |
| // | |
| // Created by Jack Jansen on Sun Jul 21 2002. | |
| // Copyright (c) 2002 __MyCompanyName__. All rights reserved. | |
| // | |
| #import "FileSettings.h" | |
| @implementation FileSettings | |
| + (id)getFactorySettingsForFileType: (NSString *)filetype | |
| { | |
| static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc; | |
| FileSettings **curdefault; | |
| if ([filetype isEqualToString: @"Python Script"]) { | |
| curdefault = &fsdefault_py; | |
| } else if ([filetype isEqualToString: @"Python GUI Script"]) { | |
| curdefault = &fsdefault_pyw; | |
| } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { | |
| curdefault = &fsdefault_pyc; | |
| } else { | |
| NSLog(@"Funny File Type: %@\n", filetype); | |
| curdefault = &fsdefault_py; | |
| filetype = @"Python Script"; | |
| } | |
| if (!*curdefault) { | |
| *curdefault = [[FileSettings new] initForFSDefaultFileType: filetype]; | |
| } | |
| return *curdefault; | |
| } | |
| + (id)getDefaultsForFileType: (NSString *)filetype | |
| { | |
| static FileSettings *default_py, *default_pyw, *default_pyc; | |
| FileSettings **curdefault; | |
| if ([filetype isEqualToString: @"Python Script"]) { | |
| curdefault = &default_py; | |
| } else if ([filetype isEqualToString: @"Python GUI Script"]) { | |
| curdefault = &default_pyw; | |
| } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { | |
| curdefault = &default_pyc; | |
| } else { | |
| NSLog(@"Funny File Type: %@\n", filetype); | |
| curdefault = &default_py; | |
| filetype = @"Python Script"; | |
| } | |
| if (!*curdefault) { | |
| *curdefault = [[FileSettings new] initForDefaultFileType: filetype]; | |
| } | |
| return *curdefault; | |
| } | |
| + (id)newSettingsForFileType: (NSString *)filetype | |
| { | |
| FileSettings *cur; | |
| cur = [FileSettings new]; | |
| [cur initForFileType: filetype]; | |
| return [cur retain]; | |
| } | |
| - (id)initWithFileSettings: (FileSettings *)source | |
| { | |
| self = [super init]; | |
| if (!self) return self; | |
| interpreter = [source->interpreter retain]; | |
| honourhashbang = source->honourhashbang; | |
| debug = source->debug; | |
| verbose = source->verbose; | |
| inspect = source->inspect; | |
| optimize = source->optimize; | |
| nosite = source->nosite; | |
| tabs = source->tabs; | |
| others = [source->others retain]; | |
| scriptargs = [source->scriptargs retain]; | |
| with_terminal = source->with_terminal; | |
| prefskey = source->prefskey; | |
| if (prefskey) [prefskey retain]; | |
| return self; | |
| } | |
| - (id)initForFileType: (NSString *)filetype | |
| { | |
| FileSettings *defaults; | |
| defaults = [FileSettings getDefaultsForFileType: filetype]; | |
| self = [self initWithFileSettings: defaults]; | |
| origsource = [defaults retain]; | |
| return self; | |
| } | |
| - (id)initForFSDefaultFileType: (NSString *)filetype | |
| { | |
| int i; | |
| NSString *filename; | |
| NSDictionary *dict; | |
| static NSDictionary *factorySettings; | |
| self = [super init]; | |
| if (!self) return self; | |
| if (factorySettings == NULL) { | |
| NSBundle *bdl = [NSBundle mainBundle]; | |
| NSString *path = [ bdl pathForResource: @"factorySettings" | |
| ofType: @"plist"]; | |
| factorySettings = [[NSDictionary dictionaryWithContentsOfFile: | |
| path] retain]; | |
| if (factorySettings == NULL) { | |
| NSLog(@"Missing %@", path); | |
| return NULL; | |
| } | |
| } | |
| dict = [factorySettings objectForKey: filetype]; | |
| if (dict == NULL) { | |
| NSLog(@"factorySettings.plist misses file type \"%@\"", filetype); | |
| interpreter = [@"no default found" retain]; | |
| return NULL; | |
| } | |
| [self applyValuesFromDict: dict]; | |
| interpreters = [dict objectForKey: @"interpreter_list"]; | |
| interpreter = NULL; | |
| for (i=0; i < [interpreters count]; i++) { | |
| filename = [interpreters objectAtIndex: i]; | |
| filename = [filename stringByExpandingTildeInPath]; | |
| if ([[NSFileManager defaultManager] fileExistsAtPath: filename]) { | |
| interpreter = [filename retain]; | |
| break; | |
| } | |
| } | |
| if (interpreter == NULL) | |
| interpreter = [@"no default found" retain]; | |
| origsource = NULL; | |
| return self; | |
| } | |
| - (void)applyUserDefaults: (NSString *)filetype | |
| { | |
| NSUserDefaults *defaults; | |
| NSDictionary *dict; | |
| defaults = [NSUserDefaults standardUserDefaults]; | |
| dict = [defaults dictionaryForKey: filetype]; | |
| if (!dict) | |
| return; | |
| [self applyValuesFromDict: dict]; | |
| } | |
| - (id)initForDefaultFileType: (NSString *)filetype | |
| { | |
| FileSettings *fsdefaults; | |
| fsdefaults = [FileSettings getFactorySettingsForFileType: filetype]; | |
| self = [self initWithFileSettings: fsdefaults]; | |
| if (!self) return self; | |
| interpreters = [fsdefaults->interpreters retain]; | |
| scriptargs = [@"" retain]; | |
| [self applyUserDefaults: filetype]; | |
| prefskey = [filetype retain]; | |
| return self; | |
| } | |
| - (void)reset | |
| { | |
| if (origsource) { | |
| [self updateFromSource: origsource]; | |
| } else { | |
| FileSettings *fsdefaults; | |
| fsdefaults = [FileSettings getFactorySettingsForFileType: prefskey]; | |
| [self updateFromSource: fsdefaults]; | |
| } | |
| } | |
| - (void)updateFromSource: (id <FileSettingsSource>)source | |
| { | |
| interpreter = [[source interpreter] retain]; | |
| honourhashbang = [source honourhashbang]; | |
| debug = [source debug]; | |
| verbose = [source verbose]; | |
| inspect = [source inspect]; | |
| optimize = [source optimize]; | |
| nosite = [source nosite]; | |
| tabs = [source tabs]; | |
| others = [[source others] retain]; | |
| scriptargs = [[source scriptargs] retain]; | |
| with_terminal = [source with_terminal]; | |
| // And if this is a user defaults object we also save the | |
| // values | |
| if (!origsource) { | |
| NSUserDefaults *defaults; | |
| NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: | |
| interpreter, @"interpreter", | |
| [NSNumber numberWithBool: honourhashbang], @"honourhashbang", | |
| [NSNumber numberWithBool: debug], @"debug", | |
| [NSNumber numberWithBool: verbose], @"verbose", | |
| [NSNumber numberWithBool: inspect], @"inspect", | |
| [NSNumber numberWithBool: optimize], @"optimize", | |
| [NSNumber numberWithBool: nosite], @"nosite", | |
| [NSNumber numberWithBool: tabs], @"tabs", | |
| others, @"others", | |
| scriptargs, @"scriptargs", | |
| [NSNumber numberWithBool: with_terminal], @"with_terminal", | |
| nil]; | |
| defaults = [NSUserDefaults standardUserDefaults]; | |
| [defaults setObject: dict forKey: prefskey]; | |
| } | |
| } | |
| - (void)applyValuesFromDict: (NSDictionary *)dict | |
| { | |
| id value; | |
| value = [dict objectForKey: @"interpreter"]; | |
| if (value) interpreter = [value retain]; | |
| value = [dict objectForKey: @"honourhashbang"]; | |
| if (value) honourhashbang = [value boolValue]; | |
| value = [dict objectForKey: @"debug"]; | |
| if (value) debug = [value boolValue]; | |
| value = [dict objectForKey: @"verbose"]; | |
| if (value) verbose = [value boolValue]; | |
| value = [dict objectForKey: @"inspect"]; | |
| if (value) inspect = [value boolValue]; | |
| value = [dict objectForKey: @"optimize"]; | |
| if (value) optimize = [value boolValue]; | |
| value = [dict objectForKey: @"nosite"]; | |
| if (value) nosite = [value boolValue]; | |
| value = [dict objectForKey: @"tabs"]; | |
| if (value) tabs = [value boolValue]; | |
| value = [dict objectForKey: @"others"]; | |
| if (value) others = [value retain]; | |
| value = [dict objectForKey: @"scriptargs"]; | |
| if (value) scriptargs = [value retain]; | |
| value = [dict objectForKey: @"with_terminal"]; | |
| if (value) with_terminal = [value boolValue]; | |
| } | |
| - (NSString*)_replaceSingleQuotes: (NSString*)string | |
| { | |
| /* Replace all single-quotes by '"'"', that way shellquoting will | |
| * be correct when the result value is delimited using single quotes. | |
| */ | |
| NSArray* components = [string componentsSeparatedByString:@"'"]; | |
| return [components componentsJoinedByString:@"'\"'\"'"]; | |
| } | |
| - (NSString *)commandLineForScript: (NSString *)script | |
| { | |
| NSString *cur_interp = NULL; | |
| NSString* script_dir = NULL; | |
| char hashbangbuf[1024]; | |
| FILE *fp; | |
| char *p; | |
| script_dir = [script substringToIndex: | |
| [script length]-[[script lastPathComponent] length]]; | |
| if (honourhashbang && | |
| (fp=fopen([script fileSystemRepresentation], "r")) && | |
| fgets(hashbangbuf, sizeof(hashbangbuf), fp) && | |
| strncmp(hashbangbuf, "#!", 2) == 0 && | |
| (p=strchr(hashbangbuf, '\n'))) { | |
| *p = '\0'; | |
| p = hashbangbuf + 2; | |
| while (*p == ' ') p++; | |
| cur_interp = [NSString stringWithUTF8String: p]; | |
| } | |
| if (!cur_interp) | |
| cur_interp = interpreter; | |
| return [NSString stringWithFormat: | |
| @"cd '%@' && '%@'%s%s%s%s%s%s %@ '%@' %@ %s", | |
| [self _replaceSingleQuotes:script_dir], | |
| [self _replaceSingleQuotes:cur_interp], | |
| debug?" -d":"", | |
| verbose?" -v":"", | |
| inspect?" -i":"", | |
| optimize?" -O":"", | |
| nosite?" -S":"", | |
| tabs?" -t":"", | |
| others, | |
| [self _replaceSingleQuotes:script], | |
| scriptargs ? scriptargs : @"", | |
| with_terminal? "&& echo Exit status: $? && exit 1" : " &"]; | |
| } | |
| - (NSArray *) interpreters { return interpreters;}; | |
| // FileSettingsSource protocol | |
| - (NSString *) interpreter { return interpreter;}; | |
| - (BOOL) honourhashbang { return honourhashbang; }; | |
| - (BOOL) debug { return debug;}; | |
| - (BOOL) verbose { return verbose;}; | |
| - (BOOL) inspect { return inspect;}; | |
| - (BOOL) optimize { return optimize;}; | |
| - (BOOL) nosite { return nosite;}; | |
| - (BOOL) tabs { return tabs;}; | |
| - (NSString *) others { return others;}; | |
| - (NSString *) scriptargs { return scriptargs;}; | |
| - (BOOL) with_terminal { return with_terminal;}; | |
| @end |