hedgewars/uIO.pas
branchqmlfrontend
changeset 10412 9a8d4efcf3fa
parent 10410 669bfa55cd70
child 10420 02c573d19224
equal deleted inserted replaced
10410:669bfa55cd70 10412:9a8d4efcf3fa
    53             1: (len: byte;
    53             1: (len: byte;
    54                 cmd: Char);
    54                 cmd: Char);
    55             2: (str: shortstring);
    55             2: (str: shortstring);
    56             end;
    56             end;
    57 
    57 
    58 var IPCSock: PTCPSocket;
    58 var
    59     fds: PSDLNet_SocketSet;
       
    60     isPonged: boolean;
    59     isPonged: boolean;
    61     SocketString: shortstring;
    60     
    62 
       
    63     headcmd: PCmd;
    61     headcmd: PCmd;
    64     lastcmd: PCmd;
    62     lastcmd: PCmd;
    65 
    63 
    66     flushDelayTicks: LongWord;
    64     flushDelayTicks: LongWord;
    67     sendBuffer: record
    65     sendBuffer: record
   100     lastcmd:= nil;
    98     lastcmd:= nil;
   101 dispose(tmp)
    99 dispose(tmp)
   102 end;
   100 end;
   103 
   101 
   104 procedure InitIPC;
   102 procedure InitIPC;
   105 var ipaddr: TIPAddress;
   103 begin
   106 begin
   104     // do nothing, flib initialized everything for us
   107     WriteToConsole('Init SDL_Net... ');
       
   108     SDLTry(SDLNet_Init = 0, true);
       
   109     fds:= SDLNet_AllocSocketSet(1);
       
   110     SDLTry(fds <> nil, true);
       
   111     WriteLnToConsole(msgOK);
       
   112     WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' ');
       
   113     {$HINTS OFF}
       
   114     SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, true);
       
   115     {$HINTS ON}
       
   116     IPCSock:= SDLNet_TCP_Open(ipaddr);
       
   117     SDLTry(IPCSock <> nil, true);
       
   118     WriteLnToConsole(msgOK)
       
   119 end;
   105 end;
   120 
   106 
   121 procedure ParseChatCommand(command: shortstring; message: shortstring;
   107 procedure ParseChatCommand(command: shortstring; message: shortstring;
   122                            messageStartIndex: Byte);
   108                            messageStartIndex: Byte);
   123 var
   109 var
   174         AddFileLog('[IPC in] ' + sanitizeCharForLog(s[1]) + ' ticks ' + IntToStr(lastcmd^.loTime));
   160         AddFileLog('[IPC in] ' + sanitizeCharForLog(s[1]) + ' ticks ' + IntToStr(lastcmd^.loTime));
   175     end
   161     end
   176 end;
   162 end;
   177 
   163 
   178 procedure IPCCheckSock;
   164 procedure IPCCheckSock;
   179 var i: LongInt;
   165 begin
   180     s: shortstring;
   166     while ipcCheckFromFrontend() do
   181 begin
   167         ParseIPCCommand(ipcReadFromFrontend())
   182     if IPCSock = nil then
       
   183         exit;
       
   184 
       
   185     fds^.numsockets:= 0;
       
   186     SDLNet_AddSocket(fds, IPCSock);
       
   187 
       
   188     while SDLNet_CheckSockets(fds, 0) > 0 do
       
   189     begin
       
   190         i:= SDLNet_TCP_Recv(IPCSock, @s[1], 255 - Length(SocketString));
       
   191         if i > 0 then
       
   192         begin
       
   193             s[0]:= char(i);
       
   194             SocketString:= SocketString + s;
       
   195             while (Length(SocketString) > 1) and (Length(SocketString) > byte(SocketString[1])) do
       
   196             begin
       
   197                 ParseIPCCommand(copy(SocketString, 2, byte(SocketString[1])));
       
   198                 Delete(SocketString, 1, Succ(byte(SocketString[1])))
       
   199             end
       
   200         end
       
   201     else
       
   202         OutError('IPC connection lost', true)
       
   203     end;
       
   204 end;
   168 end;
   205 
   169 
   206 procedure LoadRecordFromFile(fileName: shortstring);
   170 procedure LoadRecordFromFile(fileName: shortstring);
   207 var f  : File;
   171 var f  : File;
   208     ss : shortstring = '';
   172     ss : shortstring = '';
   258     end
   222     end
   259 end;
   223 end;
   260 
   224 
   261 procedure flushBuffer();
   225 procedure flushBuffer();
   262 begin
   226 begin
   263     if IPCSock <> nil then
   227 
   264         begin
       
   265         SDLNet_TCP_Send(IPCSock, @sendBuffer.buf, sendBuffer.count);
       
   266         flushDelayTicks:= 0;
       
   267         sendBuffer.count:= 0
       
   268         end
       
   269 end;
   228 end;
   270 
   229 
   271 procedure SendIPC(s: shortstring);
   230 procedure SendIPC(s: shortstring);
   272 begin
   231 begin
   273 if IPCSock <> nil then
       
   274     begin
       
   275     if s[0] > #251 then
   232     if s[0] > #251 then
   276         s[0]:= #251;
   233         s[0]:= #251;
   277 
   234 
   278     SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]);
   235     SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]);
   279 
   236 
   280     AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1]));
   237     AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1]));
   281     inc(s[0], 2);
   238     inc(s[0], 2);
   282 
   239 
   283     if isSyncedCommand(s[1]) then
   240     ipcToFrontend(s)
   284         begin
       
   285         if sendBuffer.count + byte(s[0]) >= cSendBufferSize then
       
   286             flushBuffer();
       
   287 
       
   288         Move(s, sendBuffer.buf[sendBuffer.count], byte(s[0]) + 1);
       
   289         inc(sendBuffer.count, byte(s[0]) + 1);
       
   290 
       
   291         if (s[1] = 'N') or (s[1] = '#') then
       
   292             flushBuffer();
       
   293         end else
       
   294         SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0])))
       
   295     end
       
   296 end;
   241 end;
   297 
   242 
   298 procedure SendIPCRaw(p: pointer; len: Longword);
   243 procedure SendIPCRaw(p: pointer; len: Longword);
   299 begin
   244 begin
   300 if IPCSock <> nil then
   245 {    if IPCSock <> nil then
   301     begin
   246     begin
   302     SDLNet_TCP_Send(IPCSock, p, len)
   247     SDLNet_TCP_Send(IPCSock, p, len)
   303     end
   248     end}
   304 end;
   249 end;
   305 
   250 
   306 procedure SendIPCXY(cmd: char; X, Y: LongInt);
   251 procedure SendIPCXY(cmd: char; X, Y: LongInt);
   307 var s: shortstring;
   252 var s: shortstring;
   308 begin
   253 begin
   309 s[0]:= #9;
   254     s[0]:= #9;
   310 s[1]:= cmd;
   255     s[1]:= cmd;
   311 SDLNet_Write32(X, @s[2]);
   256     SDLNet_Write32(X, @s[2]);
   312 SDLNet_Write32(Y, @s[6]);
   257     SDLNet_Write32(Y, @s[6]);
   313 SendIPC(s)
   258     SendIPC(s)
   314 end;
   259 end;
   315 
   260 
   316 procedure IPCWaitPongEvent;
   261 procedure IPCWaitPongEvent;
   317 begin
   262 begin
   318 isPonged:= false;
   263 isPonged:= false;
   438 end;
   383 end;
   439 
   384 
   440 procedure chFatalError(var s: shortstring);
   385 procedure chFatalError(var s: shortstring);
   441 begin
   386 begin
   442     SendIPC('E' + s);
   387     SendIPC('E' + s);
   443     // TODO: should we try to clean more stuff here?
   388 {    // TODO: should we try to clean more stuff here?
   444     SDL_Quit;
   389     SDL_Quit;
   445 
   390 
   446     if IPCSock <> nil then
   391     if IPCSock <> nil then
   447         halt(HaltFatalError)
   392         halt(HaltFatalError)
   448     else
   393     else
   449         halt(HaltFatalErrorNoIPC);
   394         halt(HaltFatalErrorNoIPC);}
   450 end;
   395 end;
   451 
   396 
   452 procedure doPut(putX, putY: LongInt; fromAI: boolean);
   397 procedure doPut(putX, putY: LongInt; fromAI: boolean);
   453 begin
   398 begin
   454 if CheckNoTeamOrHH or isPaused then
   399 if CheckNoTeamOrHH or isPaused then
   496 
   441 
   497 procedure initModule;
   442 procedure initModule;
   498 begin
   443 begin
   499     RegisterVariable('fatal', @chFatalError, true );
   444     RegisterVariable('fatal', @chFatalError, true );
   500 
   445 
   501     IPCSock:= nil;
       
   502 
       
   503     headcmd:= nil;
   446     headcmd:= nil;
   504     lastcmd:= nil;
   447     lastcmd:= nil;
   505     isPonged:= false;
   448     isPonged:= false;
   506     SocketString:= '';
       
   507 
   449 
   508     hiTicks:= 0;
   450     hiTicks:= 0;
   509     flushDelayTicks:= 0;
   451     flushDelayTicks:= 0;
   510     sendBuffer.count:= 0;
   452     sendBuffer.count:= 0;
   511 end;
   453 end;
   512 
   454 
   513 procedure freeModule;
   455 procedure freeModule;
   514 begin
   456 begin
   515     while headcmd <> nil do RemoveCmd;
   457     while headcmd <> nil do RemoveCmd;
   516     SDLNet_FreeSocketSet(fds);
       
   517     SDLNet_TCP_Close(IPCSock);
       
   518     SDLNet_Quit();
       
   519 
       
   520 end;
   458 end;
   521 
   459 
   522 end.
   460 end.