]> Dogcows Code - chaz/thecheat/blob - AppController.m
The Cheat 1.1.1
[chaz/thecheat] / AppController.m
1
2 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 // Project: The Cheat
4 //
5 // File: AppController.m
6 // Created: Wed Aug 13 2003
7 //
8 // Copyright: 2003 Chaz McGarvey. All rights reserved.
9 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10
11 #import "AppController.h"
12
13 #include "cheat_shared.h"
14
15 #import "AboutBoxController.h"
16 #import "PreferenceController.h"
17 #import "NetTrafficController.h"
18
19 #import "CheatListener.h"
20 #import "CheatServer.h"
21
22 #import "ServerHolder.h"
23
24 #import <Chaz/CMUpdateCheck.h>
25
26
27 @implementation AppController
28
29 + (void)initialize
30 {
31 NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
32 char temp[104];
33
34 // change the socket path to reside in the home directory of the current user
35 strncpy( temp, [NSHomeDirectory() lossyCString], 103 );
36 strncat( temp, TCDefaultListenPath, 103 - strlen(TCDefaultListenPath) );
37 strncpy( TCDefaultListenPath, temp, 103 );
38
39 [defaults setObject:[NSNumber numberWithBool:TCGlobalPlaySounds] forKey:TCPlaySoundsPref];
40 [defaults setObject:[NSNumber numberWithBool:TCGlobalWindowsOnTop] forKey:TCWindowsOnTopPref];
41 [defaults setObject:[NSNumber numberWithBool:TCGlobalUpdateCheck] forKey:TCUpdateCheckPref];
42 [defaults setObject:[NSNumber numberWithBool:TCGlobalAllowRemote] forKey:TCAllowRemotePref];
43 [defaults setObject:[NSNumber numberWithInt:TCGlobalListenPort] forKey:TCListenPortPref];
44 [defaults setObject:[NSString stringWithFormat:@"%@'s Computer", NSFullUserName()] forKey:TCBroadcastNamePref];
45 [defaults setObject:[NSNumber numberWithInt:TCGlobalHitsDisplayed] forKey:TCHitsDisplayedPref];
46
47 [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
48
49 TCGlobalPlaySounds = [[NSUserDefaults standardUserDefaults] boolForKey:TCPlaySoundsPref];
50 TCGlobalWindowsOnTop = [[NSUserDefaults standardUserDefaults] boolForKey:TCWindowsOnTopPref];
51 TCGlobalUpdateCheck = [[NSUserDefaults standardUserDefaults] boolForKey:TCUpdateCheckPref];
52 TCGlobalAllowRemote = [[NSUserDefaults standardUserDefaults] boolForKey:TCAllowRemotePref];
53 TCGlobalListenPort = [[NSUserDefaults standardUserDefaults] integerForKey:TCListenPortPref];
54 TCGlobalHitsDisplayed = [[NSUserDefaults standardUserDefaults] integerForKey:TCHitsDisplayedPref];
55 }
56
57 - (id)init
58 {
59 if ( self = [super init] )
60 {
61 servers = [[NSMutableArray alloc] init];
62
63 // start the server with saved settings
64 [self listenOnPort:TCGlobalListenPort remote:TCGlobalAllowRemote];
65 if ( TCGlobalAllowRemote ) [self broadcastWithName:TCGlobalBroadcastName];
66
67 // set up the network browser
68 browser = [[NSNetServiceBrowser alloc] init];
69 [browser setDelegate:self];
70 [browser searchForServicesOfType:@"_cheat._tcp." inDomain:@"local."];
71
72 serverList = [[NSMutableArray alloc] init];
73
74 [self setDelegate:self];
75 }
76
77 return self;
78 }
79
80
81 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
82 {
83 if ( TCGlobalUpdateCheck )
84 {
85 [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist" verbose:NO];
86 }
87 }
88
89
90 - (void)listenOnPort:(int)port remote:(BOOL)remote
91 {
92 if ( connection )
93 {
94 [self stopListener];
95
96 waitingToListen = YES;
97 connectionPort = port;
98 connectionRemote = remote;
99 }
100 else
101 {
102 connection = [[CheatListener listenerWithDelegate:self port:port remote:remote] retain];
103 connectionPort = port;
104 connectionRemote = remote;
105 }
106 }
107
108 - (void)stopListener
109 {
110 if ( connection )
111 {
112 close( sockfd );
113 [connection release], connection = nil;
114 }
115 }
116
117
118 - (void)broadcastWithName:(NSString *)name
119 {
120 [self stopBroadcast];
121
122 service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort];
123 [service setDelegate:self];
124 [service publish];
125 }
126
127 - (void)stopBroadcast
128 {
129 [service stop], service = nil;
130 }
131
132
133 - (IBAction)showAboutBoxWindow:(id)sender
134 {
135 if ( !aboutBoxController )
136 {
137 aboutBoxController = [[AboutBoxController alloc] init];
138 }
139
140 [aboutBoxController showWindow:self];
141 }
142
143 - (IBAction)showPreferenceWindow:(id)sender
144 {
145 if ( !preferenceController )
146 {
147 preferenceController = [[PreferenceController alloc] initWithDelegate:self];
148 }
149
150 [preferenceController showWindow:self];
151 }
152
153 - (IBAction)showNetTrafficWindow:(id)sender
154 {
155 if ( !netTrafficController )
156 {
157 netTrafficController = [[NetTrafficController alloc] initWithDelegate:self];
158 }
159
160 [netTrafficController showWindow:self];
161 }
162
163
164 - (IBAction)launchHelpFile:(id)sender
165 {
166 //[[NSWorkspace sharedWorkspace] openFile:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"html"] withApplication:@"Safari"];
167 [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"rtf"]]];
168 }
169
170 - (IBAction)launchEmailMenu:(id)sender
171 {
172 LaunchEmail();
173 }
174
175 - (IBAction)launchWebsiteMenu:(id)sender
176 {
177 LaunchWebsite();
178 }
179
180
181 - (IBAction)checkForUpdate:(id)sender
182 {
183 [CMUpdateCheck checkWithURL:@"http://www.brokenzipper.com/software.plist"];
184 }
185
186
187 - (NSArray *)serverList
188 {
189 return serverList;
190 }
191
192
193 - (void)dealloc
194 {
195 [[NSNotificationCenter defaultCenter] removeObserver:self];
196
197 [self stopListener];
198 [self stopBroadcast];
199
200 [servers release];
201
202 [browser release];
203 [serverList release];
204
205 [super dealloc];
206 }
207
208
209 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
210 %%%%%%%%%%%%%%%%%%%%%% PreferenceControlling
211 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
212
213
214 - (void)preferenceSetWindowsOnTop:(BOOL)windowsOnTop
215 {
216 if ( TCGlobalWindowsOnTop != windowsOnTop )
217 {
218 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCWindowsOnTopChanged" object:[NSNumber numberWithBool:windowsOnTop]];
219 }
220 }
221
222 - (void)preferenceSetAllowRemote:(BOOL)allow listenPort:(int)port broadcastName:(NSString *)name
223 {
224 if ( TCGlobalAllowRemote != allow || TCGlobalListenPort != port )
225 {
226 [self listenOnPort:port remote:allow];
227 }
228 if ( allow )
229 {
230 if ( !TCGlobalAllowRemote || ![TCGlobalBroadcastName isEqualToString:name] )
231 {
232 [self broadcastWithName:name];
233 }
234 }
235 else
236 {
237 [self stopBroadcast];
238 }
239 [netTrafficController serverSetAllowRemote:allow listenPort:port broadcastName:name];
240 //[netTrafficController allowRemoteChanged:allow];
241 //[netTrafficController listenPortChanged:port];
242 //[netTrafficController broadcastNameChanged:name];
243 }
244
245 /*
246 - (void)preferenceAllowRemoteChanged:(BOOL)allow
247 {
248 [self listenOnPort:TCGlobalListenPort remote:allow];
249
250 if ( allow )
251 {
252 [self broadcastWithName:TCGlobalBroadcastName];
253 }
254 else
255 {
256 [self stopBroadcast];
257 }
258
259 [netTrafficController allowRemoteChanged:allow];
260 }
261
262 - (void)preferenceListenPortChanged:(int)port
263 {
264 [self listenOnPort:port remote:TCGlobalAllowRemote];
265 [self broadcastWithName:TCGlobalBroadcastName];
266
267 [netTrafficController listenPortChanged:port];
268 }
269
270 - (void)preferenceBroadcastNameChanged:(NSString *)name
271 {
272 [self broadcastWithName:name];
273
274 [netTrafficController broadcastNameChanged:name];
275 }
276 */
277
278
279 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 %%%%%%%%%%%%%%%%%%%%%% NetTrafficControlling
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
282
283
284 - (int)netTrafficConnectionCount
285 {
286 return [servers count];
287 }
288
289 - (NSArray *)netTrafficConnectionList
290 {
291 return servers;
292 }
293
294 - (void)netTrafficKillConnection:(int)index
295 {
296 NSLog( @"kill connection" );
297
298 close( [[servers objectAtIndex:index] sockfd] );
299 }
300
301
302 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
303 %%%%%%%%%%%%%%%%%%%%%% ListenerDelegate
304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
305
306
307 - (void)listenerListeningWithSocket:(int)sock
308 {
309 sockfd = sock;
310
311 TCGlobalListening = YES;
312 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStarted" object:nil];
313 }
314
315 - (void)listenerDisconnected
316 {
317 if ( waitingToListen )
318 {
319 waitingToListen = NO;
320 connection = [[CheatListener listenerWithDelegate:self port:connectionPort remote:connectionRemote] retain];
321 }
322 else
323 {
324 [self stopListener];
325 }
326
327 TCGlobalListening = NO;
328 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStopped" object:nil];
329 }
330
331 - (void)listenerError:(NSString *)error message:(NSString *)message
332 {
333 NSRunCriticalAlertPanel( error, message, @"OK", nil, nil );
334 }
335
336 - (void)listenerReceivedNewConnection:(int)sock
337 {
338 [servers addObject:[ServerHolder holderWithConnection:[CheatServer serverWithDelegate:self socket:sock] socket:sock]];
339 }
340
341
342 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
343 %%%%%%%%%%%%%%%%%%%%%% ServerDelegate
344 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
345
346
347 - (void)server:(CheatServer *)server connectedWithSocket:(int)sock
348 {
349 int i, top = [servers count];
350
351 for ( i = 0; i < top; i++ )
352 {
353 if ( [(ServerHolder *)[servers objectAtIndex:i] sockfd] == sock )
354 {
355 [(ServerHolder *)[servers objectAtIndex:i] setServer:server];
356 break;
357 }
358 }
359
360 [netTrafficController connectionListChanged];
361 }
362
363 - (void)serverDisconnected:(CheatServer *)server
364 {
365 int i, top = [servers count];
366
367 for ( i = 0; i < top; i++ )
368 {
369 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
370 {
371 [servers removeObjectAtIndex:i];
372 break;
373 }
374 }
375
376 [netTrafficController connectionListChanged];
377 }
378
379 - (void)server:(CheatServer *)server changedAddress:(NSString *)address
380 {
381 int i, top = [servers count];
382
383 for ( i = 0; i < top; i++ )
384 {
385 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
386 {
387 [(ServerHolder *)[servers objectAtIndex:i] setAddress:address];
388 break;
389 }
390 }
391
392 [netTrafficController connectionListChanged];
393 }
394
395 - (void)server:(CheatServer *)server changedAction:(NSString *)action
396 {
397 int i, top = [servers count];
398
399 for ( i = 0; i < top; i++ )
400 {
401 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
402 {
403 [(ServerHolder *)[servers objectAtIndex:i] setAction:action];
404 break;
405 }
406 }
407
408 [netTrafficController connectionListChanged];
409 }
410
411 - (NSArray *)serverProcessList
412 {
413 return [[NSWorkspace sharedWorkspace] launchedApplications];
414 }
415
416 - (pid_t)serverFirstProcess
417 {
418 return (pid_t)[[[[[NSWorkspace sharedWorkspace] launchedApplications] objectAtIndex:0] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
419 }
420
421
422 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
423 %%%%%%%%%%%%%%%%%%%%%% NetService Delegate
424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
425
426
427 - (void)netServiceWillPublish:(NSNetService *)sender
428 {
429 NSLog( @"service will publish" );
430 [sender resolve];
431 }
432
433 - (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict
434 {
435 NSLog( @"service did not publish" );
436
437 if ( [[errorDict objectForKey:@"NSNetServicesErrorCode"] intValue] == NSNetServicesCollisionError )
438 {
439 [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", [sender name], TCGlobalAlternateBroadcastNameCount++]];
440 }
441 else
442 {
443 NSRunCriticalAlertPanel( @"Network Error", @"Server couldn't broadcast. Local can't be cheated by remote computers.", @"OK", nil, nil );
444 }
445 }
446
447 - (void)netServiceDidStop:(NSNetService *)sender
448 {
449 NSLog( @"service stopped" );
450 [sender release];
451 }
452
453
454 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
455 %%%%%%%%%%%%%%%%%%%%%% NSNetServiceBrowser Delegate
456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
457
458
459 - (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)aService moreComing:(BOOL)more
460 {
461 // a server has broadcast; not much use until it's resolved.
462 [aService setDelegate:self];
463 [aService resolve];
464 }
465
466 - (void)netServiceDidResolveAddress:(NSNetService *)aService
467 {
468 int i, top = [serverList count];
469
470 // ignore if this is the local server.
471 if ( TCGlobalAllowRemote && [[aService name] isEqualToString:TCGlobalBroadcastName] )
472 {
473 return;
474 }
475
476 // ignore if the server name is already in the list.
477 for ( i = 0; i < top; i++ )
478 {
479 if ( [[aService name] isEqualToString:[(NSNetService *)[serverList objectAtIndex:i] name]] )
480 {
481 return;
482 }
483 }
484
485 [serverList addObject:aService];
486 NSLog( @"server added: %i", [serverList count] );
487
488 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCServerFound" object:aService];
489 }
490
491 - (void)netServiceBrowser:(NSNetServiceBrowser *)browser didRemoveService:(NSNetService *)aService moreComing:(BOOL)more
492 {
493 int i, top = [serverList count];
494
495 for ( i = 0; i < top; i++ )
496 {
497 if ( [[aService name] isEqualToString:[(NSNetService *)[serverList objectAtIndex:i] name]] )
498 {
499 [serverList removeObjectAtIndex:i];
500 NSLog( @"server deleted: %i", [serverList count] );
501 break;
502 }
503 }
504
505 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCServerLost" object:aService];
506 }
507
508
509 @end
This page took 0.052239 seconds and 4 git commands to generate.