Core.Object | +--Engine.Actor | +--Engine.Info | +--Engine.InternetInfo | +--IpDrv.InternetLink | +--IpDrv.TcpLink | +--UBrowser.UBrowserBufferedTcpLink | +--UBrowser.UBrowserHTTPLink
string
CouldNotConnectError
MasterServerAddress
IpAddr
MasterServerIpAddr
int
MasterServerTCPPort
MasterServerTimeout
MasterServerURI
UBrowserHTTPFact
OwnerFactory
ResolveFailedError
TimeOutError
bool
bHasOpened
void
BeginPlay()
// for WaitFor
DoBufferQueueIO()
GotMatch(int MatchData)
GotMatchTimeout(int MatchData)
HandleServer(string Text)
ResolveFailed()
// Host resolution failue.
Resolved(IpAddr Addr)
Start()
Tick(float DeltaTime)
00001 class UBrowserHTTPLink extends UBrowserBufferedTcpLink; 00002 00003 // Misc 00004 var UBrowserHTTPFact OwnerFactory; 00005 var IpAddr MasterServerIpAddr; 00006 var bool bHasOpened; 00007 00008 // Params 00009 var string MasterServerAddress; // Address of the master server 00010 var string MasterServerURI; 00011 var int MasterServerTCPPort; // Optional port that the master server is listening on 00012 var int MasterServerTimeout; 00013 00014 // Error messages 00015 var localized string ResolveFailedError; 00016 var localized string TimeOutError; 00017 var localized string CouldNotConnectError; 00018 00019 // for WaitFor 00020 const FoundHeader = 1; 00021 const FoundServer = 2; 00022 00023 function BeginPlay() 00024 { 00025 bHasOpened = False; 00026 Disable('Tick'); 00027 Super.BeginPlay(); 00028 } 00029 00030 function Start() 00031 { 00032 ResetBuffer(); 00033 00034 MasterServerIpAddr.Port = MasterServerTCPPort; 00035 Resolve( MasterServerAddress ); 00036 } 00037 00038 function DoBufferQueueIO() 00039 { 00040 Super.DoBufferQueueIO(); 00041 if(bHasOpened && PeekChar() == 0 && !IsConnected()) 00042 { 00043 OwnerFactory.QueryFinished(True); 00044 GotoState('Done'); 00045 } 00046 } 00047 00048 function Resolved( IpAddr Addr ) 00049 { 00050 // Set the address 00051 MasterServerIpAddr.Addr = Addr.Addr; 00052 00053 // Handle failure. 00054 if( MasterServerIpAddr.Addr == 0 ) 00055 { 00056 Log( "UBrowserHTTPLink: Invalid master server address, aborting." ); 00057 return; 00058 } 00059 00060 // Display success message. 00061 Log( "UBrowserHTTPLink: Master Server is "$MasterServerAddress$":"$MasterServerIpAddr.Port ); 00062 00063 // Bind the local port. 00064 if( BindPort() == 0 ) 00065 { 00066 Log( "UBrowserHTTPLink: Error binding local port, aborting." ); 00067 return; 00068 } 00069 00070 Open( MasterServerIpAddr ); 00071 SetTimer(MasterServerTimeout, False); 00072 } 00073 00074 event Timer() 00075 { 00076 if(!bHasOpened) 00077 { 00078 OwnerFactory.QueryFinished(False, CouldNotConnectError$MasterServerAddress); 00079 GotoState('Done'); 00080 } 00081 } 00082 00083 event Closed() 00084 { 00085 } 00086 00087 // Host resolution failue. 00088 function ResolveFailed() 00089 { 00090 Log("UBrowserHTTPLink: Failed to resolve master server address, aborting."); 00091 OwnerFactory.QueryFinished(False, ResolveFailedError$MasterServerAddress); 00092 GotoState('Done'); 00093 } 00094 00095 event Opened() 00096 { 00097 Enable('Tick'); 00098 bHasOpened = True; 00099 00100 // Send request 00101 SendBufferedData("GET "$MasterServerURI$" HTTP/1.0"$CR$LF); 00102 SendBufferedData("User-Agent: Unreal"$CR$LF); 00103 SendBufferedData("Host:"$MasterServerAddress$":"$MasterServerTCPPort$CR$LF$CR$LF); 00104 WaitFor("200", 10, FoundHeader); 00105 } 00106 00107 00108 function Tick(float DeltaTime) 00109 { 00110 DoBufferQueueIO(); 00111 } 00112 00113 function HandleServer(string Text) 00114 { 00115 local string Address; 00116 local string Port; 00117 00118 Address = ParseDelimited(Text, " ", 1); 00119 Port = ParseDelimited(Text, " ", 3); 00120 00121 OwnerFactory.FoundServer(Address, int(Port), "", "Unreal"); 00122 } 00123 00124 function GotMatch(int MatchData) 00125 { 00126 switch(MatchData) 00127 { 00128 case FoundHeader: 00129 Enable('Tick'); 00130 if(Chr(PeekChar()) == CR || Chr(PeekChar()) == LF) ReadChar(); 00131 00132 while(Right(WaitResult, 1) == CR || Right(WaitResult, 1) == LF) 00133 WaitResult=Left(WaitResult, Len(WaitResult) - 1); 00134 00135 if(WaitResult != "") 00136 WaitFor(CR, 10, FoundHeader); 00137 else 00138 WaitFor(CR, 10, FoundServer); 00139 break; 00140 case FoundServer: 00141 Enable('Tick'); 00142 if(Chr(PeekChar()) == CR || Chr(PeekChar()) == LF) ReadChar(); 00143 00144 while(Right(WaitResult, 1) == CR || Right(WaitResult, 1) == LF) 00145 WaitResult=Left(WaitResult, Len(WaitResult) - 1); 00146 00147 HandleServer(WaitResult); 00148 00149 WaitFor(CR, 10, FoundServer); 00150 break; 00151 default: 00152 break; 00153 } 00154 } 00155 00156 function GotMatchTimeout(int MatchData) 00157 { 00158 // when a match times out 00159 OwnerFactory.QueryFinished(False, TimeOutError); 00160 GotoState('Done'); 00161 } 00162 00163 // States 00164 state Done 00165 { 00166 Begin: 00167 Disable('Tick'); 00168 } 00169 00170 defaultproperties 00171 { 00172 ResolveFailedError="The master server could not be resolved: " 00173 TimeOutError="Timeout talking to the master server" 00174 CouldNotConnectError="Connecting to the master server timed out: " 00175 }