diff options
Diffstat (limited to 'misc/osxfe/ioquake3fe/Controller.m')
-rw-r--r-- | misc/osxfe/ioquake3fe/Controller.m | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/misc/osxfe/ioquake3fe/Controller.m b/misc/osxfe/ioquake3fe/Controller.m new file mode 100644 index 0000000..2d2bf45 --- /dev/null +++ b/misc/osxfe/ioquake3fe/Controller.m @@ -0,0 +1,97 @@ +// +// Controller.m +// ioquake3fe +// +// Created by Ben Wilber on 3/11/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "Controller.h" +#import "ErrorWindow.h" + +#define IOQ3_BUNDLE @"/Applications/ioquake3/ioquake3.app" +#define IOQ3_BIN @"ioquake3.ub" + +@implementation Controller + +- (id)init { + [super init]; + quakeData = [[NSMutableData alloc] initWithCapacity:1.0]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readPipe:) name:NSFileHandleReadCompletionNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskNote:) name:NSTaskDidTerminateNotification object:nil]; + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (IBAction)launch:(id)sender { + NSString *ioQuake3Path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:IOQ3_BIN]; + if (!ioQuake3Path) + ioQuake3Path = [[NSBundle bundleWithPath:IOQ3_BUNDLE] pathForAuxiliaryExecutable:IOQ3_BIN]; + + NSPipe *pipe = [NSPipe pipe]; + quakeOut = [pipe fileHandleForReading]; + [quakeOut readInBackgroundAndNotify]; + + quakeTask = [NSTask new]; + [quakeTask setStandardOutput:pipe]; + [quakeTask setStandardError:pipe]; + + NSString *args = [argsTextField stringValue]; + if ([args length]) + [quakeTask setArguments:[args componentsSeparatedByString:@" "]]; +// [quakeTask setArguments:[args componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]]; // tiger + + BOOL die = NO; + + @try { + [quakeTask setLaunchPath:ioQuake3Path]; + [quakeTask launch]; + } + @catch (NSException *e) { + [[NSAlert + alertWithMessageText:NSLocalizedString(@"Launch Failed", @"launch failed") + defaultButton:NSLocalizedString(@"OK", @"OK") + alternateButton:nil + otherButton:nil +// informativeTextWithFormat:NSLocalizedString(@"Something is probably wrong with the actual ioquake3 binary.", @"launch failed text")] +// informativeTextWithFormat:NSLocalizedString([@"Unable to find the Quake binary at:\n" stringByAppendingString:ioQuake3Path], @"launch failed text")] + informativeTextWithFormat:NSLocalizedString([[[e reason] stringByAppendingString:@"\n\nExecutable path was:\n"] stringByAppendingString:ioQuake3Path], @"launch failed text")] + runModal]; + die = YES; + } + @finally { + if (die) + [NSApp terminate:self]; + } + + [[sender window] close]; + return; +} + +- (void)readPipe:(NSNotification *)note { + if ([note object] == quakeOut) { + NSData *outputData = [[note userInfo] objectForKey:NSFileHandleNotificationDataItem]; + if ([outputData length]) + [quakeData appendData:outputData]; + if (quakeTask) + [quakeOut readInBackgroundAndNotify]; + } +} + +- (void)taskNote:(NSNotification *)note { + if ([note object] == quakeTask) { + if ([quakeTask isRunning] == NO) { + if ([quakeTask terminationStatus] != 0) { + ErrorWindow *ew = [[[ErrorWindow alloc] init] autorelease]; + [ew bitch:[[[NSString alloc] initWithData:quakeData encoding:NSUTF8StringEncoding] autorelease]]; + } + else + [NSApp terminate:self]; + } + } +} +@end |