17db96d56Sopenharmony_ci// 27db96d56Sopenharmony_ci// FileSettings.m 37db96d56Sopenharmony_ci// PythonLauncher 47db96d56Sopenharmony_ci// 57db96d56Sopenharmony_ci// Created by Jack Jansen on Sun Jul 21 2002. 67db96d56Sopenharmony_ci// Copyright (c) 2002 __MyCompanyName__. All rights reserved. 77db96d56Sopenharmony_ci// 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci#import "FileSettings.h" 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci@implementation FileSettings 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci+ (id)getFactorySettingsForFileType: (NSString *)filetype 147db96d56Sopenharmony_ci{ 157db96d56Sopenharmony_ci static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc; 167db96d56Sopenharmony_ci FileSettings **curdefault; 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci if ([filetype isEqualToString: @"Python Script"]) { 197db96d56Sopenharmony_ci curdefault = &fsdefault_py; 207db96d56Sopenharmony_ci } else if ([filetype isEqualToString: @"Python GUI Script"]) { 217db96d56Sopenharmony_ci curdefault = &fsdefault_pyw; 227db96d56Sopenharmony_ci } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { 237db96d56Sopenharmony_ci curdefault = &fsdefault_pyc; 247db96d56Sopenharmony_ci } else { 257db96d56Sopenharmony_ci NSLog(@"Funny File Type: %@\n", filetype); 267db96d56Sopenharmony_ci curdefault = &fsdefault_py; 277db96d56Sopenharmony_ci filetype = @"Python Script"; 287db96d56Sopenharmony_ci } 297db96d56Sopenharmony_ci if (!*curdefault) { 307db96d56Sopenharmony_ci *curdefault = [[FileSettings new] initForFSDefaultFileType: filetype]; 317db96d56Sopenharmony_ci } 327db96d56Sopenharmony_ci return *curdefault; 337db96d56Sopenharmony_ci} 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci+ (id)getDefaultsForFileType: (NSString *)filetype 367db96d56Sopenharmony_ci{ 377db96d56Sopenharmony_ci static FileSettings *default_py, *default_pyw, *default_pyc; 387db96d56Sopenharmony_ci FileSettings **curdefault; 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci if ([filetype isEqualToString: @"Python Script"]) { 417db96d56Sopenharmony_ci curdefault = &default_py; 427db96d56Sopenharmony_ci } else if ([filetype isEqualToString: @"Python GUI Script"]) { 437db96d56Sopenharmony_ci curdefault = &default_pyw; 447db96d56Sopenharmony_ci } else if ([filetype isEqualToString: @"Python Bytecode Document"]) { 457db96d56Sopenharmony_ci curdefault = &default_pyc; 467db96d56Sopenharmony_ci } else { 477db96d56Sopenharmony_ci NSLog(@"Funny File Type: %@\n", filetype); 487db96d56Sopenharmony_ci curdefault = &default_py; 497db96d56Sopenharmony_ci filetype = @"Python Script"; 507db96d56Sopenharmony_ci } 517db96d56Sopenharmony_ci if (!*curdefault) { 527db96d56Sopenharmony_ci *curdefault = [[FileSettings new] initForDefaultFileType: filetype]; 537db96d56Sopenharmony_ci } 547db96d56Sopenharmony_ci return *curdefault; 557db96d56Sopenharmony_ci} 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci+ (id)newSettingsForFileType: (NSString *)filetype 587db96d56Sopenharmony_ci{ 597db96d56Sopenharmony_ci FileSettings *cur; 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci cur = [FileSettings new]; 627db96d56Sopenharmony_ci [cur initForFileType: filetype]; 637db96d56Sopenharmony_ci return [cur retain]; 647db96d56Sopenharmony_ci} 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci- (id)initWithFileSettings: (FileSettings *)source 677db96d56Sopenharmony_ci{ 687db96d56Sopenharmony_ci self = [super init]; 697db96d56Sopenharmony_ci if (!self) return self; 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci interpreter = [source->interpreter retain]; 727db96d56Sopenharmony_ci honourhashbang = source->honourhashbang; 737db96d56Sopenharmony_ci debug = source->debug; 747db96d56Sopenharmony_ci verbose = source->verbose; 757db96d56Sopenharmony_ci inspect = source->inspect; 767db96d56Sopenharmony_ci optimize = source->optimize; 777db96d56Sopenharmony_ci nosite = source->nosite; 787db96d56Sopenharmony_ci tabs = source->tabs; 797db96d56Sopenharmony_ci others = [source->others retain]; 807db96d56Sopenharmony_ci scriptargs = [source->scriptargs retain]; 817db96d56Sopenharmony_ci with_terminal = source->with_terminal; 827db96d56Sopenharmony_ci prefskey = source->prefskey; 837db96d56Sopenharmony_ci if (prefskey) [prefskey retain]; 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci return self; 867db96d56Sopenharmony_ci} 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci- (id)initForFileType: (NSString *)filetype 897db96d56Sopenharmony_ci{ 907db96d56Sopenharmony_ci FileSettings *defaults; 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci defaults = [FileSettings getDefaultsForFileType: filetype]; 937db96d56Sopenharmony_ci self = [self initWithFileSettings: defaults]; 947db96d56Sopenharmony_ci origsource = [defaults retain]; 957db96d56Sopenharmony_ci return self; 967db96d56Sopenharmony_ci} 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci- (id)initForFSDefaultFileType: (NSString *)filetype 997db96d56Sopenharmony_ci{ 1007db96d56Sopenharmony_ci int i; 1017db96d56Sopenharmony_ci NSString *filename; 1027db96d56Sopenharmony_ci NSDictionary *dict; 1037db96d56Sopenharmony_ci static NSDictionary *factorySettings; 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci self = [super init]; 1067db96d56Sopenharmony_ci if (!self) return self; 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci if (factorySettings == NULL) { 1097db96d56Sopenharmony_ci NSBundle *bdl = [NSBundle mainBundle]; 1107db96d56Sopenharmony_ci NSString *path = [ bdl pathForResource: @"factorySettings" 1117db96d56Sopenharmony_ci ofType: @"plist"]; 1127db96d56Sopenharmony_ci factorySettings = [[NSDictionary dictionaryWithContentsOfFile: 1137db96d56Sopenharmony_ci path] retain]; 1147db96d56Sopenharmony_ci if (factorySettings == NULL) { 1157db96d56Sopenharmony_ci NSLog(@"Missing %@", path); 1167db96d56Sopenharmony_ci return NULL; 1177db96d56Sopenharmony_ci } 1187db96d56Sopenharmony_ci } 1197db96d56Sopenharmony_ci dict = [factorySettings objectForKey: filetype]; 1207db96d56Sopenharmony_ci if (dict == NULL) { 1217db96d56Sopenharmony_ci NSLog(@"factorySettings.plist misses file type \"%@\"", filetype); 1227db96d56Sopenharmony_ci interpreter = [@"no default found" retain]; 1237db96d56Sopenharmony_ci return NULL; 1247db96d56Sopenharmony_ci } 1257db96d56Sopenharmony_ci [self applyValuesFromDict: dict]; 1267db96d56Sopenharmony_ci interpreters = [dict objectForKey: @"interpreter_list"]; 1277db96d56Sopenharmony_ci interpreter = NULL; 1287db96d56Sopenharmony_ci for (i=0; i < [interpreters count]; i++) { 1297db96d56Sopenharmony_ci filename = [interpreters objectAtIndex: i]; 1307db96d56Sopenharmony_ci filename = [filename stringByExpandingTildeInPath]; 1317db96d56Sopenharmony_ci if ([[NSFileManager defaultManager] fileExistsAtPath: filename]) { 1327db96d56Sopenharmony_ci interpreter = [filename retain]; 1337db96d56Sopenharmony_ci break; 1347db96d56Sopenharmony_ci } 1357db96d56Sopenharmony_ci } 1367db96d56Sopenharmony_ci if (interpreter == NULL) 1377db96d56Sopenharmony_ci interpreter = [@"no default found" retain]; 1387db96d56Sopenharmony_ci origsource = NULL; 1397db96d56Sopenharmony_ci return self; 1407db96d56Sopenharmony_ci} 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci- (void)applyUserDefaults: (NSString *)filetype 1437db96d56Sopenharmony_ci{ 1447db96d56Sopenharmony_ci NSUserDefaults *defaults; 1457db96d56Sopenharmony_ci NSDictionary *dict; 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci defaults = [NSUserDefaults standardUserDefaults]; 1487db96d56Sopenharmony_ci dict = [defaults dictionaryForKey: filetype]; 1497db96d56Sopenharmony_ci if (!dict) 1507db96d56Sopenharmony_ci return; 1517db96d56Sopenharmony_ci [self applyValuesFromDict: dict]; 1527db96d56Sopenharmony_ci} 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci- (id)initForDefaultFileType: (NSString *)filetype 1557db96d56Sopenharmony_ci{ 1567db96d56Sopenharmony_ci FileSettings *fsdefaults; 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci fsdefaults = [FileSettings getFactorySettingsForFileType: filetype]; 1597db96d56Sopenharmony_ci self = [self initWithFileSettings: fsdefaults]; 1607db96d56Sopenharmony_ci if (!self) return self; 1617db96d56Sopenharmony_ci interpreters = [fsdefaults->interpreters retain]; 1627db96d56Sopenharmony_ci scriptargs = [@"" retain]; 1637db96d56Sopenharmony_ci [self applyUserDefaults: filetype]; 1647db96d56Sopenharmony_ci prefskey = [filetype retain]; 1657db96d56Sopenharmony_ci return self; 1667db96d56Sopenharmony_ci} 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci- (void)reset 1697db96d56Sopenharmony_ci{ 1707db96d56Sopenharmony_ci if (origsource) { 1717db96d56Sopenharmony_ci [self updateFromSource: origsource]; 1727db96d56Sopenharmony_ci } else { 1737db96d56Sopenharmony_ci FileSettings *fsdefaults; 1747db96d56Sopenharmony_ci fsdefaults = [FileSettings getFactorySettingsForFileType: prefskey]; 1757db96d56Sopenharmony_ci [self updateFromSource: fsdefaults]; 1767db96d56Sopenharmony_ci } 1777db96d56Sopenharmony_ci} 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci- (void)updateFromSource: (id <FileSettingsSource>)source 1807db96d56Sopenharmony_ci{ 1817db96d56Sopenharmony_ci interpreter = [[source interpreter] retain]; 1827db96d56Sopenharmony_ci honourhashbang = [source honourhashbang]; 1837db96d56Sopenharmony_ci debug = [source debug]; 1847db96d56Sopenharmony_ci verbose = [source verbose]; 1857db96d56Sopenharmony_ci inspect = [source inspect]; 1867db96d56Sopenharmony_ci optimize = [source optimize]; 1877db96d56Sopenharmony_ci nosite = [source nosite]; 1887db96d56Sopenharmony_ci tabs = [source tabs]; 1897db96d56Sopenharmony_ci others = [[source others] retain]; 1907db96d56Sopenharmony_ci scriptargs = [[source scriptargs] retain]; 1917db96d56Sopenharmony_ci with_terminal = [source with_terminal]; 1927db96d56Sopenharmony_ci // And if this is a user defaults object we also save the 1937db96d56Sopenharmony_ci // values 1947db96d56Sopenharmony_ci if (!origsource) { 1957db96d56Sopenharmony_ci NSUserDefaults *defaults; 1967db96d56Sopenharmony_ci NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 1977db96d56Sopenharmony_ci interpreter, @"interpreter", 1987db96d56Sopenharmony_ci [NSNumber numberWithBool: honourhashbang], @"honourhashbang", 1997db96d56Sopenharmony_ci [NSNumber numberWithBool: debug], @"debug", 2007db96d56Sopenharmony_ci [NSNumber numberWithBool: verbose], @"verbose", 2017db96d56Sopenharmony_ci [NSNumber numberWithBool: inspect], @"inspect", 2027db96d56Sopenharmony_ci [NSNumber numberWithBool: optimize], @"optimize", 2037db96d56Sopenharmony_ci [NSNumber numberWithBool: nosite], @"nosite", 2047db96d56Sopenharmony_ci [NSNumber numberWithBool: tabs], @"tabs", 2057db96d56Sopenharmony_ci others, @"others", 2067db96d56Sopenharmony_ci scriptargs, @"scriptargs", 2077db96d56Sopenharmony_ci [NSNumber numberWithBool: with_terminal], @"with_terminal", 2087db96d56Sopenharmony_ci nil]; 2097db96d56Sopenharmony_ci defaults = [NSUserDefaults standardUserDefaults]; 2107db96d56Sopenharmony_ci [defaults setObject: dict forKey: prefskey]; 2117db96d56Sopenharmony_ci } 2127db96d56Sopenharmony_ci} 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci- (void)applyValuesFromDict: (NSDictionary *)dict 2157db96d56Sopenharmony_ci{ 2167db96d56Sopenharmony_ci id value; 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci value = [dict objectForKey: @"interpreter"]; 2197db96d56Sopenharmony_ci if (value) interpreter = [value retain]; 2207db96d56Sopenharmony_ci value = [dict objectForKey: @"honourhashbang"]; 2217db96d56Sopenharmony_ci if (value) honourhashbang = [value boolValue]; 2227db96d56Sopenharmony_ci value = [dict objectForKey: @"debug"]; 2237db96d56Sopenharmony_ci if (value) debug = [value boolValue]; 2247db96d56Sopenharmony_ci value = [dict objectForKey: @"verbose"]; 2257db96d56Sopenharmony_ci if (value) verbose = [value boolValue]; 2267db96d56Sopenharmony_ci value = [dict objectForKey: @"inspect"]; 2277db96d56Sopenharmony_ci if (value) inspect = [value boolValue]; 2287db96d56Sopenharmony_ci value = [dict objectForKey: @"optimize"]; 2297db96d56Sopenharmony_ci if (value) optimize = [value boolValue]; 2307db96d56Sopenharmony_ci value = [dict objectForKey: @"nosite"]; 2317db96d56Sopenharmony_ci if (value) nosite = [value boolValue]; 2327db96d56Sopenharmony_ci value = [dict objectForKey: @"tabs"]; 2337db96d56Sopenharmony_ci if (value) tabs = [value boolValue]; 2347db96d56Sopenharmony_ci value = [dict objectForKey: @"others"]; 2357db96d56Sopenharmony_ci if (value) others = [value retain]; 2367db96d56Sopenharmony_ci value = [dict objectForKey: @"scriptargs"]; 2377db96d56Sopenharmony_ci if (value) scriptargs = [value retain]; 2387db96d56Sopenharmony_ci value = [dict objectForKey: @"with_terminal"]; 2397db96d56Sopenharmony_ci if (value) with_terminal = [value boolValue]; 2407db96d56Sopenharmony_ci} 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci- (NSString*)_replaceSingleQuotes: (NSString*)string 2437db96d56Sopenharmony_ci{ 2447db96d56Sopenharmony_ci /* Replace all single-quotes by '"'"', that way shellquoting will 2457db96d56Sopenharmony_ci * be correct when the result value is delimited using single quotes. 2467db96d56Sopenharmony_ci */ 2477db96d56Sopenharmony_ci NSArray* components = [string componentsSeparatedByString:@"'"]; 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci return [components componentsJoinedByString:@"'\"'\"'"]; 2507db96d56Sopenharmony_ci} 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci- (NSString *)commandLineForScript: (NSString *)script 2537db96d56Sopenharmony_ci{ 2547db96d56Sopenharmony_ci NSString *cur_interp = NULL; 2557db96d56Sopenharmony_ci NSString* script_dir = NULL; 2567db96d56Sopenharmony_ci char hashbangbuf[1024]; 2577db96d56Sopenharmony_ci FILE *fp; 2587db96d56Sopenharmony_ci char *p; 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci script_dir = [script substringToIndex: 2617db96d56Sopenharmony_ci [script length]-[[script lastPathComponent] length]]; 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci if (honourhashbang && 2647db96d56Sopenharmony_ci (fp=fopen([script fileSystemRepresentation], "r")) && 2657db96d56Sopenharmony_ci fgets(hashbangbuf, sizeof(hashbangbuf), fp) && 2667db96d56Sopenharmony_ci strncmp(hashbangbuf, "#!", 2) == 0 && 2677db96d56Sopenharmony_ci (p=strchr(hashbangbuf, '\n'))) { 2687db96d56Sopenharmony_ci *p = '\0'; 2697db96d56Sopenharmony_ci p = hashbangbuf + 2; 2707db96d56Sopenharmony_ci while (*p == ' ') p++; 2717db96d56Sopenharmony_ci cur_interp = [NSString stringWithUTF8String: p]; 2727db96d56Sopenharmony_ci } 2737db96d56Sopenharmony_ci if (!cur_interp) 2747db96d56Sopenharmony_ci cur_interp = interpreter; 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ci return [NSString stringWithFormat: 2777db96d56Sopenharmony_ci @"cd '%@' && '%@'%s%s%s%s%s%s %@ '%@' %@ %s", 2787db96d56Sopenharmony_ci [self _replaceSingleQuotes:script_dir], 2797db96d56Sopenharmony_ci [self _replaceSingleQuotes:cur_interp], 2807db96d56Sopenharmony_ci debug?" -d":"", 2817db96d56Sopenharmony_ci verbose?" -v":"", 2827db96d56Sopenharmony_ci inspect?" -i":"", 2837db96d56Sopenharmony_ci optimize?" -O":"", 2847db96d56Sopenharmony_ci nosite?" -S":"", 2857db96d56Sopenharmony_ci tabs?" -t":"", 2867db96d56Sopenharmony_ci others, 2877db96d56Sopenharmony_ci [self _replaceSingleQuotes:script], 2887db96d56Sopenharmony_ci scriptargs ? scriptargs : @"", 2897db96d56Sopenharmony_ci with_terminal? "&& echo Exit status: $? && exit 1" : " &"]; 2907db96d56Sopenharmony_ci} 2917db96d56Sopenharmony_ci 2927db96d56Sopenharmony_ci- (NSArray *) interpreters { return interpreters;}; 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci// FileSettingsSource protocol 2957db96d56Sopenharmony_ci- (NSString *) interpreter { return interpreter;}; 2967db96d56Sopenharmony_ci- (BOOL) honourhashbang { return honourhashbang; }; 2977db96d56Sopenharmony_ci- (BOOL) debug { return debug;}; 2987db96d56Sopenharmony_ci- (BOOL) verbose { return verbose;}; 2997db96d56Sopenharmony_ci- (BOOL) inspect { return inspect;}; 3007db96d56Sopenharmony_ci- (BOOL) optimize { return optimize;}; 3017db96d56Sopenharmony_ci- (BOOL) nosite { return nosite;}; 3027db96d56Sopenharmony_ci- (BOOL) tabs { return tabs;}; 3037db96d56Sopenharmony_ci- (NSString *) others { return others;}; 3047db96d56Sopenharmony_ci- (NSString *) scriptargs { return scriptargs;}; 3057db96d56Sopenharmony_ci- (BOOL) with_terminal { return with_terminal;}; 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci@end 308