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