X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=AppController.m;h=acd33b8639403a3ad4441792114865613c969ae5;hb=fcdfb47212ad3d7f8ec8ae115ccf4f30b7ace383;hp=c8750c03b8ceec35d47e654dc9f716b8d61ef1f1;hpb=42cf7bbe564d70233a0d73baee613f209eb00eb6;p=chaz%2Fthecheat diff --git a/AppController.m b/AppController.m index c8750c0..acd33b8 100644 --- a/AppController.m +++ b/AppController.m @@ -21,6 +21,8 @@ #import "ServerHolder.h" +#import + @implementation AppController @@ -36,16 +38,20 @@ [defaults setObject:[NSNumber numberWithBool:TCGlobalPlaySounds] forKey:TCPlaySoundsPref]; [defaults setObject:[NSNumber numberWithBool:TCGlobalWindowsOnTop] forKey:TCWindowsOnTopPref]; + [defaults setObject:[NSNumber numberWithBool:TCGlobalUpdateCheck] forKey:TCUpdateCheckPref]; [defaults setObject:[NSNumber numberWithBool:TCGlobalAllowRemote] forKey:TCAllowRemotePref]; [defaults setObject:[NSNumber numberWithInt:TCGlobalListenPort] forKey:TCListenPortPref]; [defaults setObject:[NSString stringWithFormat:@"%@'s Computer", NSFullUserName()] forKey:TCBroadcastNamePref]; + [defaults setObject:[NSNumber numberWithInt:TCGlobalHitsDisplayed] forKey:TCHitsDisplayedPref]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; - TCGlobalPlaySounds = [[NSUserDefaults standardUserDefaults] integerForKey:TCPlaySoundsPref]; - TCGlobalWindowsOnTop = [[NSUserDefaults standardUserDefaults] integerForKey:TCWindowsOnTopPref]; - TCGlobalListenPort = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref]; + TCGlobalPlaySounds = [[NSUserDefaults standardUserDefaults] boolForKey:TCPlaySoundsPref]; + TCGlobalWindowsOnTop = [[NSUserDefaults standardUserDefaults] boolForKey:TCWindowsOnTopPref]; + TCGlobalUpdateCheck = [[NSUserDefaults standardUserDefaults] boolForKey:TCUpdateCheckPref]; TCGlobalAllowRemote = [[NSUserDefaults standardUserDefaults] boolForKey:TCAllowRemotePref]; + TCGlobalListenPort = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref]; + TCGlobalHitsDisplayed = [[NSUserDefaults standardUserDefaults] integerForKey:TCHitsDisplayedPref]; } - (id)init @@ -53,17 +59,34 @@ if ( self = [super init] ) { servers = [[NSMutableArray alloc] init]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willQuit:) name:@"NSApplicationWillTerminateNotification" object:nil]; + // start the server with saved settings [self listenOnPort:TCGlobalListenPort remote:TCGlobalAllowRemote]; - [self broadcastWithName:TCGlobalBroadcastName]; + if ( TCGlobalAllowRemote ) [self broadcastWithName:TCGlobalBroadcastName]; + + // set up the network browser + browser = [[NSNetServiceBrowser alloc] init]; + [browser setDelegate:self]; + [browser searchForServicesOfType:@"_cheat._tcp." inDomain:@"local."]; + + serverList = [[NSMutableArray alloc] init]; + + [self setDelegate:self]; } return self; } +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + if ( TCGlobalUpdateCheck ) + { + [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist" verbose:NO]; + } +} + + - (void)listenOnPort:(int)port remote:(BOOL)remote { if ( connection ) @@ -94,20 +117,16 @@ - (void)broadcastWithName:(NSString *)name { - if ( TCGlobalAllowRemote ) - { - [self stopBroadcast]; + [self stopBroadcast]; - service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort]; - [service setDelegate:self]; - [service publish]; - } + service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort]; + [service setDelegate:self]; + [service publish]; } - (void)stopBroadcast { - oldService = service; - [oldService stop], service = nil; + [service stop], service = nil; } @@ -145,7 +164,12 @@ - (IBAction)launchHelpFile:(id)sender { //[[NSWorkspace sharedWorkspace] openFile:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"html"] withApplication:@"Safari"]; - [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"pdf"]]]; + [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"rtf"]]]; +} + +- (IBAction)launchEmailMenu:(id)sender +{ + LaunchEmail(); } - (IBAction)launchWebsiteMenu:(id)sender @@ -153,9 +177,16 @@ LaunchWebsite(); } -- (IBAction)launchDebugEmailMenu:(id)sender + +- (IBAction)checkForUpdate:(id)sender { - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"mailto:thecheat@brokenzipper.com"]]; + [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist"]; +} + + +- (NSArray *)serverList +{ + return serverList; } @@ -167,6 +198,9 @@ [self stopBroadcast]; [servers release]; + + [browser release]; + [serverList release]; [super dealloc]; } @@ -177,6 +211,38 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ +- (void)preferenceSetWindowsOnTop:(BOOL)windowsOnTop +{ + if ( TCGlobalWindowsOnTop != windowsOnTop ) + { + [[NSNotificationCenter defaultCenter] postNotificationName:@"TCWindowsOnTopChanged" object:[NSNumber numberWithBool:windowsOnTop]]; + } +} + +- (void)preferenceSetAllowRemote:(BOOL)allow listenPort:(int)port broadcastName:(NSString *)name +{ + if ( TCGlobalAllowRemote != allow || TCGlobalListenPort != port ) + { + [self listenOnPort:port remote:allow]; + } + if ( allow ) + { + if ( !TCGlobalAllowRemote || ![TCGlobalBroadcastName isEqualToString:name] ) + { + [self broadcastWithName:name]; + } + } + else + { + [self stopBroadcast]; + } + [netTrafficController serverSetAllowRemote:allow listenPort:port broadcastName:name]; + //[netTrafficController allowRemoteChanged:allow]; + //[netTrafficController listenPortChanged:port]; + //[netTrafficController broadcastNameChanged:name]; +} + +/* - (void)preferenceAllowRemoteChanged:(BOOL)allow { [self listenOnPort:TCGlobalListenPort remote:allow]; @@ -207,6 +273,7 @@ [netTrafficController broadcastNameChanged:name]; } +*/ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -369,7 +436,7 @@ if ( [[errorDict objectForKey:@"NSNetServicesErrorCode"] intValue] == NSNetServicesCollisionError ) { - [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", TCGlobalBroadcastName, TCGlobalAlternateBroadcastNameCount++]]; + [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", [sender name], TCGlobalAlternateBroadcastNameCount++]]; } else { @@ -380,19 +447,62 @@ - (void)netServiceDidStop:(NSNetService *)sender { NSLog( @"service stopped" ); - [oldService release], oldService = nil; + [sender release]; } /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%% NSApplication Notification +%%%%%%%%%%%%%%%%%%%%%% NSNetServiceBrowser Delegate %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -- (void)willQuit:(NSNotification *)note +- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)aService moreComing:(BOOL)more { - //[self listenPortTextField:self]; - //[self broadcastNameTextField:self]; + // a server has broadcast; not much use until it's resolved. + [aService setDelegate:self]; + [aService resolve]; +} + +- (void)netServiceDidResolveAddress:(NSNetService *)aService +{ + int i, top = [serverList count]; + + // ignore if this is the local server. + if ( TCGlobalAllowRemote && [[aService name] isEqualToString:TCGlobalBroadcastName] ) + { + return; + } + + // ignore if the server name is already in the list. + for ( i = 0; i < top; i++ ) + { + if ( [[aService name] isEqualToString:[(NSNetService *)[serverList objectAtIndex:i] name]] ) + { + return; + } + } + + [serverList addObject:aService]; + NSLog( @"server added: %i", [serverList count] ); + + [[NSNotificationCenter defaultCenter] postNotificationName:@"TCServerFound" object:aService]; +} + +- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didRemoveService:(NSNetService *)aService moreComing:(BOOL)more +{ + int i, top = [serverList count]; + + for ( i = 0; i < top; i++ ) + { + if ( [[aService name] isEqualToString:[(NSNetService *)[serverList objectAtIndex:i] name]] ) + { + [serverList removeObjectAtIndex:i]; + NSLog( @"server deleted: %i", [serverList count] ); + break; + } + } + + [[NSNotificationCenter defaultCenter] postNotificationName:@"TCServerLost" object:aService]; }