branch | qmlfrontend |
changeset 10931 | 384765cd0caf |
parent 10929 | 8ebf01f75d9f |
child 10933 | f1da4126a61c |
10929:8ebf01f75d9f | 10931:384765cd0caf |
---|---|
6 procedure initModule; |
6 procedure initModule; |
7 procedure freeModule; |
7 procedure freeModule; |
8 |
8 |
9 implementation |
9 implementation |
10 uses SDLh; |
10 uses SDLh; |
11 |
|
12 const endCmd: array[0..1] of char = (#10, #10); |
|
13 |
|
14 function getNextChar: char; forward; |
|
15 function getCurrChar: char; forward; |
|
16 procedure sendNet(s: shortstring); forward; |
|
17 |
|
11 type TCmdType = (cmd_ASKPASSWORD, cmd_BANLIST, cmd_BYE, cmd_CHAT, cmd_CLIENT_FLAGS, cmd_CONNECTED, cmd_EM, cmd_HH_NUM, cmd_INFO, cmd_JOINED, cmd_JOINING, cmd_KICKED, cmd_LEFT, cmd_LOBBY_JOINED, cmd_LOBBY_LEFT, cmd_NICK, cmd_NOTICE, cmd_PING, cmd_PROTO, cmd_ROOMS, cmd_ROUND_FINISHED, cmd_RUN_GAME, cmd_SERVER_AUTH, cmd_SERVER_MESSAGE, cmd_SERVER_VARS, cmd_TEAM_ACCEPTED, cmd_TEAM_COLOR, cmd_WARNING, cmd___UNKNOWN__); |
18 type TCmdType = (cmd_ASKPASSWORD, cmd_BANLIST, cmd_BYE, cmd_CHAT, cmd_CLIENT_FLAGS, cmd_CONNECTED, cmd_EM, cmd_HH_NUM, cmd_INFO, cmd_JOINED, cmd_JOINING, cmd_KICKED, cmd_LEFT, cmd_LOBBY_JOINED, cmd_LOBBY_LEFT, cmd_NICK, cmd_NOTICE, cmd_PING, cmd_PROTO, cmd_ROOMS, cmd_ROUND_FINISHED, cmd_RUN_GAME, cmd_SERVER_AUTH, cmd_SERVER_MESSAGE, cmd_SERVER_VARS, cmd_TEAM_ACCEPTED, cmd_TEAM_COLOR, cmd_WARNING, cmd___UNKNOWN__); |
12 |
19 |
13 type |
20 type |
14 TNetState = (netDisconnected, netLoggedIn); |
21 TNetState = (netDisconnected, netConnecting, netLoggedIn); |
15 TParserState = record |
22 TParserState = record |
16 cmd: TCmdType; |
23 cmd: TCmdType; |
17 l: LongInt; |
24 l: LongInt; |
18 netState: TNetState; |
25 netState: TNetState; |
26 buf: shortstring; |
|
27 bufpos: byte; |
|
19 end; |
28 end; |
20 PHandler = procedure; |
29 PHandler = procedure; |
21 |
30 |
22 var state: TParserState; |
31 var state: TParserState; |
23 |
32 |
24 // generated stuff here |
33 // generated stuff here |
25 const letters: array[0..235] of char = ('A', 'S', 'K', 'P', 'A', 'S', 'S', 'W', 'O', 'R', 'D', #10, #0, 'B', 'A', 'N', 'L', 'I', 'S', 'T', #10, #0, 'Y', 'E', #10, #0, 'C', 'H', 'A', 'T', #10, #0, 'L', 'I', 'E', 'N', 'T', '_', 'F', 'L', 'A', 'G', 'S', #10, #0, 'O', 'N', 'N', 'E', 'C', 'T', 'E', 'D', #10, #0, 'E', 'M', #10, #0, 'H', 'H', '_', 'N', 'U', 'M', #10, #0, 'I', 'N', 'F', 'O', #10, #0, 'J', 'O', 'I', 'N', 'E', 'D', #10, #0, 'I', 'N', 'G', #10, #0, 'K', 'I', 'C', 'K', 'E', 'D', #10, #0, 'L', 'E', 'F', 'T', #10, #0, 'O', 'B', 'B', 'Y', ':', 'J', 'O', 'I', 'N', 'E', 'D', #10, #0, 'L', 'E', 'F', 'T', #10, #0, 'N', 'I', 'C', 'K', #10, #0, 'O', 'T', 'I', 'C', 'E', #10, #0, 'P', 'I', 'N', 'G', #10, #0, 'R', 'O', 'T', 'O', #10, #0, 'R', 'O', 'O', 'M', 'S', #10, #0, 'U', 'N', 'D', '_', 'F', 'I', 'N', 'I', 'S', 'H', 'E', 'D', #10, #0, 'U', 'N', '_', 'G', 'A', 'M', 'E', #10, #0, 'S', 'E', 'R', 'V', 'E', 'R', '_', 'A', 'U', 'T', 'H', #10, #0, 'M', 'E', 'S', 'S', 'A', 'G', 'E', #10, #0, 'V', 'A', 'R', 'S', #10, #0, 'T', 'E', 'A', 'M', '_', 'A', 'C', 'C', 'E', 'P', 'T', 'E', 'D', #10, #0, 'C', 'O', 'L', 'O', 'R', #10, #0, 'W', 'A', 'R', 'N', 'I', 'N', 'G', #10, #0, '$', #10, #0); |
34 const letters: array[0..206] of char = ('A', 'S', 'K', 'P', 'A', 'S', 'S', 'W', 'O', 'R', 'D', #10, 'B', 'A', 'N', 'L', 'I', 'S', 'T', #10, 'Y', 'E', #10, 'C', 'H', 'A', 'T', #10, 'L', 'I', 'E', 'N', 'T', '_', 'F', 'L', 'A', 'G', 'S', #10, 'O', 'N', 'N', 'E', 'C', 'T', 'E', 'D', #10, 'E', 'M', #10, 'H', 'H', '_', 'N', 'U', 'M', #10, 'I', 'N', 'F', 'O', #10, 'J', 'O', 'I', 'N', 'E', 'D', #10, 'I', 'N', 'G', #10, 'K', 'I', 'C', 'K', 'E', 'D', #10, 'L', 'E', 'F', 'T', #10, 'O', 'B', 'B', 'Y', ':', 'J', 'O', 'I', 'N', 'E', 'D', #10, 'L', 'E', 'F', 'T', #10, 'N', 'I', 'C', 'K', #10, 'O', 'T', 'I', 'C', 'E', #10, 'P', 'I', 'N', 'G', #10, 'R', 'O', 'T', 'O', #10, 'R', 'O', 'O', 'M', 'S', #10, 'U', 'N', 'D', '_', 'F', 'I', 'N', 'I', 'S', 'H', 'E', 'D', #10, 'U', 'N', '_', 'G', 'A', 'M', 'E', #10, 'S', 'E', 'R', 'V', 'E', 'R', '_', 'A', 'U', 'T', 'H', #10, 'M', 'E', 'S', 'S', 'A', 'G', 'E', #10, 'V', 'A', 'R', 'S', #10, 'T', 'E', 'A', 'M', '_', 'A', 'C', 'C', 'E', 'P', 'T', 'E', 'D', #10, 'C', 'O', 'L', 'O', 'R', #10, 'W', 'A', 'R', 'N', 'I', 'N', 'G', #10, #0, #10); |
26 |
35 |
27 const commands: array[0..235] of integer = (13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 13, 8, 0, 0, 0, 0, 0, 0, -37, 0, 0, 0, -36, 29, 5, 0, 0, 0, -35, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33, 4, 0, 0, -32, 8, 0, 0, 0, 0, 0, 0, -31, 6, 0, 0, 0, 0, -30, 13, 0, 0, 0, 4, 0, 0, -29, 0, 0, 0, 0, -28, 8, 0, 0, 0, 0, 0, 0, -27, 25, 5, 0, 0, 0, -26, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, -24, 13, 5, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, -22, 12, 5, 0, 0, 0, -21, 0, 0, 0, 0, 0, -20, 30, 20, 5, 0, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 0, 0, 0, -17, 28, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, -16, 9, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, -14, 22, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -12, 9, 0, 0, 0, 0, 0, 0, 0, -11, 0, 0, -10); |
36 const commands: array[0..206] of integer = (12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 11, 7, 0, 0, 0, 0, 0, -37, 0, 0, -36, 26, 4, 0, 0, -35, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, -33, 3, 0, -32, 7, 0, 0, 0, 0, 0, -31, 5, 0, 0, 0, -30, 11, 0, 0, 0, 3, 0, -29, 0, 0, 0, -28, 7, 0, 0, 0, 0, 0, -27, 22, 4, 0, 0, -26, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, -24, 11, 4, 0, 0, -23, 0, 0, 0, 0, 0, -22, 10, 4, 0, 0, -21, 0, 0, 0, 0, -20, 27, 18, 4, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 0, 0, -17, 25, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, -16, 8, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, -14, 20, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, -12, 8, 0, 0, 0, 0, 0, 0, -11, 0, -10); |
28 |
37 |
29 procedure handler_ASKPASSWORD; |
38 procedure handler_ASKPASSWORD; |
30 begin |
39 begin |
31 state.cmd:= cmd_ASKPASSWORD; |
40 state.cmd:= cmd_ASKPASSWORD; |
32 end; |
41 end; |
112 end; |
121 end; |
113 |
122 |
114 procedure handler_PING; |
123 procedure handler_PING; |
115 begin |
124 begin |
116 state.cmd:= cmd_PING; |
125 state.cmd:= cmd_PING; |
126 |
|
127 sendNet('PONG'); |
|
117 end; |
128 end; |
118 |
129 |
119 procedure handler_PROTO; |
130 procedure handler_PROTO; |
120 begin |
131 begin |
121 state.cmd:= cmd_PROTO; |
132 state.cmd:= cmd_PROTO; |
167 end; |
178 end; |
168 |
179 |
169 procedure handler___UNKNOWN__; |
180 procedure handler___UNKNOWN__; |
170 begin |
181 begin |
171 state.cmd:= cmd___UNKNOWN__; |
182 state.cmd:= cmd___UNKNOWN__; |
183 |
|
184 writeln('[NET] Unknown cmd'); |
|
172 end; |
185 end; |
173 |
186 |
174 const handlers: array[0..28] of PHandler = (@handler___UNKNOWN__, @handler_WARNING, @handler_TEAM_COLOR, @handler_TEAM_ACCEPTED, @handler_SERVER_VARS, @handler_SERVER_MESSAGE, @handler_SERVER_AUTH, @handler_RUN_GAME, @handler_ROUND_FINISHED, @handler_ROOMS, @handler_PROTO, @handler_PING, @handler_NOTICE, @handler_NICK, @handler_LOBBY_LEFT, @handler_LOBBY_JOINED, @handler_LEFT, @handler_KICKED, @handler_JOINING, @handler_JOINED, @handler_INFO, @handler_HH_NUM, @handler_EM, @handler_CONNECTED, @handler_CLIENT_FLAGS, @handler_CHAT, @handler_BYE, @handler_BANLIST, @handler_ASKPASSWORD); |
187 const handlers: array[0..28] of PHandler = (@handler___UNKNOWN__, @handler_WARNING, @handler_TEAM_COLOR, @handler_TEAM_ACCEPTED, @handler_SERVER_VARS, @handler_SERVER_MESSAGE, @handler_SERVER_AUTH, @handler_RUN_GAME, @handler_ROUND_FINISHED, @handler_ROOMS, @handler_PROTO, @handler_PING, @handler_NOTICE, @handler_NICK, @handler_LOBBY_LEFT, @handler_LOBBY_JOINED, @handler_LEFT, @handler_KICKED, @handler_JOINING, @handler_JOINED, @handler_INFO, @handler_HH_NUM, @handler_EM, @handler_CONNECTED, @handler_CLIENT_FLAGS, @handler_CHAT, @handler_BYE, @handler_BANLIST, @handler_ASKPASSWORD); |
175 |
188 |
176 |
189 |
177 // end of generated stuff |
190 // end of generated stuff |
191 procedure handleTail; |
|
192 var cnt: Longint; |
|
193 c: char; |
|
194 begin |
|
195 state.l:= 0; |
|
196 |
|
197 c:= getCurrChar; |
|
198 repeat |
|
199 if c = #10 then cnt:= 0 else cnt:= 1; |
|
200 repeat |
|
201 c:= getNextChar; |
|
202 inc(cnt) |
|
203 until (c = #0) or (c = #10); |
|
204 until (c = #0) or (cnt = 1) |
|
205 end; |
|
206 |
|
178 var sock: PTCPSocket; |
207 var sock: PTCPSocket; |
179 fds: PSDLNet_SocketSet; |
208 fds: PSDLNet_SocketSet; |
180 netReaderThread: PSDL_Thread; |
209 netReaderThread: PSDL_Thread; |
181 sockbuf: shortstring; |
210 |
182 sockbufpos: byte; |
211 function getCurrChar: char; |
212 begin |
|
213 getCurrChar:= state.buf[state.bufpos] |
|
214 end; |
|
183 |
215 |
184 function getNextChar: char; |
216 function getNextChar: char; |
185 var r: byte; |
217 var r: byte; |
186 begin |
218 begin |
187 if sockbufpos < byte(sockbuf[0]) then |
219 if state.bufpos < byte(state.buf[0]) then |
188 begin |
220 begin |
189 inc(sockbufpos); |
221 inc(state.bufpos); |
190 getNextChar:= sockbuf[sockbufpos]; |
|
191 end else |
222 end else |
192 begin |
223 begin |
193 r:= SDLNet_TCP_Recv(sock, @sockbuf[1], 255); |
224 r:= SDLNet_TCP_Recv(sock, @state.buf[1], 255); |
194 if r > 0 then |
225 if r > 0 then |
195 begin |
226 begin |
196 sockbufpos:= 1; |
227 state.bufpos:= 1; |
197 sockbuf[0]:= char(r); |
228 state.buf[0]:= char(r); |
198 getNextChar:= sockbuf[1]; |
|
199 end else |
229 end else |
200 begin |
230 begin |
201 sockbufpos:= 0; |
231 state.bufpos:= 0; |
202 sockbuf[0]:= #0; |
232 state.buf[0]:= #0; |
203 getNextChar:= #0 |
233 end |
234 end; |
|
235 |
|
236 getNextChar:= state.buf[state.bufpos]; |
|
237 end; |
|
238 |
|
239 function netReader(data: pointer): LongInt; cdecl; export; |
|
240 var c: char; |
|
241 begin |
|
242 repeat |
|
243 c:= getNextChar; |
|
244 writeln('>>>>> ', c, ' [', letters[state.l], '] ', commands[state.l]); |
|
245 if c = #0 then |
|
246 state.netState:= netDisconnected |
|
247 else |
|
248 begin |
|
249 while (letters[state.l] <> c) and (commands[state.l] > 0) do |
|
250 inc(state.l, commands[state.l]); |
|
251 |
|
252 if c = letters[state.l] then |
|
253 if commands[state.l] < 0 then |
|
254 begin |
|
255 handlers[-10 - commands[state.l]](); |
|
256 handleTail() |
|
257 end |
|
258 else |
|
259 inc(state.l) |
|
260 else |
|
261 begin |
|
262 handler___UNKNOWN__(); |
|
263 handleTail() |
|
204 end |
264 end |
205 end |
265 end |
206 end; |
266 until state.netState = netDisconnected; |
207 |
267 |
208 function netReader(data: pointer): LongInt; cdecl; export; |
268 writeln('[NET] netReader: disconnected'); |
209 var c: char; |
269 end; |
210 begin |
270 |
211 repeat |
271 procedure sendNet(s: shortstring); |
212 c:= getNextChar; |
272 begin |
213 if c = #0 then |
273 writeln('[NET] Send: ', s); |
214 state.netState:= netDisconnected; |
274 SDLNet_TCP_Send(sock, @s[1], byte(s[0])); |
215 if c = letters[state.l] then |
275 SDLNet_TCP_Send(sock, @endCmd, 2); |
216 if commands[state.l] < 0 then |
|
217 handlers[-10 - commands[state.l]]() |
|
218 else |
|
219 inc(state.l) |
|
220 else |
|
221 if commands[state.l] = 0 then |
|
222 // unknown cmd |
|
223 else |
|
224 repeat |
|
225 inc(state.l, commands[state.l]) |
|
226 until (letters[state.l] = c) or (commands[state.l] = 0) |
|
227 until state.netState = netDisconnected |
|
228 end; |
276 end; |
229 |
277 |
230 procedure connectOfficialServer; |
278 procedure connectOfficialServer; |
231 var ipaddr: TIPAddress; |
279 var ipaddr: TIPAddress; |
232 begin |
280 begin |
234 exit; |
282 exit; |
235 |
283 |
236 if SDLNet_ResolveHost(ipaddr, PChar('netserver.hedgewars.org'), 46631) = 0 then |
284 if SDLNet_ResolveHost(ipaddr, PChar('netserver.hedgewars.org'), 46631) = 0 then |
237 sock:= SDLNet_TCP_Open(ipaddr); |
285 sock:= SDLNet_TCP_Open(ipaddr); |
238 |
286 |
239 sockbufpos:= 0; |
287 state.bufpos:= 0; |
240 sockbuf:= ''; |
288 state.buf:= ''; |
289 |
|
290 state.l:= 0; |
|
291 state.netState:= netConnecting; |
|
292 |
|
241 netReaderThread:= SDL_CreateThread(@netReader{$IFDEF SDL2}, 'netReader'{$ENDIF}, nil); |
293 netReaderThread:= SDL_CreateThread(@netReader{$IFDEF SDL2}, 'netReader'{$ENDIF}, nil); |
242 end; |
294 end; |
243 |
295 |
244 procedure initModule; |
296 procedure initModule; |
245 begin |
297 begin |