PageRenderTime 241ms CodeModel.GetById 194ms app.highlight 43ms RepoModel.GetById 1ms app.codeStats 0ms

/Mac/PythonLauncher/FileSettings.m

http://unladen-swallow.googlecode.com/
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