GetNetTime.js


/*=====================================================================

Function:   GetTime
Purpose:	Get time from Internet Time Servers.
Argument:	Maximum milliseconds waiting for reply from the servers.
Return:		A Time object if successful, null if not.

=====================================================================*/

var udp=Context.SocketsManager.CreateUDPObject();
udp.SetCallbacks(this);
var serverIPs=new Array("200.50.25.62", "64.90.182.55", "206.246.118.250","64.236.96.53","68.216.79.113","99.150.184.201","64.113.32.5","132.163.4.101","132.163.4.103","128.138.140.44","128.138.188.172","131.107.13.100","207.200.81.113","69.25.96.13","64.125.78.85","64.147.116.229");
var recvData=0; //The server will gives us a 32-bit interger, the number of seconds since 1900-01-01 00:00:00.

function GetTime(expireMS)
{
	if(!expireMS)
	{
		expireMS=3000; //default expiring time is 3 seconds
	}
	recvData=0;

	// send 'helo' to servers
	var i, n;
	n=serverIPs.length;
	for(i=0; i<n; i++)
	{
		var adr=Context.SocketsManager.CreateInternetAddressObject();
		adr.SetAddress(serverIPs[i]);
		adr.Port=37;
		udp.SendTextTo(adr, "helo", true);
	}

	//if data does not arrive within 'expireMS', we abort
	var tk0=Context.TickCount;
	while((Context.TickCount-tk0)<expireMS && recvData==0)
	{
		Context.SocketsManager.DoRoutine();
	}
	udp.Close();

	if(recvData==0) //failed.
	{
		return(null);
	}

	var dw=Context.SocketsManager.ntohl(recvData); //bytes order of recvData is network order, must be reverted for Intel
	var t=Context.CreateTimeObject();
	t.Init(1900, 1, 1, 0, 0, 0); //init the time object with 1900-00-00 0:0:0
	t.Add(0, 0, 0, dw); //add the received number of seconds;
	return(t.Valid? t : null); 
}



/*=====================================================================
OnDataReceived:
Callback function, called by UDP when data arrives
=====================================================================*/
function OnDataReceived(udpobj, adr, buf)
{
	if(buf.DataSize==4 && recvData==0)
	{
		recvData=buf.DWordAt(0);
	}
}