2 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 // Created: Mon Sep 22 2003
8 // Copyright: 2003 Chaz McGarvey. All rights reserved.
9 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 #import "CheatClient.h"
13 #import "MyDocument.h"
16 @implementation CheatClient
19 + (NSConnection
*)clientWithDelegate
:(id)delegate server
:(NSData
*)server name
:(NSString
*)name
21 NSPort
*rPort
= [NSPort port
], *sPort
= [NSPort port
];
22 NSConnection
*connection
;
25 connection
= [[NSConnection alloc
] initWithReceivePort
:rPort sendPort
:sPort
];
26 [connection setRootObject
:delegate
];
28 array
= [NSArray arrayWithObjects
:sPort
, rPort
, server
, name
, nil];
29 [NSThread detachNewThreadSelector
:@selector(clientThread
:) toTarget
:self withObject
:array
];
31 return [connection autorelease
];
34 + (void)clientThread
:(NSArray
*)array
36 NSAutoreleasePool
*pool
= [[NSAutoreleasePool alloc
] init
];
37 NSConnection
*connection
= [NSConnection connectionWithReceivePort
:[array objectAtIndex
:0] sendPort
:[array objectAtIndex
:1]];
38 CheatClient
*object
= [[self alloc
] initWithRootProxy
:[connection rootProxy
]];
40 [object connectToServer
:[array objectAtIndex
:2] name
:[array objectAtIndex
:3]];
48 - (id)initWithRootProxy
:(id)proxy
50 if ( self = [super init
] )
60 - (void)connectToServer
:(NSData
*)data name
:(NSString
*)name
62 struct sockaddr identifier
;
64 [data getBytes
:&identifier length
:sizeof(identifier
)];
66 if ( (sockfd
= socket( identifier.sa_family
, SOCK_STREAM
, 0 )) == -1 )
68 NSLog( @
"ERROR: socket() failed" );
69 [rootProxy clientError
:@
"Network Error" message
:@
"Attempt to connect to server failed."];
73 if ( identifier.sa_family
== AF_INET
)
75 struct sockaddr_in addr
;
77 [data getBytes
:&addr
];
79 if ( connect( sockfd
, (struct sockaddr
*)(&addr
), sizeof(addr
) ) == -1 )
83 NSLog( @
"ERROR: connect() failed" );
84 [rootProxy clientError
:@
"Network Error" message
:@
"Attempt to connect to server failed."];
90 struct sockaddr_un addr
;
92 [data getBytes
:&addr
];
94 if ( connect( sockfd
, (struct sockaddr
*)(&addr
), sizeof(addr
) ) == -1 )
98 NSLog( @
"ERROR: connect() failed" );
99 [rootProxy clientError
:@
"Network Error" message
:@
"Attempt to connect to server failed."];
104 [rootProxy clientConnectedWithSocket
:sockfd name
:name
];
118 NSLog( @
"ERROR: can't run when not connected" );
122 NSLog( @
"CLIENT start" );
126 if ( (result
= ReadBuffer( sockfd
, (char *)(&header
), sizeof(header
) )) != sizeof(header
) )
128 if ( result
!= 0 && result
!= -1 )
130 NSLog( @
"ERROR: incomplete header received" );
138 if ( !VerifyChecksum( header.checksum
) )
140 NSLog( @
"ERROR: checksum verification failed" );
145 //NSLog( @"CLIENT message %i/%i/%i", header.checksum, header.function, header.size );
147 if ( header.size
!= 0 )
149 if ( (bytes
= (char *)malloc( header.size
)) == NULL
)
151 NSLog( @
"ERROR: failed to allocate buffer for reading a network packet" );
156 if ( (result
= ReadBuffer( sockfd
, bytes
, header.size
)) != header.size
)
158 NSLog( @
"ERROR: failed to read the data of a network packet; only read %i bytes out of %i", result
, header.size
);
165 data
= [NSData dataWithBytes
:bytes length
:header.size
];
167 switch ( header.function
)
170 [rootProxy receivedProcessList
:data
];
174 [rootProxy receivedSearchFinished
];
178 [rootProxy receivedVariableList
:data
];
182 [rootProxy receivedChangeFinished
];
186 [rootProxy receivedError
:data
];
190 [rootProxy receivedUndoFinished
];
194 [rootProxy receivedRedoFinished
];
198 [rootProxy receivedUndoRedoStatus
:data
];
202 [rootProxy receivedAppLaunched
:data
];
206 [rootProxy receivedAppQuit
:data
];
210 [rootProxy receivedTargetQuit
];
214 [rootProxy receivedPauseFinished
:data
];
218 if ( header.size
!= 0 )
224 [rootProxy clientDisconnected
];
226 NSLog( @
"CLIENT close" );