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