3 * The Cheat - The legendary universal game trainer for Mac OS X.
4 * http://www.dogcows.com/chaz/wiki/TheCheat
6 * Copyright (c) 2003-2010, Charles McGarvey et al.
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.
12 #import "ServerChild.h"
15 @interface ServerChild ( PrivateAPI
)
17 - (void)_handlePacket
;
19 - (void)_setClient
:(NSString
*)status
;
24 @implementation ServerChild
27 - (id)initWithSocket
:(MySocket
*)sock
29 return [self initWithSocket
:sock delegate
:nil];
32 - (id)initWithSocket
:(MySocket
*)sock delegate
:(id)delegate
34 if ( self = [super init
] ) {
35 _socket
= [sock retain
];
36 [_socket setDelegate
:self];
39 // create the cheater object
40 _cheater
= [[LocalCheater alloc
] initWithDelegate
:self];
41 [_cheater setShouldCopy
:NO
];
43 // start reading from the socket
44 [_socket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
46 if ( [_delegate respondsToSelector
:@selector(serverChildConnected
:)] ) {
47 [_delegate serverChildConnected
:self];
55 //[_socket setDelegate:[self class]];
56 //[_socket disconnect];
57 [_socket setDelegate
:nil];
61 [_parameters release
];
67 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
68 #pragma mark MySocketDelegate
69 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
71 - (void)socket
:(MySocket
*)mySocket didReadData
:(NSData
*)theData tag
:(int)tag
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];
82 // start reading the next packet
83 [mySocket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
86 else if ( tag
== 1 && [theData length
] == _header.size
) {
87 // got packet parameter data
88 _parameters
= [theData retain
];
90 // start reading the next packet
91 [mySocket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
94 ChazLog( @
"ServerChild - read unexpected data, disconnecting..." );
97 if ( [_delegate respondsToSelector
:@selector(serverChildDisconnected
:)] ) {
98 [_delegate serverChildDisconnected
:self];
103 - (void)socketDidDisconnect
:(MySocket
*)mySocket
108 if ( [_delegate respondsToSelector
:@selector(serverChildDisconnected
:)] ) {
109 [_delegate serverChildDisconnected
:self];
114 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
115 #pragma mark Accessors
116 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
120 return [_socket remoteHost
];
123 - (NSString
*)transfer
125 unsigned bytes
= [_socket bytesRead
] + [_socket bytesWritten
];
126 double speed
= [_socket readSpeed
] + [_socket writeSpeed
];
129 return [NSString stringWithFormat
:@
"%.1fMB (%.1fkbps)", (float)bytes
/1038576.0f
, (float)speed
/1024.0f
];
131 return [NSString stringWithFormat
:@
"%.1fMB", (float)bytes
/1038576.0f
];
140 - (void)setDelegate
:(id)delegate
142 _delegate
= delegate
;
146 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
147 #pragma mark PrivateAPI
148 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
150 - (void)_handlePacket
152 if ( strncmp( "connect", _header.name
, sizeof(_header.name
) ) == 0 ) {
153 ChazLog( @
"ServerChild - connect received!!" );
155 [self _setClient
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
157 else if ( strncmp( "authenticate", _header.name
, sizeof(_header.name
) ) == 0 ) {
158 ChazLog( @
"ServerChild - process list requested" );
159 [_cheater authenticateWithPassword
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
161 else if ( strncmp( "getproclist", _header.name
, sizeof(_header.name
) ) == 0 ) {
162 ChazLog( @
"ServerChild - process list requested" );
163 [_cheater getProcessList
];
165 else if ( strncmp( "settarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
166 [_cheater setTarget
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
168 else if ( strncmp( "pausetarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
169 [_cheater pauseTarget
];
171 else if ( strncmp( "resumetarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
172 [_cheater resumeTarget
];
174 else if ( strncmp( "limitresults", _header.name
, sizeof(_header.name
) ) == 0 ) {
175 [_cheater limitReturnedResults
:[[NSUnarchiver unarchiveObjectWithData
:_parameters
] unsignedIntValue
]];
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
]];
181 else if ( strncmp( "lastsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
182 [_cheater searchLastValuesComparison
:[[NSUnarchiver unarchiveObjectWithData
:_parameters
] unsignedCharValue
]];
184 else if ( strncmp( "cancelsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
185 [_cheater cancelSearch
];
187 else if ( strncmp( "clearsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
188 [_cheater clearSearch
];
190 else if ( strncmp( "dump", _header.name
, sizeof(_header.name
) ) == 0 ) {
191 [_cheater getMemoryDump
];
193 else if ( strncmp( "canceldump", _header.name
, sizeof(_header.name
) ) == 0 ) {
194 [_cheater cancelMemoryDump
];
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
]];
201 else if ( strncmp( "stopchange", _header.name
, sizeof(_header.name
) ) == 0 ) {
202 [_cheater stopChangingVariables
];
204 else if ( strncmp( "undo", _header.name
, sizeof(_header.name
) ) == 0 ) {
207 else if ( strncmp( "redo", _header.name
, sizeof(_header.name
) ) == 0 ) {
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
]];
215 else if ( strncmp( "stopwatch", _header.name
, sizeof(_header.name
) ) == 0 ) {
216 [_cheater stopWatchingVariables
];
219 [_parameters release
];
224 - (void)_setClient
:(NSString
*)client
229 if ( [_delegate respondsToSelector
:@selector(serverChildChanged
:)] ) {
230 [_delegate serverChildChanged
:self];
235 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
236 #pragma mark CheaterDelegate
237 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
240 - (void)cheaterDidConnect
:(Cheater
*)cheater
242 TCPacketHeader header
= { TC_NIFTY
, 0, "connected" };
243 ChazLog( @
"SENT didconnect" );
244 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
247 - (void)cheaterDidDisconnect
:(Cheater
*)cheater
249 // nothing needs to be done
253 - (void)cheaterRequiresAuthentication
:(Cheater
*)cheater
255 TCPacketHeader header
= { TC_NIFTY
, 0, "requireauth" };
256 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
259 - (void)cheaterRejectedPassword
:(Cheater
*)cheater
261 TCPacketHeader header
= { TC_NIFTY
, 0, "rejectedauth" };
262 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
265 - (void)cheaterAcceptedPassword
:(Cheater
*)cheater
267 TCPacketHeader header
= { TC_NIFTY
, 0, "authenticated" };
268 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
272 - (void)cheater
:(Cheater
*)cheater didFindProcesses
:(NSArray
*)processes
274 NSData
*params
= [NSArchiver archivedDataWithRootObject
:processes
];
275 TCPacketHeader header
= { TC_NIFTY
, [params length
], "proclist" };
277 ChazLog( @
"SENT proclist" );
278 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
279 [_socket writeData
:params tag
:0];
283 - (void)cheater
:(Cheater
*)cheater didAddProcess
:(Process
*)process
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];
291 - (void)cheater
:(Cheater
*)cheater didRemoveProcess
:(Process
*)process
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];
300 - (void)cheater
:(Cheater
*)cheater didSetTarget
:(Process
*)target
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];
308 - (void)cheaterPausedTarget
:(Cheater
*)cheater
310 TCPacketHeader header
= { TC_NIFTY
, 0, "didpausetarget" };
311 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
314 - (void)cheaterResumedTarget
:(Cheater
*)cheater
316 TCPacketHeader header
= { TC_NIFTY
, 0, "didresumetarget" };
317 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
321 - (void)cheater
:(Cheater
*)cheater didFindVariables
:(TCArray
)variables actualAmount
:(unsigned)count
324 unsigned actualAmount
;
327 } varInfo
= { count
, TCArrayElementCount(variables
), TCArrayElementSize(variables
) };
328 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
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];
335 TCReleaseArray( variables
);
338 - (void)cheater
:(Cheater
*)cheater didFindValues
:(TCArray
)values
343 } varInfo
= { TCArrayElementCount(values
), TCArrayElementSize(values
) };
344 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
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];
351 TCReleaseArray( values
);
354 - (void)cheaterDidCancelSearch
:(Cheater
*)cheater
356 TCPacketHeader header
= { TC_NIFTY
, 0, "didcancelsearch" };
357 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
360 - (void)cheaterDidClearSearch
:(Cheater
*)cheater
362 TCPacketHeader header
= { TC_NIFTY
, 0, "didclearsearch" };
363 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
367 - (void)cheater
:(Cheater
*)cheater didDumpMemory
:(NSData
*)memoryDump
369 TCPacketHeader header
= { TC_NIFTY
, [memoryDump length
], "memdump" };
370 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
371 [_socket writeData
:memoryDump tag
:0];
374 - (void)cheaterDidCancelMemoryDump
:(Cheater
*)cheater
376 TCPacketHeader header
= { TC_NIFTY
, 0, "didcanceldump" };
377 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
381 - (void)cheater
:(Cheater
*)cheater didChangeVariables
:(unsigned)changeCount
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];
389 - (void)cheaterDidStopChangingVariables
:(Cheater
*)cheater
391 TCPacketHeader header
= { TC_NIFTY
, 0, "didstopchanging" };
392 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
396 - (void)cheater
:(Cheater
*)cheater didReportProgress
:(int)progress
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];
405 - (void)cheater
:(Cheater
*)cheater didRevertToVariables
:(TCArray
)variables actualAmount
:(unsigned)count
408 unsigned actualAmount
;
411 } varInfo
= { count
, TCArrayElementCount(variables
), TCArrayElementSize(variables
) };
412 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
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];
419 TCReleaseArray( variables
);
423 - (void)cheaterDidUndo
:(Cheater
*)cheater
425 TCPacketHeader header
= { TC_NIFTY
, 0, "didundo" };
426 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
429 - (void)cheaterDidRedo
:(Cheater
*)cheater
431 TCPacketHeader header
= { TC_NIFTY
, 0, "didredo" };
432 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
436 - (void)cheater
:(Cheater
*)cheater variableAtIndex
:(unsigned)index didChangeTo
:(Variable
*)variable
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];
445 - (void)cheater
:(Cheater
*)cheater didFailLastRequest
:(NSString
*)reason
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];
453 - (void)cheater
:(Cheater
*)cheater echo
:(NSString
*)message
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];