-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Project: The Cheat
-//
-// File: AppController.m
-// Created: Wed Aug 13 2003
-//
-// Copyright: 2003 Chaz McGarvey. All rights reserved.
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+/*
+ * The Cheat - The legendary universal game trainer for Mac OS X.
+ * http://www.dogcows.com/chaz/wiki/TheCheat
+ *
+ * Copyright (c) 2003-2010, Charles McGarvey et al.
+ *
+ * Distributable under the terms and conditions of the 2-clause BSD
+ * license; see the file COPYING for the legal text of the license.
+ */
#import "AppController.h"
-#include "cheat_shared.h"
-
+#import "CheatDocument.h"
#import "AboutBoxController.h"
+#import "HelpController.h"
#import "PreferenceController.h"
-#import "NetTrafficController.h"
-
-#import "CheatListener.h"
-#import "CheatServer.h"
-#import "ServerHolder.h"
+@implementation AppController
-#import <Chaz/CMUpdateCheck.h>
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark Initialization
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-@implementation AppController
+ (void)initialize
{
- NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
- char temp[104];
+ NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
- // change the socket path to reside in the home directory of the current user
- strncpy( temp, [NSHomeDirectory() lossyCString], 103 );
- strncat( temp, TCDefaultListenPath, 103 - strlen(TCDefaultListenPath) );
- strncpy( TCDefaultListenPath, temp, 103 );
-
- [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];
-
+ TCFirstLaunchPref = [[NSString stringWithFormat:@"TC%@%@Pref", ChazAppName(), ChazAppVersion()] retain];
+ NSString *broadcastName = [NSString stringWithFormat:@"%@'s Computer", NSFullUserName()];
+
+ // register user defaults
+ [defaults setObject:[NSNumber numberWithBool:NO] forKey:TCFirstLaunchPref];
+ [defaults setObject:[NSNumber numberWithBool:NO] forKey:TCWindowsOnTopPref];
+ [defaults setObject:[NSNumber numberWithBool:YES] forKey:TCUpdateCheckPref];
+ [defaults setObject:[NSNumber numberWithBool:YES] forKey:TCDisplayValuesPref];
+ [defaults setObject:[NSNumber numberWithFloat:1.0] forKey:TCValueUpdatePref];
+ [defaults setObject:[NSNumber numberWithInt:1000] forKey:TCHitsDisplayedPref];
+ [defaults setObject:[NSNumber numberWithBool:NO] forKey:TCRunServerPref];
+ [defaults setObject:broadcastName forKey:TCBroadcastNamePref];
+ [defaults setObject:[NSNumber numberWithInt:TCDefaultListenPort] forKey:TCListenPortPref];
+ [defaults setObject:[NSNumber numberWithFloat:gFadeAnimationDuration] forKey:TCFadeAnimationPref];
+ [defaults setObject:[NSNumber numberWithBool:YES] forKey:TCAskForSavePref];
+ [defaults setObject:[NSNumber numberWithBool:YES] forKey:TCSwitchVariablesPref];
+ [defaults setObject:[NSNumber numberWithBool:YES] forKey:TCAutoStartEditingVarsPref];
+
+ // register it
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
-
- 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];
+
+ // set globals
+ gFadeAnimationDuration = [[NSUserDefaults standardUserDefaults] floatForKey:TCFadeAnimationPref];
}
- (id)init
{
- if ( self = [super init] )
- {
- servers = [[NSMutableArray alloc] init];
-
- // start the server with saved settings
- [self listenOnPort:TCGlobalListenPort remote:TCGlobalAllowRemote];
- 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];
-
+ if ( self = [super init] ) {
[self setDelegate:self];
}
}
-- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
+- (void)dealloc
{
- if ( TCGlobalUpdateCheck )
- {
- [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist" verbose:NO];
- }
+ ChazLog( @"AppController deallocated!!" );
+ [self stopCheatServer];
+ [super dealloc];
}
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark NSApplication Delegate
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)listenOnPort:(int)port remote:(BOOL)remote
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
- if ( connection )
- {
- [self stopListener];
-
- waitingToListen = YES;
- connectionPort = port;
- connectionRemote = remote;
+ [NSApp activateIgnoringOtherApps:YES];
+
+ // check if this is the first launch
+ if ( ![[NSUserDefaults standardUserDefaults] boolForKey:TCFirstLaunchPref] ) {
+ // FIRST LAUNCH
+ [self showAboutBoxWindow:self];
+ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:TCFirstLaunchPref];
}
- else
- {
- connection = [[CheatListener listenerWithDelegate:self port:port remote:remote] retain];
- connectionPort = port;
- connectionRemote = remote;
+
+ // if should check for updates on launch
+ if ( [[NSUserDefaults standardUserDefaults] boolForKey:TCUpdateCheckPref] ) {
+ ChazCheckForUpdate( TCUpdateCheckURL, NO );
}
-}
-
-- (void)stopListener
-{
- if ( connection )
- {
- close( sockfd );
- [connection release], connection = nil;
+
+ // automatically start the cheat server if the pref is set
+ if ( [[NSUserDefaults standardUserDefaults] boolForKey:TCRunServerPref] ) {
+ if ( ![self startCheatServer] ) {
+ // inform the user that the server won't start
+ NSRunAlertPanel( @"The Cheat could not start the server.",
+ @"The cheat server failed to start. Check the server settings and start it manually.",
+ @"OK", nil, nil );
+ // open server prefs
+ [self showPreferenceWindow:self];
+ [_preferenceController chooseServer:self];
+ }
}
}
-- (void)broadcastWithName:(NSString *)name
-{
- [self stopBroadcast];
-
- service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort];
- [service setDelegate:self];
- [service publish];
-}
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark Interface Actions
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)stopBroadcast
+
+- (IBAction)newSearchWindow:(id)sender
{
- [service stop], service = nil;
+ NSDocumentController *controller = [NSDocumentController sharedDocumentController];
+ CheatDocument *doc = [controller makeUntitledDocumentOfType:@"Cheat Document"];
+ if ( !doc ) {
+ ChazLog( @"nil document" );
+ }
+ [doc setMode:TCSearchMode];
+ [controller addDocument:doc];
+ [doc makeWindowControllers];
+ [doc showWindows];
}
-
-- (IBAction)showAboutBoxWindow:(id)sender
+- (IBAction)newBlankCheatWindow:(id)sender
{
- if ( !aboutBoxController )
- {
- aboutBoxController = [[AboutBoxController alloc] init];
+ NSDocumentController *controller = [NSDocumentController sharedDocumentController];
+ CheatDocument *doc = [controller makeUntitledDocumentOfType:@"Cheat Document"];
+ if ( !doc ) {
+ ChazLog( @"nil document" );
}
-
- [aboutBoxController showWindow:self];
+ [doc setMode:TCCheatMode];
+ [controller addDocument:doc];
+ [doc makeWindowControllers];
+ [doc showWindows];
}
-- (IBAction)showPreferenceWindow:(id)sender
+- (IBAction)showAboutBoxWindow:(id)sender
{
- if ( !preferenceController )
- {
- preferenceController = [[PreferenceController alloc] initWithDelegate:self];
+ if ( !_aboutBoxController ) {
+ _aboutBoxController = [[AboutBoxController alloc] init];
}
-
- [preferenceController showWindow:self];
+ [_aboutBoxController showWindow:self];
}
-- (IBAction)showNetTrafficWindow:(id)sender
+- (IBAction)showPreferenceWindow:(id)sender
{
- if ( !netTrafficController )
- {
- netTrafficController = [[NetTrafficController alloc] initWithDelegate:self];
+ if ( !_preferenceController ) {
+ _preferenceController = [[PreferenceController alloc] init];
}
-
- [netTrafficController showWindow:self];
+ [_preferenceController showWindow:self];
}
- (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:@"rtf"]]];
+ if ( !_helpController ) {
+ _helpController = [[HelpController alloc] init];
+ }
+ [_helpController showWindow:self];
}
- (IBAction)launchEmailMenu:(id)sender
- (IBAction)checkForUpdate:(id)sender
{
- [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist"];
-}
-
-
-- (NSArray *)serverList
-{
- return serverList;
-}
-
-
-- (void)dealloc
-{
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- [self stopListener];
- [self stopBroadcast];
-
- [servers release];
-
- [browser release];
- [serverList release];
-
- [super dealloc];
+ ChazCheckForUpdate( TCUpdateCheckURL, YES );
}
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% PreferenceControlling
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark CheatServer Stuff
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)preferenceSetWindowsOnTop:(BOOL)windowsOnTop
+- (CheatServer *)cheatServer
{
- if ( TCGlobalWindowsOnTop != windowsOnTop )
- {
- [[NSNotificationCenter defaultCenter] postNotificationName:@"TCWindowsOnTopChanged" object:[NSNumber numberWithBool:windowsOnTop]];
+ if ( !_server ) {
+ _server = [[CheatServer alloc] initWithDelegate:self];
}
+ return _server;
}
-- (void)preferenceSetAllowRemote:(BOOL)allow listenPort:(int)port broadcastName:(NSString *)name
+- (BOOL)startCheatServer
{
- 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];
+ ChazLog( @"cheat server starting..." );
- if ( allow )
- {
- [self broadcastWithName:TCGlobalBroadcastName];
+ // start the server with saved settings
+ int port = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref];
+ NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:TCBroadcastNamePref];
+ if ( [name isEqualToString:@""] ) {
+ name = nil;
}
- else
- {
- [self stopBroadcast];
- }
-
- [netTrafficController allowRemoteChanged:allow];
-}
-
-- (void)preferenceListenPortChanged:(int)port
-{
- [self listenOnPort:port remote:TCGlobalAllowRemote];
- [self broadcastWithName:TCGlobalBroadcastName];
-
- [netTrafficController listenPortChanged:port];
-}
-
-- (void)preferenceBroadcastNameChanged:(NSString *)name
-{
- [self broadcastWithName:name];
-
- [netTrafficController broadcastNameChanged:name];
-}
-*/
-
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NetTrafficControlling
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (int)netTrafficConnectionCount
-{
- return [servers count];
-}
-
-- (NSArray *)netTrafficConnectionList
-{
- return servers;
-}
-
-- (void)netTrafficKillConnection:(int)index
-{
- NSLog( @"kill connection" );
-
- close( [[servers objectAtIndex:index] sockfd] );
-}
-
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% ListenerDelegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)listenerListeningWithSocket:(int)sock
-{
- sockfd = sock;
-
- TCGlobalListening = YES;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStarted" object:nil];
-}
-
-- (void)listenerDisconnected
-{
- if ( waitingToListen )
- {
- waitingToListen = NO;
- connection = [[CheatListener listenerWithDelegate:self port:connectionPort remote:connectionRemote] retain];
- }
- else
- {
- [self stopListener];
- }
-
- TCGlobalListening = NO;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStopped" object:nil];
-}
-
-- (void)listenerError:(NSString *)error message:(NSString *)message
-{
- NSRunCriticalAlertPanel( error, message, @"OK", nil, nil );
-}
-
-- (void)listenerReceivedNewConnection:(int)sock
-{
- [servers addObject:[ServerHolder holderWithConnection:[CheatServer serverWithDelegate:self socket:sock] socket:sock]];
-}
-
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% ServerDelegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)server:(CheatServer *)server connectedWithSocket:(int)sock
-{
- int i, top = [servers count];
-
- for ( i = 0; i < top; i++ )
- {
- if ( [(ServerHolder *)[servers objectAtIndex:i] sockfd] == sock )
- {
- [(ServerHolder *)[servers objectAtIndex:i] setServer:server];
- break;
- }
- }
-
- [netTrafficController connectionListChanged];
-}
-
-- (void)serverDisconnected:(CheatServer *)server
-{
- int i, top = [servers count];
-
- for ( i = 0; i < top; i++ )
- {
- if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
- {
- [servers removeObjectAtIndex:i];
- break;
- }
- }
-
- [netTrafficController connectionListChanged];
-}
-
-- (void)server:(CheatServer *)server changedAddress:(NSString *)address
-{
- int i, top = [servers count];
-
- for ( i = 0; i < top; i++ )
- {
- if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
- {
- [(ServerHolder *)[servers objectAtIndex:i] setAddress:address];
- break;
- }
+
+ // stop the cheat server if it's running
+ [self stopCheatServer];
+
+ // start the server
+ if ( [[self cheatServer] listenOnPort:port broadcast:name] ) {
+ [[NSNotificationCenter defaultCenter] postNotificationName:TCServerStartedNote object:[self cheatServer]];
+ return YES;
}
-
- [netTrafficController connectionListChanged];
+ return NO;
}
-- (void)server:(CheatServer *)server changedAction:(NSString *)action
+- (void)stopCheatServer
{
- int i, top = [servers count];
-
- for ( i = 0; i < top; i++ )
- {
- if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
- {
- [(ServerHolder *)[servers objectAtIndex:i] setAction:action];
- break;
- }
+ if ( _server ) {
+ [_server stop];
+ [[NSNotificationCenter defaultCenter] postNotificationName:TCServerStoppedNote object:[self cheatServer]];
}
-
- [netTrafficController connectionListChanged];
}
-- (NSArray *)serverProcessList
-{
- return [[NSWorkspace sharedWorkspace] launchedApplications];
-}
-- (pid_t)serverFirstProcess
-{
- return (pid_t)[[[[[NSWorkspace sharedWorkspace] launchedApplications] objectAtIndex:0] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
-}
-
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NetService Delegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)netServiceWillPublish:(NSNetService *)sender
-{
- NSLog( @"service will publish" );
- [sender resolve];
-}
-
-- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict
-{
- NSLog( @"service did not publish" );
-
- if ( [[errorDict objectForKey:@"NSNetServicesErrorCode"] intValue] == NSNetServicesCollisionError )
- {
- [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", [sender name], TCGlobalAlternateBroadcastNameCount++]];
- }
- else
- {
- NSRunCriticalAlertPanel( @"Network Error", @"Server couldn't broadcast. Local can't be cheated by remote computers.", @"OK", nil, nil );
- }
-}
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark CheatServerDelegate
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)netServiceDidStop:(NSNetService *)sender
+- (void)serverDisconnectedUnexpectedly:(CheatServer *)theServer
{
- NSLog( @"service stopped" );
- [sender release];
+ ChazLog( @"server disconnected unexpectedly." );
+ [self stopCheatServer];
}
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NSNetServiceBrowser Delegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)aService moreComing:(BOOL)more
+- (void)server:(CheatServer *)theServer failedToBroadcastName:(NSString *)theName
{
- // a server has broadcast; not much use until it's resolved.
- [aService setDelegate:self];
- [aService resolve];
+ NSBeginInformationalAlertSheet( @"The cheat server can not broadcast.", @"OK", nil, nil, [_preferenceController window], nil, NULL, NULL, NULL,
+ @"The Cheat can't broadcast as \"%@\" because that name is in use by another server. The server will continue running with broadcasting disabled.", theName );
}
-- (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
+- (void)serverChildrenChanged:(CheatServer *)theServer
{
- 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];
+ [[NSNotificationCenter defaultCenter] postNotificationName:TCServerConnectionsChangedNote object:theServer];
}
-@end
\ No newline at end of file
+@end