171 lines
2.5 KiB
Ucode
171 lines
2.5 KiB
Ucode
class KFBufferedTCPLink extends BufferedTCPLink;
|
|
|
|
var IpAddr ServerIpAddr;
|
|
var string ReceiveState;
|
|
var string Waiting;
|
|
var string Match;
|
|
var string Timeout;
|
|
|
|
var float RetryTime;
|
|
var int CurrentRetries;
|
|
var int MaxRetries;
|
|
|
|
var bool bSendRequest;
|
|
var bool bDone;
|
|
var bool bFailed;
|
|
|
|
var string TargetAddress;
|
|
var string TargetRequest;
|
|
|
|
function Init(string Address, string Request)
|
|
{
|
|
Close();
|
|
|
|
bDone = false;
|
|
bFailed = false;
|
|
|
|
bSendRequest = true;
|
|
ServerIpAddr.Port = 0;
|
|
CurrentRetries = 0;
|
|
|
|
TargetAddress = Address;
|
|
TargetRequest = Request;
|
|
|
|
Resolve(Address);
|
|
|
|
SetTimer(RetryTime, false);
|
|
}
|
|
|
|
event Timer()
|
|
{
|
|
if ( bDone )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( bFailed )
|
|
{
|
|
bFailed = false;
|
|
bDone = OnServerConnectTimeout();
|
|
return;
|
|
}
|
|
|
|
if ( ServerIpAddr.Port != 0)
|
|
{
|
|
if ( IsConnected() )
|
|
{
|
|
if ( bSendRequest )
|
|
{
|
|
SendBufferedData(TargetRequest$CRLF);
|
|
|
|
bSendRequest = false;
|
|
|
|
WaitForCount(1, 20, 1); // 20 sec timeout
|
|
}
|
|
}
|
|
else if ( CurrentRetries++ > MaxRetries )
|
|
{
|
|
OnServerConnectTimeout();
|
|
return;
|
|
}
|
|
}
|
|
else if ( CurrentRetries++ > MaxRetries )
|
|
{
|
|
OnServerConnectTimeout();
|
|
return;
|
|
}
|
|
|
|
SetTimer(RetryTime, false);
|
|
}
|
|
|
|
function ResolveFailed()
|
|
{
|
|
ServerIpAddr.Port = -1; // set error flag
|
|
}
|
|
|
|
function Resolved(IpAddr Addr)
|
|
{
|
|
// Set the address
|
|
ServerIpAddr.Addr = Addr.Addr;
|
|
ServerIpAddr.Port = 80; // connect to http port
|
|
|
|
// Handle failure.
|
|
if ( ServerIpAddr.Addr == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Bind the local port.
|
|
if ( BindPort() == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
OpenNoSteam(ServerIpAddr);
|
|
}
|
|
|
|
function DestroyLink()
|
|
{
|
|
SetTimer(0.0, False);
|
|
|
|
if ( IsConnected() )
|
|
{
|
|
Close();
|
|
}
|
|
}
|
|
|
|
function Tick(float DeltaTime)
|
|
{
|
|
DoBufferQueueIO();
|
|
|
|
Super.Tick(DeltaTime);
|
|
}
|
|
|
|
function WaitForCount(int Count, float TimeOut, int MatchData)
|
|
{
|
|
Super.WaitForCount(Count, TimeOut, MatchData);
|
|
ReceiveState = Waiting;
|
|
}
|
|
|
|
function GotMatch(int MatchData)
|
|
{
|
|
// called when a match happens
|
|
ReceiveState = Match;
|
|
}
|
|
|
|
function GotMatchTimeout(int MatchData)
|
|
{
|
|
// when a match times out
|
|
ReceiveState = Timeout;
|
|
}
|
|
|
|
event ReceivedText(string Text)
|
|
{
|
|
local int Index;
|
|
|
|
if ( !bDone )
|
|
{
|
|
Index = InStr(Text, "Content-Location: KF:");
|
|
|
|
if ( Index > 0 )
|
|
{
|
|
bDone = true;
|
|
OnServerResponded(Mid(Text, Index + 22));
|
|
}
|
|
else
|
|
{
|
|
bFailed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
Waiting="Waiting"
|
|
Match="Matched"
|
|
Timeout="Timed Out"
|
|
|
|
RetryTime=0.25
|
|
MaxRetries=20
|
|
}
|