-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Project: The Cheat
-//
-// File: AppController.m
-// Created: Wed Aug 13 2003
-//
-// Copyright: 2003 Chaz McGarvey. All rights reserved.
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// **********************************************************************
+// The Cheat - A universal game cheater for Mac OS X
+// (C) 2003-2005 Chaz McGarvey (BrokenZipper)
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 1, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
#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
-@implementation AppController
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark Initialization
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+ (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:TCGlobalAllowRemote] forKey:TCAllowRemotePref];
- [defaults setObject:[NSNumber numberWithInt:TCGlobalListenPort] forKey:TCListenPortPref];
- [defaults setObject:[NSString stringWithFormat:@"%@'s Computer", NSFullUserName()] forKey:TCBroadcastNamePref];
-
+ 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] integerForKey:TCPlaySoundsPref];
- TCGlobalWindowsOnTop = [[NSUserDefaults standardUserDefaults] integerForKey:TCWindowsOnTopPref];
- TCGlobalListenPort = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref];
- TCGlobalAllowRemote = [[NSUserDefaults standardUserDefaults] boolForKey:TCAllowRemotePref];
+
+ // set globals
+ gFadeAnimationDuration = [[NSUserDefaults standardUserDefaults] floatForKey:TCFadeAnimationPref];
}
- (id)init
{
- if ( self = [super init] )
- {
- servers = [[NSMutableArray alloc] init];
-
- [self listenOnPort:TCGlobalListenPort remote: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)listenOnPort:(int)port remote:(BOOL)remote
-{
- if ( connection )
- {
- [self stopListener];
-
- waitingToListen = YES;
- connectionPort = port;
- connectionRemote = remote;
- }
- else
- {
- connection = [[CheatListener listenerWithDelegate:self port:port remote:remote] retain];
- connectionPort = port;
- connectionRemote = remote;
- }
-}
-
-- (void)stopListener
-{
- if ( connection )
- {
- close( sockfd );
- [connection release], connection = nil;
- }
-}
-
-
-- (void)broadcastWithName:(NSString *)name
-{
- if ( TCGlobalAllowRemote )
- {
- [self stopBroadcast];
-
- service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort];
- [service setDelegate:self];
- [service publish];
- }
-}
-
-- (void)stopBroadcast
-{
- [service stop], service = nil;
-}
-
-
-- (IBAction)showAboutBoxWindow:(id)sender
-{
- if ( !aboutBoxController )
- {
- aboutBoxController = [[AboutBoxController alloc] init];
- }
-
- [aboutBoxController showWindow:self];
-}
-
-- (IBAction)showPreferenceWindow:(id)sender
-{
- if ( !preferenceController )
- {
- preferenceController = [[PreferenceController alloc] initWithDelegate:self];
- }
-
- [preferenceController showWindow:self];
-}
-
-- (IBAction)showNetTrafficWindow:(id)sender
-{
- if ( !netTrafficController )
- {
- netTrafficController = [[NetTrafficController alloc] initWithDelegate:self];
- }
-
- [netTrafficController 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:@"pdf"]]];
-}
-
-- (IBAction)launchWebsiteMenu:(id)sender
-{
- LaunchWebsite();
-}
-
-
-- (NSArray *)serverList
-{
- return serverList;
-}
-
-
- (void)dealloc
{
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- [self stopListener];
- [self stopBroadcast];
-
- [servers release];
-
- [browser release];
- [serverList release];
-
+ ChazLog( @"AppController deallocated!!" );
+ [self stopCheatServer];
[super dealloc];
}
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% PreferenceControlling
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark NSApplication Delegate
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)preferenceAllowRemoteChanged:(BOOL)allow
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
- [self listenOnPort:TCGlobalListenPort remote:allow];
+ // check if this is the first launch
+ if ( ![[NSUserDefaults standardUserDefaults] boolForKey:TCFirstLaunchPref] ) {
+ // FIRST LAUNCH
+ [self showAboutBoxWindow:self];
+ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:TCFirstLaunchPref];
+ }
- if ( allow )
- {
- [self broadcastWithName:TCGlobalBroadcastName];
+ // if should check for updates on launch
+ if ( [[NSUserDefaults standardUserDefaults] boolForKey:TCUpdateCheckPref] ) {
+ ChazCheckForUpdate( TCUpdateCheckURL, NO );
}
- else
- {
- [self stopBroadcast];
+
+ // automaticall 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];
+ }
}
-
- [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] );
-}
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark Interface Actions
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% ListenerDelegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-- (void)listenerListeningWithSocket:(int)sock
+- (IBAction)newSearchWindow:(id)sender
{
- 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];
+ NSDocumentController *controller = [NSDocumentController sharedDocumentController];
+ CheatDocument *doc = [controller makeUntitledDocumentOfType:@"Cheat Document"];
+ if ( !doc ) {
+ ChazLog( @"nil document" );
}
-
- TCGlobalListening = NO;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStopped" object:nil];
-}
-
-- (void)listenerError:(NSString *)error message:(NSString *)message
-{
- NSRunCriticalAlertPanel( error, message, @"OK", nil, nil );
+ [doc setMode:TCSearchMode];
+ [controller addDocument:doc];
+ [doc makeWindowControllers];
+ [doc showWindows];
}
-- (void)listenerReceivedNewConnection:(int)sock
+- (IBAction)newBlankCheatWindow:(id)sender
{
- [servers addObject:[ServerHolder holderWithConnection:[CheatServer serverWithDelegate:self socket:sock] socket:sock]];
+ NSDocumentController *controller = [NSDocumentController sharedDocumentController];
+ CheatDocument *doc = [controller makeUntitledDocumentOfType:@"Cheat Document"];
+ if ( !doc ) {
+ ChazLog( @"nil document" );
+ }
+ [doc setMode:TCCheatMode];
+ [controller addDocument:doc];
+ [doc makeWindowControllers];
+ [doc showWindows];
}
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% ServerDelegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)server:(CheatServer *)server connectedWithSocket:(int)sock
+- (IBAction)showAboutBoxWindow:(id)sender
{
- 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;
- }
+ if ( !_aboutBoxController ) {
+ _aboutBoxController = [[AboutBoxController alloc] init];
}
-
- [netTrafficController connectionListChanged];
+ [_aboutBoxController showWindow:self];
}
-- (void)serverDisconnected:(CheatServer *)server
+- (IBAction)showPreferenceWindow:(id)sender
{
- int i, top = [servers count];
-
- for ( i = 0; i < top; i++ )
- {
- if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
- {
- [servers removeObjectAtIndex:i];
- break;
- }
+ if ( !_preferenceController ) {
+ _preferenceController = [[PreferenceController alloc] init];
}
-
- [netTrafficController connectionListChanged];
+ [_preferenceController showWindow:self];
}
-- (void)server:(CheatServer *)server changedAddress:(NSString *)address
+
+- (IBAction)launchHelpFile:(id)sender
{
- 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;
- }
+ if ( !_helpController ) {
+ _helpController = [[HelpController alloc] init];
}
-
- [netTrafficController connectionListChanged];
+ [_helpController showWindow:self];
}
-- (void)server:(CheatServer *)server changedAction:(NSString *)action
+- (IBAction)launchEmailMenu:(id)sender
{
- 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;
- }
- }
-
- [netTrafficController connectionListChanged];
+ LaunchEmail();
}
-- (NSArray *)serverProcessList
+- (IBAction)launchWebsiteMenu:(id)sender
{
- return [[NSWorkspace sharedWorkspace] launchedApplications];
+ LaunchWebsite();
}
-- (pid_t)serverFirstProcess
+
+- (IBAction)checkForUpdate:(id)sender
{
- return (pid_t)[[[[[NSWorkspace sharedWorkspace] launchedApplications] objectAtIndex:0] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
+ ChazCheckForUpdate( TCUpdateCheckURL, YES );
}
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NetService Delegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark CheatServer Stuff
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)netServiceWillPublish:(NSNetService *)sender
+- (CheatServer *)cheatServer
{
- NSLog( @"service will publish" );
- [sender resolve];
+ if ( !_server ) {
+ _server = [[CheatServer alloc] initWithDelegate:self];
+ }
+ return _server;
}
-- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict
+- (BOOL)startCheatServer
{
- NSLog( @"service did not publish" );
+ ChazLog( @"cheat server starting..." );
- if ( [[errorDict objectForKey:@"NSNetServicesErrorCode"] intValue] == NSNetServicesCollisionError )
- {
- [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", TCGlobalBroadcastName, TCGlobalAlternateBroadcastNameCount++]];
+ // start the server with saved settings
+ int port = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref];
+ NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:TCBroadcastNamePref];
+ if ( [name isEqualToString:@""] ) {
+ name = nil;
}
- else
- {
- NSRunCriticalAlertPanel( @"Network Error", @"Server couldn't broadcast. Local can't be cheated by remote computers.", @"OK", nil, nil );
+
+ // 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;
}
+ return NO;
}
-- (void)netServiceDidStop:(NSNetService *)sender
+- (void)stopCheatServer
{
- NSLog( @"service stopped" );
- [sender release];
+ if ( _server ) {
+ [_server stop];
+ [[NSNotificationCenter defaultCenter] postNotificationName:TCServerStoppedNote object:[self cheatServer]];
+ }
}
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NSNetServiceBrowser Delegate
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+#pragma mark CheatServerDelegate
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)aService moreComing:(BOOL)more
+- (void)serverDisconnectedUnexpectedly:(CheatServer *)theServer
{
- // a server has broadcast; not much use until it's resolved.
- [aService setDelegate:self];
- [aService resolve];
+ ChazLog( @"server disconnected unexpectedly." );
+ [self stopCheatServer];
}
-- (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)server:(CheatServer *)theServer failedToBroadcastName:(NSString *)theName
+{
+ 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)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