]> Dogcows Code - chaz/thecheat/blob - CheatClient.m
The Cheat 1.1.1
[chaz/thecheat] / CheatClient.m
1
2 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 // Project: The Cheat
4 //
5 // File: CheatClient.m
6 // Created: Mon Sep 22 2003
7 //
8 // Copyright: 2003 Chaz McGarvey. All rights reserved.
9 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10
11 #import "CheatClient.h"
12
13 #import "MyDocument.h"
14
15
16 @implementation CheatClient
17
18
19 + (NSConnection *)clientWithDelegate:(id)delegate server:(NSData *)server name:(NSString *)name
20 {
21 NSPort *rPort = [NSPort port], *sPort = [NSPort port];
22 NSConnection *connection;
23 NSArray *array;
24
25 connection = [[NSConnection alloc] initWithReceivePort:rPort sendPort:sPort];
26 [connection setRootObject:delegate];
27
28 array = [NSArray arrayWithObjects:sPort, rPort, server, name, nil];
29 [NSThread detachNewThreadSelector:@selector(clientThread:) toTarget:self withObject:array];
30
31 return [connection autorelease];
32 }
33
34 + (void)clientThread:(NSArray *)array
35 {
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]];
39
40 [object connectToServer:[array objectAtIndex:2] name:[array objectAtIndex:3]];
41 [object run];
42
43 [object release];
44 [pool release];
45 }
46
47
48 - (id)initWithRootProxy:(id)proxy
49 {
50 if ( self = [super init] )
51 {
52 rootProxy = proxy;
53 sockfd = -1;
54 }
55
56 return self;
57 }
58
59
60 - (void)connectToServer:(NSData *)data name:(NSString *)name
61 {
62 struct sockaddr identifier;
63
64 [data getBytes:&identifier length:sizeof(identifier)];
65
66 if ( (sockfd = socket( identifier.sa_family, SOCK_STREAM, 0 )) == -1 )
67 {
68 NSLog( @"ERROR: socket() failed" );
69 [rootProxy clientError:@"Network Error" message:@"Attempt to connect to server failed."];
70 return;
71 }
72
73 if ( identifier.sa_family == AF_INET )
74 {
75 struct sockaddr_in addr;
76
77 [data getBytes:&addr];
78
79 if ( connect( sockfd, (struct sockaddr *)(&addr), sizeof(addr) ) == -1 )
80 {
81 close( sockfd );
82
83 NSLog( @"ERROR: connect() failed" );
84 [rootProxy clientError:@"Network Error" message:@"Attempt to connect to server failed."];
85 return;
86 }
87 }
88 else
89 {
90 struct sockaddr_un addr;
91
92 [data getBytes:&addr];
93
94 if ( connect( sockfd, (struct sockaddr *)(&addr), sizeof(addr) ) == -1 )
95 {
96 close( sockfd );
97
98 NSLog( @"ERROR: connect() failed" );
99 [rootProxy clientError:@"Network Error" message:@"Attempt to connect to server failed."];
100 return;
101 }
102 }
103
104 [rootProxy clientConnectedWithSocket:sockfd name:name];
105 }
106
107 - (void)run
108 {
109 int result;
110
111 PacketHeader header;
112
113 NSData *data;
114 char *bytes = NULL;
115
116 if ( sockfd == -1 )
117 {
118 NSLog( @"ERROR: can't run when not connected" );
119 return;
120 }
121
122 NSLog( @"CLIENT start" );
123
124 for (;;)
125 {
126 if ( (result = ReadBuffer( sockfd, (char *)(&header), sizeof(header) )) != sizeof(header) )
127 {
128 if ( result != 0 && result != -1 )
129 {
130 NSLog( @"ERROR: incomplete header received" );
131 close( sockfd );
132 break;
133 }
134
135 break;
136 }
137
138 if ( !VerifyChecksum( header.checksum ) )
139 {
140 NSLog( @"ERROR: checksum verification failed" );
141 close( sockfd );
142 break;
143 }
144
145 //NSLog( @"CLIENT message %i/%i/%i", header.checksum, header.function, header.size );
146
147 if ( header.size != 0 )
148 {
149 if ( (bytes = (char *)malloc( header.size )) == NULL )
150 {
151 NSLog( @"ERROR: failed to allocate buffer for reading a network packet" );
152 close( sockfd );
153 break;
154 }
155
156 if ( (result = ReadBuffer( sockfd, bytes, header.size )) != header.size )
157 {
158 NSLog( @"ERROR: failed to read the data of a network packet; only read %i bytes out of %i", result, header.size );
159 free( bytes );
160 close( sockfd );
161 break;
162 }
163 }
164
165 data = [NSData dataWithBytes:bytes length:header.size];
166
167 switch ( header.function )
168 {
169 case 2:
170 [rootProxy receivedProcessList:data];
171 break;
172
173 case 6:
174 [rootProxy receivedSearchFinished];
175 break;
176
177 case 7:
178 [rootProxy receivedVariableList:data];
179 break;
180
181 case 9:
182 [rootProxy receivedChangeFinished];
183 break;
184
185 case 11:
186 [rootProxy receivedError:data];
187 break;
188
189 case 15:
190 [rootProxy receivedUndoFinished];
191 break;
192
193 case 17:
194 [rootProxy receivedRedoFinished];
195 break;
196
197 case 19:
198 [rootProxy receivedUndoRedoStatus:data];
199 break;
200
201 case 21:
202 [rootProxy receivedAppLaunched:data];
203 break;
204
205 case 22:
206 [rootProxy receivedAppQuit:data];
207 break;
208
209 case 23:
210 [rootProxy receivedTargetQuit];
211 break;
212
213 case 24:
214 [rootProxy receivedPauseFinished:data];
215 break;
216 }
217
218 if ( header.size != 0 )
219 {
220 free( bytes );
221 }
222 }
223
224 [rootProxy clientDisconnected];
225
226 NSLog( @"CLIENT close" );
227 }
228
229
230 @end
This page took 0.036544 seconds and 4 git commands to generate.