blob: fc3937b3dcbd7a7b33fdde6f425a9d654a38b078 [file] [log] [blame]
Jack Jansen3bbb6172002-07-29 21:36:35 +00001//
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
Jack Jansen2095c062002-11-25 13:11:06 +000012
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
Jack Jansen3bbb6172002-07-29 21:36:35 +000035+ (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) {
Jack Jansen2095c062002-11-25 13:11:06 +000052 *curdefault = [[FileSettings new] initForDefaultFileType: filetype];
Jack Jansen3bbb6172002-07-29 21:36:35 +000053 }
54 return *curdefault;
55}
56
57+ (id)newSettingsForFileType: (NSString *)filetype
58{
59 FileSettings *cur;
60
Jack Jansen2095c062002-11-25 13:11:06 +000061 cur = [FileSettings new];
62 [cur initForFileType: filetype];
63 return [cur retain];
Jack Jansen3bbb6172002-07-29 21:36:35 +000064}
65
66- (id)initWithFileSettings: (FileSettings *)source
67{
Jack Jansen2095c062002-11-25 13:11:06 +000068 self = [super init];
69 if (!self) return self;
70
Jack Jansen3bbb6172002-07-29 21:36:35 +000071 interpreter = [source->interpreter retain];
Jack Jansen3d3b7462003-02-17 15:40:00 +000072 honourhashbang = source->honourhashbang;
Jack Jansen3bbb6172002-07-29 21:36:35 +000073 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];
Jack Jansend7cccdd2003-06-20 22:21:03 +000080 scriptargs = [source->scriptargs retain];
Jack Jansen3bbb6172002-07-29 21:36:35 +000081 with_terminal = source->with_terminal;
Jack Jansen2095c062002-11-25 13:11:06 +000082 prefskey = source->prefskey;
83 if (prefskey) [prefskey retain];
Jack Jansen3bbb6172002-07-29 21:36:35 +000084
Jack Jansen3bbb6172002-07-29 21:36:35 +000085 return self;
86}
87
Jack Jansen2095c062002-11-25 13:11:06 +000088- (id)initForFileType: (NSString *)filetype
Jack Jansen3bbb6172002-07-29 21:36:35 +000089{
Jack Jansen2095c062002-11-25 13:11:06 +000090 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;
Jack Jansen2095c062002-11-25 13:11:06 +0000109 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;
Jack Jansenf044e092002-12-26 22:10:53 +0000167 interpreters = [fsdefaults->interpreters retain];
Jack Jansend7cccdd2003-06-20 22:21:03 +0000168 scriptargs = [@"" retain];
Jack Jansen2095c062002-11-25 13:11:06 +0000169 [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 }
Jack Jansen3bbb6172002-07-29 21:36:35 +0000183}
184
185- (void)updateFromSource: (id <FileSettingsSource>)source
186{
187 interpreter = [[source interpreter] retain];
Jack Jansen3d3b7462003-02-17 15:40:00 +0000188 honourhashbang = [source honourhashbang];
Jack Jansen3bbb6172002-07-29 21:36:35 +0000189 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];
Jack Jansend7cccdd2003-06-20 22:21:03 +0000196 scriptargs = [[source scriptargs] retain];
Jack Jansen3bbb6172002-07-29 21:36:35 +0000197 with_terminal = [source with_terminal];
Jack Jansen2095c062002-11-25 13:11:06 +0000198 // And if this is a user defaults object we also save the
199 // values
Jack Jansen3bbb6172002-07-29 21:36:35 +0000200 if (!origsource) {
201 NSUserDefaults *defaults;
202 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
203 interpreter, @"interpreter",
Jack Jansen3d3b7462003-02-17 15:40:00 +0000204 [NSNumber numberWithBool: honourhashbang], @"honourhashbang",
Jack Jansen3bbb6172002-07-29 21:36:35 +0000205 [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: nosite], @"nosite",
211 others, @"others",
Jack Jansend7cccdd2003-06-20 22:21:03 +0000212 scriptargs, @"scriptargs",
Jack Jansen3bbb6172002-07-29 21:36:35 +0000213 [NSNumber numberWithBool: with_terminal], @"with_terminal",
214 nil];
215 defaults = [NSUserDefaults standardUserDefaults];
216 [defaults setObject: dict forKey: prefskey];
217 }
218}
219
Jack Jansen2095c062002-11-25 13:11:06 +0000220- (void)applyValuesFromDict: (NSDictionary *)dict
Jack Jansen3bbb6172002-07-29 21:36:35 +0000221{
Jack Jansen3bbb6172002-07-29 21:36:35 +0000222 id value;
223
Jack Jansen3bbb6172002-07-29 21:36:35 +0000224 value = [dict objectForKey: @"interpreter"];
225 if (value) interpreter = [value retain];
Jack Jansen3d3b7462003-02-17 15:40:00 +0000226 value = [dict objectForKey: @"honourhashbang"];
227 if (value) honourhashbang = [value boolValue];
Jack Jansen3bbb6172002-07-29 21:36:35 +0000228 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: @"nosite"];
239 if (value) tabs = [value boolValue];
240 value = [dict objectForKey: @"others"];
241 if (value) others = [value retain];
Jack Jansend7cccdd2003-06-20 22:21:03 +0000242 value = [dict objectForKey: @"scriptargs"];
243 if (value) scriptargs = [value retain];
Jack Jansen3bbb6172002-07-29 21:36:35 +0000244 value = [dict objectForKey: @"with_terminal"];
245 if (value) with_terminal = [value boolValue];
246}
247
248- (NSString *)commandLineForScript: (NSString *)script
249{
Jack Jansen3d3b7462003-02-17 15:40:00 +0000250 NSString *cur_interp = NULL;
251 char hashbangbuf[1024];
252 FILE *fp;
253 char *p;
254
255 if (honourhashbang &&
256 (fp=fopen([script cString], "r")) &&
257 fgets(hashbangbuf, sizeof(hashbangbuf), fp) &&
258 strncmp(hashbangbuf, "#!", 2) == 0 &&
259 (p=strchr(hashbangbuf, '\n'))) {
260 *p = '\0';
261 p = hashbangbuf + 2;
262 while (*p == ' ') p++;
263 cur_interp = [NSString stringWithCString: p];
264 }
265 if (!cur_interp)
266 cur_interp = interpreter;
267
Jack Jansen3bbb6172002-07-29 21:36:35 +0000268 return [NSString stringWithFormat:
Jack Jansend7cccdd2003-06-20 22:21:03 +0000269 @"\"%@\"%s%s%s%s%s%s %@ \"%@\" %@ %s",
Jack Jansen3d3b7462003-02-17 15:40:00 +0000270 cur_interp,
Jack Jansen3bbb6172002-07-29 21:36:35 +0000271 debug?" -d":"",
272 verbose?" -v":"",
273 inspect?" -i":"",
274 optimize?" -O":"",
275 nosite?" -S":"",
276 tabs?" -t":"",
277 others,
278 script,
Jack Jansend7cccdd2003-06-20 22:21:03 +0000279 scriptargs,
Jack Jansenf044e092002-12-26 22:10:53 +0000280 with_terminal? "&& echo Exit status: $? && exit 1" : " &"];
Jack Jansen3bbb6172002-07-29 21:36:35 +0000281}
282
Jack Jansenf044e092002-12-26 22:10:53 +0000283- (NSArray *) interpreters { return interpreters;};
284
Jack Jansen3bbb6172002-07-29 21:36:35 +0000285// FileSettingsSource protocol
286- (NSString *) interpreter { return interpreter;};
Jack Jansen3d3b7462003-02-17 15:40:00 +0000287- (BOOL) honourhashbang { return honourhashbang; };
Jack Jansen3bbb6172002-07-29 21:36:35 +0000288- (BOOL) debug { return debug;};
289- (BOOL) verbose { return verbose;};
290- (BOOL) inspect { return inspect;};
291- (BOOL) optimize { return optimize;};
292- (BOOL) nosite { return nosite;};
293- (BOOL) tabs { return tabs;};
294- (NSString *) others { return others;};
Jack Jansend7cccdd2003-06-20 22:21:03 +0000295- (NSString *) scriptargs { return scriptargs;};
Jack Jansen3bbb6172002-07-29 21:36:35 +0000296- (BOOL) with_terminal { return with_terminal;};
297
298@end