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