]> Dogcows Code - chaz/thecheat/blob - AppController.m
The Cheat 1.0b3
[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 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willQuit:) name:@"NSApplicationWillTerminateNotification" object:nil];
58
59 [self listenOnPort:TCGlobalListenPort remote:TCGlobalAllowRemote];
60 [self broadcastWithName:TCGlobalBroadcastName];
61 }
62
63 return self;
64 }
65
66
67 - (void)listenOnPort:(int)port remote:(BOOL)remote
68 {
69 if ( connection )
70 {
71 [self stopListener];
72
73 waitingToListen = YES;
74 connectionPort = port;
75 connectionRemote = remote;
76 }
77 else
78 {
79 connection = [[CheatListener listenerWithDelegate:self port:port remote:remote] retain];
80 connectionPort = port;
81 connectionRemote = remote;
82 }
83 }
84
85 - (void)stopListener
86 {
87 if ( connection )
88 {
89 close( sockfd );
90 [connection release], connection = nil;
91 }
92 }
93
94
95 - (void)broadcastWithName:(NSString *)name
96 {
97 if ( TCGlobalAllowRemote )
98 {
99 [self stopBroadcast];
100
101 service = [[NSNetService alloc] initWithDomain:@"local." type:@"_cheat._tcp." name:name port:TCGlobalListenPort];
102 [service setDelegate:self];
103 [service publish];
104 }
105 }
106
107 - (void)stopBroadcast
108 {
109 oldService = service;
110 [oldService stop], service = nil;
111 }
112
113
114 - (IBAction)showAboutBoxWindow:(id)sender
115 {
116 if ( !aboutBoxController )
117 {
118 aboutBoxController = [[AboutBoxController alloc] init];
119 }
120
121 [aboutBoxController showWindow:self];
122 }
123
124 - (IBAction)showPreferenceWindow:(id)sender
125 {
126 if ( !preferenceController )
127 {
128 preferenceController = [[PreferenceController alloc] initWithDelegate:self];
129 }
130
131 [preferenceController showWindow:self];
132 }
133
134 - (IBAction)showNetTrafficWindow:(id)sender
135 {
136 if ( !netTrafficController )
137 {
138 netTrafficController = [[NetTrafficController alloc] initWithDelegate:self];
139 }
140
141 [netTrafficController showWindow:self];
142 }
143
144
145 - (IBAction)launchHelpFile:(id)sender
146 {
147 //[[NSWorkspace sharedWorkspace] openFile:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"html"] withApplication:@"Safari"];
148 [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Read Me" ofType:@"pdf"]]];
149 }
150
151 - (IBAction)launchWebsiteMenu:(id)sender
152 {
153 LaunchWebsite();
154 }
155
156 - (IBAction)launchDebugEmailMenu:(id)sender
157 {
158 [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"mailto:thecheat@brokenzipper.com"]];
159 }
160
161
162 - (void)dealloc
163 {
164 [[NSNotificationCenter defaultCenter] removeObserver:self];
165
166 [self stopListener];
167 [self stopBroadcast];
168
169 [servers release];
170
171 [super dealloc];
172 }
173
174
175 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
176 %%%%%%%%%%%%%%%%%%%%%% PreferenceControlling
177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
178
179
180 - (void)preferenceAllowRemoteChanged:(BOOL)allow
181 {
182 [self listenOnPort:TCGlobalListenPort remote:allow];
183
184 if ( allow )
185 {
186 [self broadcastWithName:TCGlobalBroadcastName];
187 }
188 else
189 {
190 [self stopBroadcast];
191 }
192
193 [netTrafficController allowRemoteChanged:allow];
194 }
195
196 - (void)preferenceListenPortChanged:(int)port
197 {
198 [self listenOnPort:port remote:TCGlobalAllowRemote];
199 [self broadcastWithName:TCGlobalBroadcastName];
200
201 [netTrafficController listenPortChanged:port];
202 }
203
204 - (void)preferenceBroadcastNameChanged:(NSString *)name
205 {
206 [self broadcastWithName:name];
207
208 [netTrafficController broadcastNameChanged:name];
209 }
210
211
212 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
213 %%%%%%%%%%%%%%%%%%%%%% NetTrafficControlling
214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
215
216
217 - (int)netTrafficConnectionCount
218 {
219 return [servers count];
220 }
221
222 - (NSArray *)netTrafficConnectionList
223 {
224 return servers;
225 }
226
227 - (void)netTrafficKillConnection:(int)index
228 {
229 NSLog( @"kill connection" );
230
231 close( [[servers objectAtIndex:index] sockfd] );
232 }
233
234
235 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
236 %%%%%%%%%%%%%%%%%%%%%% ListenerDelegate
237 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
238
239
240 - (void)listenerListeningWithSocket:(int)sock
241 {
242 sockfd = sock;
243
244 TCGlobalListening = YES;
245 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStarted" object:nil];
246 }
247
248 - (void)listenerDisconnected
249 {
250 if ( waitingToListen )
251 {
252 waitingToListen = NO;
253 connection = [[CheatListener listenerWithDelegate:self port:connectionPort remote:connectionRemote] retain];
254 }
255 else
256 {
257 [self stopListener];
258 }
259
260 TCGlobalListening = NO;
261 [[NSNotificationCenter defaultCenter] postNotificationName:@"TCListenerStopped" object:nil];
262 }
263
264 - (void)listenerError:(NSString *)error message:(NSString *)message
265 {
266 NSRunCriticalAlertPanel( error, message, @"OK", nil, nil );
267 }
268
269 - (void)listenerReceivedNewConnection:(int)sock
270 {
271 [servers addObject:[ServerHolder holderWithConnection:[CheatServer serverWithDelegate:self socket:sock] socket:sock]];
272 }
273
274
275 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276 %%%%%%%%%%%%%%%%%%%%%% ServerDelegate
277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
278
279
280 - (void)server:(CheatServer *)server connectedWithSocket:(int)sock
281 {
282 int i, top = [servers count];
283
284 for ( i = 0; i < top; i++ )
285 {
286 if ( [(ServerHolder *)[servers objectAtIndex:i] sockfd] == sock )
287 {
288 [(ServerHolder *)[servers objectAtIndex:i] setServer:server];
289 break;
290 }
291 }
292
293 [netTrafficController connectionListChanged];
294 }
295
296 - (void)serverDisconnected:(CheatServer *)server
297 {
298 int i, top = [servers count];
299
300 for ( i = 0; i < top; i++ )
301 {
302 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
303 {
304 [servers removeObjectAtIndex:i];
305 break;
306 }
307 }
308
309 [netTrafficController connectionListChanged];
310 }
311
312 - (void)server:(CheatServer *)server changedAddress:(NSString *)address
313 {
314 int i, top = [servers count];
315
316 for ( i = 0; i < top; i++ )
317 {
318 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
319 {
320 [(ServerHolder *)[servers objectAtIndex:i] setAddress:address];
321 break;
322 }
323 }
324
325 [netTrafficController connectionListChanged];
326 }
327
328 - (void)server:(CheatServer *)server changedAction:(NSString *)action
329 {
330 int i, top = [servers count];
331
332 for ( i = 0; i < top; i++ )
333 {
334 if ( [(ServerHolder *)[servers objectAtIndex:i] server] == server )
335 {
336 [(ServerHolder *)[servers objectAtIndex:i] setAction:action];
337 break;
338 }
339 }
340
341 [netTrafficController connectionListChanged];
342 }
343
344 - (NSArray *)serverProcessList
345 {
346 return [[NSWorkspace sharedWorkspace] launchedApplications];
347 }
348
349 - (pid_t)serverFirstProcess
350 {
351 return (pid_t)[[[[[NSWorkspace sharedWorkspace] launchedApplications] objectAtIndex:0] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
352 }
353
354
355 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356 %%%%%%%%%%%%%%%%%%%%%% NetService Delegate
357 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
358
359
360 - (void)netServiceWillPublish:(NSNetService *)sender
361 {
362 NSLog( @"service will publish" );
363 [sender resolve];
364 }
365
366 - (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict
367 {
368 NSLog( @"service did not publish" );
369
370 if ( [[errorDict objectForKey:@"NSNetServicesErrorCode"] intValue] == NSNetServicesCollisionError )
371 {
372 [self broadcastWithName:[NSString stringWithFormat:@"%@ %i", TCGlobalBroadcastName, TCGlobalAlternateBroadcastNameCount++]];
373 }
374 else
375 {
376 NSRunCriticalAlertPanel( @"Network Error", @"Server couldn't broadcast. Local can't be cheated by remote computers.", @"OK", nil, nil );
377 }
378 }
379
380 - (void)netServiceDidStop:(NSNetService *)sender
381 {
382 NSLog( @"service stopped" );
383 [oldService release], oldService = nil;
384 }
385
386
387 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388 %%%%%%%%%%%%%%%%%%%%%% NSApplication Notification
389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
390
391
392 - (void)willQuit:(NSNotification *)note
393 {
394 //[self listenPortTextField:self];
395 //[self broadcastNameTextField:self];
396 }
397
398
399 @end
This page took 0.045916 seconds and 5 git commands to generate.