UBrowser
Class UBrowserHTTPLink

source: e:\games\UnrealTournament\UBrowser\Classes\UBrowserHTTPLink.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Info
         |
         +--Engine.InternetInfo
            |
            +--IpDrv.InternetLink
               |
               +--IpDrv.TcpLink
                  |
                  +--UBrowser.UBrowserBufferedTcpLink
                     |
                     +--UBrowser.UBrowserHTTPLink
Direct Known Subclasses:None

class UBrowserHTTPLink
extends UBrowser.UBrowserBufferedTcpLink


Variables
 string CouldNotConnectError
           Optional port that the master server is listening on
 string MasterServerAddress
           Address of the master server
 IpAddr MasterServerIpAddr
 int MasterServerTCPPort
           Optional port that the master server is listening on
 int MasterServerTimeout
           Optional port that the master server is listening on
 string MasterServerURI
           Address of the master server
 UBrowserHTTPFact OwnerFactory
 string ResolveFailedError
           Optional port that the master server is listening on
 string TimeOutError
           Optional port that the master server is listening on
 bool bHasOpened

States
Done

Function Summary
 void BeginPlay()
     
// for WaitFor
 void DoBufferQueueIO()
 void GotMatch(int MatchData)
 void GotMatchTimeout(int MatchData)
 void HandleServer(string Text)
 void ResolveFailed()
     
// Host resolution failue.
 void Resolved(IpAddr Addr)
 void Start()
 void Tick(float DeltaTime)


State Done Function Summary



Source Code


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	}

End Source Code