hedgewars/uFLNet.pas
branchqmlfrontend
changeset 11413 ffff8a0d1a76
parent 11403 b894922d58cc
child 11415 05cf35103206
equal deleted inserted replaced
11403:b894922d58cc 11413:ffff8a0d1a76
     3 
     3 
     4 procedure connectOfficialServer;
     4 procedure connectOfficialServer;
     5 
     5 
     6 procedure initModule;
     6 procedure initModule;
     7 procedure freeModule;
     7 procedure freeModule;
       
     8 procedure sendNet(s: shortstring);
     8 
     9 
     9 implementation
    10 implementation
    10 uses SDLh, uFLIPC, uFLTypes, uFLUICallback, uFLNetTypes;
    11 uses SDLh, uFLIPC, uFLTypes, uFLUICallback, uFLNetTypes, uFLUtils;
    11 
    12 
    12 const endCmd: string = #10 + #10;
    13 const endCmd: string = #10 + #10;
    13 
    14 
    14 function getNextChar: char; forward;
    15 function getNextChar: char; forward;
    15 function getCurrChar: char; forward;
    16 function getCurrChar: char; forward;
    16 procedure sendNet(s: shortstring); forward;
       
    17 
    17 
    18 type
    18 type
    19     TNetState = (netDisconnected, netConnecting, netLoggedIn);
    19     TNetState = (netDisconnected, netConnecting, netLoggedIn);
    20     TParserState = record
    20     TParserState = record
    21                        cmd: TCmdType;
    21                        cmd: TCmdType;
    26                    end;
    26                    end;
    27     PHandler = procedure;
    27     PHandler = procedure;
    28 
    28 
    29 var state: TParserState;
    29 var state: TParserState;
    30 
    30 
       
    31 procedure handleTail; forward;
       
    32 function getShortString: shortstring; forward;
       
    33 
    31 // generated stuff here
    34 // generated stuff here
    32 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);
    35 const letters: array[0..211] of char = ('A', 'S', 'K', 'P', 'A', 'S', 'S', 'W',
    33 
    36     'O', 'R', 'D', #10, 'B', 'A', 'N', 'L', 'I', 'S', 'T', #10, 'Y', 'E', #10, 'C',
    34 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);
    37     'H', 'A', 'T', #10, 'L', 'I', 'E', 'N', 'T', '_', 'F', 'L', 'A', 'G', 'S', #10,
    35 
    38     'O', 'N', 'N', 'E', 'C', 'T', 'E', 'D', #10, 'E', 'M', #10, 'R', 'R', 'O', 'R',
    36 procedure handler_ASKPASSWORD;
    39     #10, 'H', 'H', '_', 'N', 'U', 'M', #10, 'I', 'N', 'F', 'O', #10, 'J', 'O', 'I',
    37 begin
    40     'N', 'E', 'D', #10, 'I', 'N', 'G', #10, 'K', 'I', 'C', 'K', 'E', 'D', #10, 'L',
    38 end;
    41     'E', 'F', 'T', #10, 'O', 'B', 'B', 'Y', ':', 'J', 'O', 'I', 'N', 'E', 'D', #10,
    39 
    42     'L', 'E', 'F', 'T', #10, 'N', 'I', 'C', 'K', #10, 'O', 'T', 'I', 'C', 'E', #10,
    40 procedure handler_BANLIST;
    43     'P', 'I', 'N', 'G', #10, 'R', 'O', 'T', 'O', #10, 'R', 'O', 'O', 'M', 'S', #10,
    41 begin
    44     'U', 'N', 'D', '_', 'F', 'I', 'N', 'I', 'S', 'H', 'E', 'D', #10, 'U', 'N', '_',
    42 end;
    45     'G', 'A', 'M', 'E', #10, 'S', 'E', 'R', 'V', 'E', 'R', '_', 'A', 'U', 'T', 'H',
    43 
    46     #10, 'M', 'E', 'S', 'S', 'A', 'G', 'E', #10, 'V', 'A', 'R', 'S', #10, 'T', 'E',
    44 procedure handler_BYE;
    47     'A', 'M', '_', 'A', 'C', 'C', 'E', 'P', 'T', 'E', 'D', #10, 'C', 'O', 'L', 'O',
    45 begin
    48     'R', #10, 'W', 'A', 'R', 'N', 'I', 'N', 'G', #10, #0, #10);
    46 end;
    49 const commands: array[0..211] of integer = (12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    47 
    50     -39, 11, 7, 0, 0, 0, 0, 0, -38, 0, 0, -37, 26, 4, 0, 0, -36, 12, 0, 0, 0, 0, 0,
    48 procedure handler_CHAT;
    51     0, 0, 0, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, -34, 8, 2, -33, 0, 0, 0, 0, -32, 7,
    49 begin
    52     0, 0, 0, 0, 0, -31, 5, 0, 0, 0, -30, 11, 0, 0, 0, 3, 0, -29, 0, 0, 0, -28, 7, 0,
    50 end;
    53     0, 0, 0, 0, -27, 22, 4, 0, 0, -26, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, -25, 0, 0,
    51 
    54     0, 0, -24, 11, 4, 0, 0, -23, 0, 0, 0, 0, 0, -22, 10, 4, 0, 0, -21, 0, 0, 0, 0,
    52 procedure handler_CLIENT_FLAGS;
    55     -20, 27, 18, 4, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0,
    53 begin
    56     0, 0, 0, -17, 25, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, -16, 8, 0, 0, 0, 0, 0, 0, -15,
    54 end;
    57     0, 0, 0, 0, -14, 20, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0,
    55 
    58     -12, 8, 0, 0, 0, 0, 0, 0, -11, 0, -10);
    56 procedure handler_CONNECTED;
    59 
    57 var data: TCmdConnectedData;
    60 procedure handler_;
    58 begin
    61 begin
    59     sendUI(mtNetData, nil, 0);
    62     sendUI(mtNetData, @state.cmd, sizeof(state.cmd));
    60 end;
    63     writeln('handler_');
    61 
    64     handleTail()
    62 procedure handler_EM;
    65 end;
    63 begin
    66 
    64 end;
    67 procedure handler_L;
    65 
    68 begin
    66 procedure handler_HH_NUM;
    69     writeln('handler_L');
    67 begin
    70     handleTail()
    68 end;
    71 end;
    69 
    72 
    70 procedure handler_INFO;
    73 procedure handler_ML;
    71 begin
    74 begin
    72 end;
    75     writeln('handler_ML');
    73 
    76     handleTail()
    74 procedure handler_JOINED;
    77 end;
    75 begin
    78 
    76 end;
    79 procedure handler_MS;
    77 
    80 var cmd: TCmdParamS;
    78 procedure handler_JOINING;
    81     f: boolean;
    79 begin
    82 begin
    80 end;
    83     sendUI(mtNetData, @state.cmd, sizeof(state.cmd));
    81 
    84     writeln('handler_MS');
    82 procedure handler_KICKED;
    85     cmd.cmd:= Succ(state.cmd);
    83 begin
    86 
    84 end;
    87     repeat
    85 
    88         cmd.str1:= getShortString;
    86 procedure handler_LEFT;
    89         f:= cmd.str1[0] <> #0;
    87 begin
    90         if f then
    88 end;
    91             sendUI(mtNetData, @cmd, sizeof(cmd));
    89 
    92     until not f
    90 procedure handler_LOBBY_JOINED;
    93 end;
    91 begin
    94 
    92 end;
    95 procedure handler_S;
    93 
    96 begin
    94 procedure handler_LOBBY_LEFT;
    97     writeln('handler_S');
    95 begin
    98     handleTail()
    96 end;
    99 end;
    97 
   100 
    98 procedure handler_NICK;
   101 procedure handler_SL;
    99 begin
   102 begin
   100 end;
   103     writeln('handler_SL');
   101 
   104     handleTail()
   102 procedure handler_NOTICE;
   105 end;
   103 begin
   106 
   104 end;
   107 procedure handler_SMS;
   105 
   108 begin
   106 procedure handler_PING;
   109     writeln('handler_SMS');
   107 begin
   110     handleTail()
   108     sendNet('PONG')
   111 end;
   109 end;
   112 
   110 
   113 procedure handler__i;
   111 procedure handler_PROTO;
   114 var cmd: TCmdParami;
   112 begin
   115 begin
   113 end;
   116     writeln('handler__i');
   114 
   117     getShortString;
   115 procedure handler_ROOMS;
   118     cmd.cmd:= state.cmd;
   116 begin
   119     cmd.param1:= strToInt(getShortString);
   117 end;
   120     sendUI(mtNetData, @cmd, sizeof(cmd));
   118 
   121     handleTail()
   119 procedure handler_ROUND_FINISHED;
   122 end;
   120 begin
   123 
   121 end;
   124 procedure handler_i;
   122 
   125 begin
   123 procedure handler_RUN_GAME;
   126     writeln('handler_i');
   124 begin
   127     handleTail()
   125 end;
   128 end;
   126 
   129 
   127 procedure handler_SERVER_AUTH;
   130 procedure handler__UNKNOWN_;
   128 begin
       
   129 end;
       
   130 
       
   131 procedure handler_SERVER_MESSAGE;
       
   132 begin
       
   133 end;
       
   134 
       
   135 procedure handler_SERVER_VARS;
       
   136 begin
       
   137 end;
       
   138 
       
   139 procedure handler_TEAM_ACCEPTED;
       
   140 begin
       
   141 end;
       
   142 
       
   143 procedure handler_TEAM_COLOR;
       
   144 begin
       
   145 end;
       
   146 
       
   147 procedure handler_WARNING;
       
   148 begin
       
   149 end;
       
   150 
       
   151 procedure handler___UNKNOWN__;
       
   152 begin
   131 begin
   153     writeln('[NET] Unknown cmd');
   132     writeln('[NET] Unknown cmd');
   154 end;
   133 end;
   155 
   134 
   156 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);
   135 const handlers: array[0..29] of PHandler = (@handler__UNKNOWN_, @handler_L, @handler_MS, @handler_S,
       
   136     @handler_SL, @handler_L, @handler_S, @handler_, @handler_, @handler_MS,
       
   137     @handler_i, @handler_MS, @handler_L, @handler_S, @handler_SL, @handler_MS,
       
   138     @handler_SMS, @handler_, @handler_S, @handler_MS, @handler_MS, @handler_MS,
       
   139     @handler_L, @handler_ML, @handler__i, @handler_SMS, @handler_SL, @handler_SL,
       
   140     @handler_MS, @handler_S);
       
   141 const net2cmd: array[0..29] of TCmdType = (cmd_WARNING, cmd_WARNING,
       
   142     cmd_TEAM_COLOR, cmd_TEAM_ACCEPTED, cmd_SERVER_VARS, cmd_SERVER_MESSAGE,
       
   143     cmd_SERVER_AUTH, cmd_RUN_GAME, cmd_ROUND_FINISHED, cmd_ROOMS, cmd_PROTO,
       
   144     cmd_PING, cmd_NOTICE, cmd_NICK, cmd_LOBBY_LEFT, cmd_LOBBY_JOINED, cmd_LEFT,
       
   145     cmd_KICKED, cmd_JOINING, cmd_JOINED, cmd_INFO, cmd_HH_NUM, cmd_ERROR, cmd_EM,
       
   146     cmd_CONNECTED, cmd_CLIENT_FLAGS, cmd_CHAT, cmd_BYE, cmd_BANLIST,
       
   147     cmd_ASKPASSWORD);
   157 
   148 
   158 
   149 
   159 // end of generated stuff
   150 // end of generated stuff
   160 procedure handleTail;
   151 procedure handleTail;
   161 var cnt: Longint;
   152 var cnt: Longint;
   231                 inc(state.l, commands[state.l]);
   222                 inc(state.l, commands[state.l]);
   232 
   223 
   233             if c = letters[state.l] then
   224             if c = letters[state.l] then
   234                 if commands[state.l] < 0 then
   225                 if commands[state.l] < 0 then
   235                 begin
   226                 begin
   236                     state.cmd:= TCmdType(-10 - commands[state.l]);
   227                     state.cmd:= net2cmd[-10 - commands[state.l]];
   237                     writeln('[NET] ', state.cmd);
   228                     writeln('[NET] ', state.cmd);
   238                     handlers[-10 - commands[state.l]]();
   229                     handlers[-10 - commands[state.l]]();
   239                     handleTail()
       
   240                 end
   230                 end
   241                 else
   231                 else
   242                     inc(state.l)
   232                     inc(state.l)
   243             else
   233             else
   244             begin
   234             begin
   245                 handler___UNKNOWN__();
   235                 handler__UNKNOWN_();
   246                 handleTail()
   236                 handleTail()
   247             end
   237             end
   248         end
   238         end
   249     until state.netState = netDisconnected;
   239     until state.netState = netDisconnected;
   250 
   240 
   257 begin
   247 begin
   258     writeln('[NET] Send: ', s);
   248     writeln('[NET] Send: ', s);
   259     ipcToNet(s + endCmd);
   249     ipcToNet(s + endCmd);
   260 end;
   250 end;
   261 
   251 
       
   252 function getShortString: shortstring;
       
   253 var s: shortstring;
       
   254     c: char;
       
   255 begin
       
   256     s[0]:= #0;
       
   257 
       
   258     repeat
       
   259         inc(s[0]);
       
   260         s[byte(s[0])]:= getNextChar
       
   261     until (s[0] = #255) or (s[byte(s[0])] = #10) or (s[byte(s[0])] = #0);
       
   262 
       
   263     if s[byte(s[0])] = #10 then
       
   264         dec(s[0])
       
   265     else
       
   266         repeat c:= getNextChar until (c = #0) or (c = #10);
       
   267 
       
   268     getShortString:= s
       
   269 end;
       
   270 
   262 procedure netSendCallback(p: pointer; msg: PChar; len: Longword);
   271 procedure netSendCallback(p: pointer; msg: PChar; len: Longword);
   263 begin
   272 begin
   264     // W A R N I N G: totally thread-unsafe due to use of sock variable
   273     // W A R N I N G: totally thread-unsafe due to use of sock variable
   265     SDLNet_TCP_Send(sock, msg, len);
   274     SDLNet_TCP_Send(sock, msg, len);
   266 end;
   275 end;