~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Mac/PythonLauncher/FileSettings.m

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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