symbian-qemu-0.9.1-12/python-2.6.1/Mac/PythonLauncher/FileSettings.m
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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