]> Dogcows Code - chaz/thecheat/blob - ServerChild.m
The Cheat 1.2
[chaz/thecheat] / ServerChild.m
1
2 // **********************************************************************
3 // The Cheat - A universal game cheater for Mac OS X
4 // (C) 2003-2005 Chaz McGarvey (BrokenZipper)
5 //
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 1, or (at your option)
9 // any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 //
20
21 #import "ServerChild.h"
22
23
24 @interface ServerChild ( PrivateAPI )
25
26 - (void)_handlePacket;
27
28 - (void)_setClient:(NSString *)status;
29
30 @end
31
32
33 @implementation ServerChild
34
35
36 - (id)initWithSocket:(MySocket *)sock
37 {
38 return [self initWithSocket:sock delegate:nil];
39 }
40
41 - (id)initWithSocket:(MySocket *)sock delegate:(id)delegate
42 {
43 if ( self = [super init] ) {
44 _socket = [sock retain];
45 [_socket setDelegate:self];
46 _delegate = delegate;
47
48 // create the cheater object
49 _cheater = [[LocalCheater alloc] initWithDelegate:self];
50 [_cheater setShouldCopy:NO];
51
52 // start reading from the socket
53 [_socket readDataToLength:sizeof(TCPacketHeader) tag:0];
54
55 if ( [_delegate respondsToSelector:@selector(serverChildConnected:)] ) {
56 [_delegate serverChildConnected:self];
57 }
58 }
59 return self;
60 }
61
62 - (void)dealloc
63 {
64 //[_socket setDelegate:[self class]];
65 //[_socket disconnect];
66 [_socket setDelegate:nil];
67 [_socket release];
68
69 [_client release];
70 [_parameters release];
71 [_cheater release];
72 [super dealloc];
73 }
74
75
76 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
77 #pragma mark MySocketDelegate
78 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
79
80 - (void)socket:(MySocket *)mySocket didReadData:(NSData *)theData tag:(int)tag
81 {
82 if ( tag == 0 && [theData length] == sizeof(TCPacketHeader) ) {
83 // got a packet header
84 memcpy( &_header, [theData bytes], sizeof(TCPacketHeader) );
85 if ( _header.size > 0 ) {
86 // request the rest of the packet
87 [mySocket readDataToLength:_header.size tag:1];
88 }
89 else {
90 [self _handlePacket];
91 // start reading the next packet
92 [mySocket readDataToLength:sizeof(TCPacketHeader) tag:0];
93 }
94 }
95 else if ( tag == 1 && [theData length] == _header.size ) {
96 // got packet parameter data
97 _parameters = [theData retain];
98 [self _handlePacket];
99 // start reading the next packet
100 [mySocket readDataToLength:sizeof(TCPacketHeader) tag:0];
101 }
102 else {
103 ChazLog( @"ServerChild - read unexpected data, disconnecting..." );
104 [_socket release];
105 _socket = nil;
106 if ( [_delegate respondsToSelector:@selector(serverChildDisconnected:)] ) {
107 [_delegate serverChildDisconnected:self];
108 }
109 }
110 }
111
112 - (void)socketDidDisconnect:(MySocket *)mySocket
113 {
114 [_socket release];
115 _socket = nil;
116
117 if ( [_delegate respondsToSelector:@selector(serverChildDisconnected:)] ) {
118 [_delegate serverChildDisconnected:self];
119 }
120 }
121
122
123 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
124 #pragma mark Accessors
125 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
126
127 - (NSString *)host
128 {
129 return [_socket remoteHost];
130 }
131
132 - (NSString *)transfer
133 {
134 unsigned bytes = [_socket bytesRead] + [_socket bytesWritten];
135 double speed = [_socket readSpeed] + [_socket writeSpeed];
136
137 if ( speed > 0.0 ) {
138 return [NSString stringWithFormat:@"%.1fMB (%.1fkbps)", (float)bytes/1038576.0f, (float)speed/1024.0f];
139 }
140 return [NSString stringWithFormat:@"%.1fMB", (float)bytes/1038576.0f];
141 }
142
143
144 - (id)delegate
145 {
146 return _delegate;
147 }
148
149 - (void)setDelegate:(id)delegate
150 {
151 _delegate = delegate;
152 }
153
154
155 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
156 #pragma mark PrivateAPI
157 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
158
159 - (void)_handlePacket
160 {
161 if ( strncmp( "connect", _header.name, sizeof(_header.name) ) == 0 ) {
162 ChazLog( @"ServerChild - connect received!!" );
163 [_cheater connect];
164 [self _setClient:[NSUnarchiver unarchiveObjectWithData:_parameters]];
165 }
166 else if ( strncmp( "authenticate", _header.name, sizeof(_header.name) ) == 0 ) {
167 ChazLog( @"ServerChild - process list requested" );
168 [_cheater authenticateWithPassword:[NSUnarchiver unarchiveObjectWithData:_parameters]];
169 }
170 else if ( strncmp( "getproclist", _header.name, sizeof(_header.name) ) == 0 ) {
171 ChazLog( @"ServerChild - process list requested" );
172 [_cheater getProcessList];
173 }
174 else if ( strncmp( "settarget", _header.name, sizeof(_header.name) ) == 0 ) {
175 [_cheater setTarget:[NSUnarchiver unarchiveObjectWithData:_parameters]];
176 }
177 else if ( strncmp( "pausetarget", _header.name, sizeof(_header.name) ) == 0 ) {
178 [_cheater pauseTarget];
179 }
180 else if ( strncmp( "resumetarget", _header.name, sizeof(_header.name) ) == 0 ) {
181 [_cheater resumeTarget];
182 }
183 else if ( strncmp( "limitresults", _header.name, sizeof(_header.name) ) == 0 ) {
184 [_cheater limitReturnedResults:[[NSUnarchiver unarchiveObjectWithData:_parameters] unsignedIntValue]];
185 }
186 else if ( strncmp( "search", _header.name, sizeof(_header.name) ) == 0 ) {
187 NSArray *params = [NSUnarchiver unarchiveObjectWithData:_parameters];
188 [_cheater searchForVariable:[params objectAtIndex:0] comparison:[[params objectAtIndex:1] unsignedCharValue]];
189 }
190 else if ( strncmp( "lastsearch", _header.name, sizeof(_header.name) ) == 0 ) {
191 [_cheater searchLastValuesComparison:[[NSUnarchiver unarchiveObjectWithData:_parameters] unsignedCharValue]];
192 }
193 else if ( strncmp( "cancelsearch", _header.name, sizeof(_header.name) ) == 0 ) {
194 [_cheater cancelSearch];
195 }
196 else if ( strncmp( "clearsearch", _header.name, sizeof(_header.name) ) == 0 ) {
197 [_cheater clearSearch];
198 }
199 else if ( strncmp( "dump", _header.name, sizeof(_header.name) ) == 0 ) {
200 [_cheater getMemoryDump];
201 }
202 else if ( strncmp( "canceldump", _header.name, sizeof(_header.name) ) == 0 ) {
203 [_cheater cancelMemoryDump];
204 }
205 else if ( strncmp( "changevars", _header.name, sizeof(_header.name) ) == 0 ) {
206 NSArray *params = [NSUnarchiver unarchiveObjectWithData:_parameters];
207 [_cheater makeVariableChanges:[params objectAtIndex:0] repeat:[[params objectAtIndex:1] boolValue]
208 interval:[[params objectAtIndex:2] doubleValue]];
209 }
210 else if ( strncmp( "stopchange", _header.name, sizeof(_header.name) ) == 0 ) {
211 [_cheater stopChangingVariables];
212 }
213 else if ( strncmp( "undo", _header.name, sizeof(_header.name) ) == 0 ) {
214 [_cheater undo];
215 }
216 else if ( strncmp( "redo", _header.name, sizeof(_header.name) ) == 0 ) {
217 [_cheater redo];
218 }
219 else if ( strncmp( "watchvars", _header.name, sizeof(_header.name) ) == 0 ) {
220 NSArray *params = [NSUnarchiver unarchiveObjectWithData:_parameters];
221 [_cheater watchVariablesAtIndex:[[params objectAtIndex:0] unsignedIntValue] count:[[params objectAtIndex:1] unsignedIntValue]
222 interval:[[params objectAtIndex:2] doubleValue]];
223 }
224 else if ( strncmp( "stopwatch", _header.name, sizeof(_header.name) ) == 0 ) {
225 [_cheater stopWatchingVariables];
226 }
227
228 [_parameters release];
229 _parameters = nil;
230 }
231
232
233 - (void)_setClient:(NSString *)client
234 {
235 [client retain];
236 [_client release];
237 _client = client;
238 if ( [_delegate respondsToSelector:@selector(serverChildChanged:)] ) {
239 [_delegate serverChildChanged:self];
240 }
241 }
242
243
244 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
245 #pragma mark CheaterDelegate
246 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
247
248
249 - (void)cheaterDidConnect:(Cheater *)cheater
250 {
251 TCPacketHeader header = { TC_NIFTY, 0, "connected" };
252 ChazLog( @"SENT didconnect" );
253 [_socket writeBytes:&header length:sizeof(header) tag:0];
254 }
255
256 - (void)cheaterDidDisconnect:(Cheater *)cheater
257 {
258 // nothing needs to be done
259 }
260
261
262 - (void)cheaterRequiresAuthentication:(Cheater *)cheater
263 {
264 TCPacketHeader header = { TC_NIFTY, 0, "requireauth" };
265 [_socket writeBytes:&header length:sizeof(header) tag:0];
266 }
267
268 - (void)cheaterRejectedPassword:(Cheater *)cheater
269 {
270 TCPacketHeader header = { TC_NIFTY, 0, "rejectedauth" };
271 [_socket writeBytes:&header length:sizeof(header) tag:0];
272 }
273
274 - (void)cheaterAcceptedPassword:(Cheater *)cheater
275 {
276 TCPacketHeader header = { TC_NIFTY, 0, "authenticated" };
277 [_socket writeBytes:&header length:sizeof(header) tag:0];
278 }
279
280
281 - (void)cheater:(Cheater *)cheater didFindProcesses:(NSArray *)processes
282 {
283 NSData *params = [NSArchiver archivedDataWithRootObject:processes];
284 TCPacketHeader header = { TC_NIFTY, [params length], "proclist" };
285
286 ChazLog( @"SENT proclist" );
287 [_socket writeBytes:&header length:sizeof(header) tag:0];
288 [_socket writeData:params tag:0];
289
290 }
291
292 - (void)cheater:(Cheater *)cheater didAddProcess:(Process *)process
293 {
294 NSData *params = [NSArchiver archivedDataWithRootObject:process];
295 TCPacketHeader header = { TC_NIFTY, [params length], "addprocess" };
296 [_socket writeBytes:&header length:sizeof(header) tag:0];
297 [_socket writeData:params tag:0];
298 }
299
300 - (void)cheater:(Cheater *)cheater didRemoveProcess:(Process *)process
301 {
302 NSData *params = [NSArchiver archivedDataWithRootObject:process];
303 TCPacketHeader header = { TC_NIFTY, [params length], "removeprocess" };
304 [_socket writeBytes:&header length:sizeof(header) tag:0];
305 [_socket writeData:params tag:0];
306 }
307
308
309 - (void)cheater:(Cheater *)cheater didSetTarget:(Process *)target
310 {
311 NSData *params = [NSArchiver archivedDataWithRootObject:target];
312 TCPacketHeader header = { TC_NIFTY, [params length], "didsettarget" };
313 [_socket writeBytes:&header length:sizeof(header) tag:0];
314 [_socket writeData:params tag:0];
315 }
316
317 - (void)cheaterPausedTarget:(Cheater *)cheater
318 {
319 TCPacketHeader header = { TC_NIFTY, 0, "didpausetarget" };
320 [_socket writeBytes:&header length:sizeof(header) tag:0];
321 }
322
323 - (void)cheaterResumedTarget:(Cheater *)cheater
324 {
325 TCPacketHeader header = { TC_NIFTY, 0, "didresumetarget" };
326 [_socket writeBytes:&header length:sizeof(header) tag:0];
327 }
328
329
330 - (void)cheater:(Cheater *)cheater didFindVariables:(TCArray)variables actualAmount:(unsigned)count
331 {
332 struct {
333 unsigned actualAmount;
334 unsigned varCount;
335 unsigned varSize;
336 } varInfo = { count, TCArrayElementCount(variables), TCArrayElementSize(variables) };
337 unsigned bufferLen = varInfo.varCount * varInfo.varSize;
338
339 TCPacketHeader header = { TC_NIFTY, sizeof(varInfo) + bufferLen, "vars" };
340 [_socket writeBytes:&header length:sizeof(header) tag:0];
341 [_socket writeBytes:&varInfo length:sizeof(varInfo) tag:0];
342 [_socket writeBytes:TCArrayBytes(variables) length:bufferLen tag:0];
343
344 TCReleaseArray( variables );
345 }
346
347 - (void)cheater:(Cheater *)cheater didFindValues:(TCArray)values
348 {
349 struct {
350 unsigned varCount;
351 unsigned varSize;
352 } varInfo = { TCArrayElementCount(values), TCArrayElementSize(values) };
353 unsigned bufferLen = varInfo.varCount * varInfo.varSize;
354
355 TCPacketHeader header = { TC_NIFTY, sizeof(varInfo) + bufferLen, "values" };
356 [_socket writeBytes:&header length:sizeof(header) tag:0];
357 [_socket writeBytes:&varInfo length:sizeof(varInfo) tag:0];
358 [_socket writeBytes:TCArrayBytes(values) length:bufferLen tag:0];
359
360 TCReleaseArray( values );
361 }
362
363 - (void)cheaterDidCancelSearch:(Cheater *)cheater
364 {
365 TCPacketHeader header = { TC_NIFTY, 0, "didcancelsearch" };
366 [_socket writeBytes:&header length:sizeof(header) tag:0];
367 }
368
369 - (void)cheaterDidClearSearch:(Cheater *)cheater
370 {
371 TCPacketHeader header = { TC_NIFTY, 0, "didclearsearch" };
372 [_socket writeBytes:&header length:sizeof(header) tag:0];
373 }
374
375
376 - (void)cheater:(Cheater *)cheater didDumpMemory:(NSData *)memoryDump
377 {
378 TCPacketHeader header = { TC_NIFTY, [memoryDump length], "memdump" };
379 [_socket writeBytes:&header length:sizeof(header) tag:0];
380 [_socket writeData:memoryDump tag:0];
381 }
382
383 - (void)cheaterDidCancelMemoryDump:(Cheater *)cheater
384 {
385 TCPacketHeader header = { TC_NIFTY, 0, "didcanceldump" };
386 [_socket writeBytes:&header length:sizeof(header) tag:0];
387 }
388
389
390 - (void)cheater:(Cheater *)cheater didChangeVariables:(unsigned)changeCount
391 {
392 NSData *params = [NSArchiver archivedDataWithRootObject:[NSNumber numberWithUnsignedInt:changeCount]];
393 TCPacketHeader header = { TC_NIFTY, [params length], "changedvars" };
394 [_socket writeBytes:&header length:sizeof(header) tag:0];
395 [_socket writeData:params tag:0];
396 }
397
398 - (void)cheaterDidStopChangingVariables:(Cheater *)cheater
399 {
400 TCPacketHeader header = { TC_NIFTY, 0, "didstopchanging" };
401 [_socket writeBytes:&header length:sizeof(header) tag:0];
402 }
403
404
405 - (void)cheater:(Cheater *)cheater didReportProgress:(int)progress
406 {
407 NSData *params = [NSArchiver archivedDataWithRootObject:[NSNumber numberWithInt:progress]];
408 TCPacketHeader header = { TC_NIFTY, [params length], "progress" };
409 [_socket writeBytes:&header length:sizeof(header) tag:0];
410 [_socket writeData:params tag:0];
411 }
412
413
414 - (void)cheater:(Cheater *)cheater didRevertToVariables:(TCArray)variables actualAmount:(unsigned)count
415 {
416 struct {
417 unsigned actualAmount;
418 unsigned varCount;
419 unsigned varSize;
420 } varInfo = { count, TCArrayElementCount(variables), TCArrayElementSize(variables) };
421 unsigned bufferLen = varInfo.varCount * varInfo.varSize;
422
423 TCPacketHeader header = { TC_NIFTY, sizeof(varInfo) + bufferLen, "revertedto" };
424 [_socket writeBytes:&header length:sizeof(header) tag:0];
425 [_socket writeBytes:&varInfo length:sizeof(varInfo) tag:0];
426 [_socket writeBytes:TCArrayBytes(variables) length:bufferLen tag:0];
427
428 TCReleaseArray( variables );
429 }
430
431
432 - (void)cheaterDidUndo:(Cheater *)cheater
433 {
434 TCPacketHeader header = { TC_NIFTY, 0, "didundo" };
435 [_socket writeBytes:&header length:sizeof(header) tag:0];
436 }
437
438 - (void)cheaterDidRedo:(Cheater *)cheater
439 {
440 TCPacketHeader header = { TC_NIFTY, 0, "didredo" };
441 [_socket writeBytes:&header length:sizeof(header) tag:0];
442 }
443
444
445 - (void)cheater:(Cheater *)cheater variableAtIndex:(unsigned)index didChangeTo:(Variable *)variable
446 {
447 NSData *params = [NSArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:[NSNumber numberWithUnsignedInt:index], variable, nil]];
448 TCPacketHeader header = { TC_NIFTY, [params length], "varchanged" };
449 [_socket writeBytes:&header length:sizeof(header) tag:0];
450 [_socket writeData:params tag:0];
451 }
452
453
454 - (void)cheater:(Cheater *)cheater didFailLastRequest:(NSString *)reason
455 {
456 NSData *params = [NSArchiver archivedDataWithRootObject:reason];
457 TCPacketHeader header = { TC_NIFTY, [params length], "failed" };
458 [_socket writeBytes:&header length:sizeof(header) tag:0];
459 [_socket writeData:params tag:0];
460 }
461
462 - (void)cheater:(Cheater *)cheater echo:(NSString *)message
463 {
464 NSData *params = [NSArchiver archivedDataWithRootObject:message];
465 TCPacketHeader header = { TC_NIFTY, [params length], "echo" };
466 [_socket writeBytes:&header length:sizeof(header) tag:0];
467 [_socket writeData:params tag:0];
468 }
469
470
471 @end
This page took 0.060307 seconds and 5 git commands to generate.