aboutsummaryrefslogtreecommitdiff
path: root/cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date
diff options
context:
space:
mode:
Diffstat (limited to 'cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date')
-rw-r--r--cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date/index.html397
1 files changed, 397 insertions, 0 deletions
diff --git a/cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date/index.html b/cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date/index.html
new file mode 100644
index 00000000..d4ccaf2b
--- /dev/null
+++ b/cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?rev=1.31&content-type=text/x-cvsweb-markup&sortby=date/index.html
@@ -0,0 +1,397 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>
+<HEAD><style> A { color:black }</style>
+<!-- hennerik CVSweb $Revision: 1.93 $ -->
+<TITLE>code/nel/src/net/unitime.cpp - view - 1.31</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee">
+<table width="100%" border=0 cellspacing=0 cellpadding=1 bgcolor="#aaaaaa"><tr valign=bottom><td><a href="unitime.cpp?sortby=date"><IMG SRC="http://www.nevrax.org/inc/img/picto-up.gif" ALT="[BACK]" BORDER="0" WIDTH="14" HEIGHT="13"></a> <b>Return to <A HREF="unitime.cpp?sortby=date">unitime.cpp</A>
+ CVS log</b> <IMG SRC="http://www.nevrax.org/inc/img/picto-news.gif" ALT="[TXT]" BORDER="0" WIDTH="13" HEIGHT="15"></td><td align=right><IMG SRC="http://www.nevrax.org/inc/img/picto-dir.gif" ALT="[DIR]" BORDER="0" WIDTH="15" HEIGHT="13"> <b>Up to <a href="/cvs/cvsweb.cgi/?sortby=date">Nevrax</a> / <a href="/cvs/cvsweb.cgi/code/?sortby=date">code</a> / <a href="/cvs/cvsweb.cgi/code/nel/?sortby=date">nel</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/?sortby=date">src</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/?sortby=date">net</a></b></td></tr></table><HR noshade><table width="100%"><tr><td bgcolor="#ffffff">File: <a href="/cvs/cvsweb.cgi/?sortby=date">Nevrax</a> / <a href="/cvs/cvsweb.cgi/code/?sortby=date">code</a> / <a href="/cvs/cvsweb.cgi/code/nel/?sortby=date">nel</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/?sortby=date">src</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/?sortby=date">net</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/unitime.cpp?sortby=date">unitime.cpp</a>&nbsp;(<A HREF="/cvs/cvsweb.cgi/~checkout~/code/nel/src/net/unitime.cpp?rev=1.31&amp;sortby=date" target="cvs_checkout" onClick="window.open('/cvs/cvsweb.cgi/~checkout~/code/nel/src/net/unitime.cpp?rev=1.31','cvs_checkout','resizeable,scrollbars');"><b>download</b></A>)<BR>
+Revision <B>1.31</B>, <i>Fri Dec 28 10:17:21 2001 UTC</i> (7 months ago) by <i>lecroart</i>
+<BR>Branch: <b>MAIN</b>
+<BR>CVS Tags: <b>georges_v2, HEAD</b><BR>Changes since <b>1.30: +12 -11
+ lines</b><PRE>
+ADDED: support of precompilated header on visual
+</PRE>
+</td></tr></table><HR noshade><PRE>/** \file unitime.cpp
+ * _CUniTime class
+ *
+ * $Id: unitime.cpp,v 1.31 2001/12/28 10:17:21 lecroart Exp $
+ */
+
+/* Copyright, 2000 Nevrax Ltd.
+ *
+ * This file is part of NEVRAX NEL.
+ * NEVRAX NEL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+
+ * NEVRAX NEL is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with NEVRAX NEL; see the file COPYING. If not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include &quot;stdnet.h&quot;
+
+#include &quot;nel/net/callback_client.h&quot;
+#include &quot;nel/net/callback_server.h&quot;
+#include &quot;nel/net/naming_client.h&quot;
+#include &quot;nel/net/message.h&quot;
+
+#include &quot;nel/net/unitime.h&quot;
+
+using namespace NLMISC;
+using namespace std;
+
+namespace NLNET
+{
+
+TTime _CUniTime::_SyncUniTime = 0;
+TTime _CUniTime::_SyncLocalTime = 0;
+bool _CUniTime::_Simulate = false;
+
+bool _CUniTime::Sync = false;
+
+
+void _CUniTime::setUniTime (NLMISC::TTime uTime, NLMISC::TTime lTime)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+/* &nbsp; &nbsp; &nbsp;if (Sync)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TTime lt = getLocalTime ();
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TTime delta = uTime - lTime + _SyncLocalTime - _SyncUniTime;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;_CUniTime::setUniTime(%&quot;NL_I64&quot;d, %&quot;NL_I64&quot;d): Resyncing delta %&quot;NL_I64&quot;dms&quot;,uTime,lTime,delta);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;else
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;_CUniTime::setUniTime(%&quot;NL_I64&quot;d, %&quot;NL_I64&quot;d)&quot;,uTime,lTime);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sync = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;_SyncUniTime = uTime;
+ &nbsp; &nbsp; &nbsp; &nbsp;_SyncLocalTime = lTime;
+*/}
+
+void _CUniTime::setUniTime (NLMISC::TTime uTime)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+// &nbsp; &nbsp; &nbsp;setUniTime (uTime, getLocalTime ());
+}
+
+
+
+TTime _CUniTime::getUniTime ()
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;return 0;
+/* &nbsp; &nbsp; &nbsp;if (!Sync)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlerror (&quot;called getUniTime before calling syncUniTimeFromServer&quot;);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;return getLocalTime () - (_SyncLocalTime - _SyncUniTime);
+*/
+}
+
+
+const char *_CUniTime::getStringUniTime ()
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;return getStringUniTime(_CUniTime::getUniTime());
+}
+
+
+const char *_CUniTime::getStringUniTime (TTime ut)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;static char str[512];
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 ms = (uint32) (ut % 1000); // time in ms 1000ms dans 1s
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 1000;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 s = (uint32) (ut % 60); // time in seconds 60s dans 1mn
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 60;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 m = (uint32) (ut % 60); // time in minutes 60m dans 1h
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 60;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 h = (uint32) (ut % 9); // time in hours 9h dans 1j
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 9;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 day = (uint32) (ut % (8*4)); // time in days 8day dans 1month
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 8;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 week = (uint32) (ut % 4); // time in weeks 4week dans 1month
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 4;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 month = (uint32) (ut % 12); // time in months 12month dans 1year
+ &nbsp; &nbsp; &nbsp; &nbsp;ut /= 12;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;uint &nbsp;year = &nbsp;(uint32) ut; &nbsp; &nbsp; &nbsp; &nbsp;// time in years
+
+ &nbsp; &nbsp; &nbsp; &nbsp;smprintf (str, 512, &quot;%02d/%02d/%04d (week %d) %02d:%02d:%02d.%03d&quot;, day+1, month+1, year+1, week+1, h, m, s, ms);
+ &nbsp; &nbsp; &nbsp; &nbsp;return str;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////// SYNCHRONISATION BETWEEN TIME SERVICE AND OTHER SERVICES ////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static bool GetUniversalTime;
+static uint32 GetUniversalTimeSecondsSince1970;
+static TTime GetUniversalTimeUniTime;
+
+
+static void cbGetUniversalTime (CMessage &amp;msgin, TSockId from, CCallbackNetBase &amp;netbase)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;// get the association between a date and unitime
+ &nbsp; &nbsp; &nbsp; &nbsp;msgin.serial (GetUniversalTimeSecondsSince1970);
+ &nbsp; &nbsp; &nbsp; &nbsp;msgin.serial (GetUniversalTimeUniTime);
+ &nbsp; &nbsp; &nbsp; &nbsp;GetUniversalTime = true;
+}
+
+static TCallbackItem UniTimeCallbackArray[] =
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;{ &quot;GUT&quot;, cbGetUniversalTime }
+};
+
+void _CUniTime::syncUniTimeFromService (CCallbackNetBase::TRecordingState rec, const CInetAddress *addr)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;/*
+ &nbsp; &nbsp; &nbsp; &nbsp;TTime deltaAdjust, lt;
+ &nbsp; &nbsp; &nbsp; &nbsp;uint32 firstsecond, nextsecond;
+ &nbsp; &nbsp; &nbsp; &nbsp;TTime before, after, delta;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// create a message with type in the full text format
+ &nbsp; &nbsp; &nbsp; &nbsp;CMessage msgout (&quot;AUT&quot;);
+ &nbsp; &nbsp; &nbsp; &nbsp;CCallbackClient server( rec, &quot;TS.nmr&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;server.addCallbackArray (UniTimeCallbackArray, sizeof (UniTimeCallbackArray) / sizeof (UniTimeCallbackArray[0]));
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if (addr == NULL)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CNamingClient::lookupAndConnect (&quot;TS&quot;, server);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;else
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;server.connect (*addr);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if (!server.connected()) goto error;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;server.send (msgout);
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// before time
+ &nbsp; &nbsp; &nbsp; &nbsp;before = CTime::getLocalTime ();
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// receive the answer
+ &nbsp; &nbsp; &nbsp; &nbsp;GetUniversalTime = false;
+ &nbsp; &nbsp; &nbsp; &nbsp;while (!GetUniversalTime)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!server.connected()) goto error;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;server.update ();
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlSleep( 0 );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// after, before and delta is not used. It's only for information purpose.
+ &nbsp; &nbsp; &nbsp; &nbsp;after = CTime::getLocalTime ();
+ &nbsp; &nbsp; &nbsp; &nbsp;delta = after - before;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;_CUniTime::syncUniTimeFromService(): ping:%&quot;NL_I64&quot;dms, time:%ds, unitime:%&quot;NL_I64&quot;dms&quot;, delta, GetUniversalTimeSecondsSince1970, GetUniversalTimeUniTime);
+
+// &lt;-- from here to the &quot;--&gt;&quot; comment, the block must be executed in less than one second or an infinite loop occurs
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// get the second
+ &nbsp; &nbsp; &nbsp; &nbsp;firstsecond = CTime::getSecondsSince1970 ();
+ &nbsp; &nbsp; &nbsp; &nbsp;nextsecond = firstsecond+1;
+ &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp;// wait the next start of the second (take 100% of CPU to be more accurate)
+ &nbsp; &nbsp; &nbsp; &nbsp;while (nextsecond != CTime::getSecondsSince1970 ())
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlassert (CTime::getSecondsSince1970 () &lt;= nextsecond);
+
+// --&gt;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// get the local time of the beginning of the next second
+ &nbsp; &nbsp; &nbsp; &nbsp;lt = CTime::getLocalTime ();
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( ! _Simulate )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (abs((sint32)((TTime)nextsecond - (TTime)GetUniversalTimeSecondsSince1970)) &gt; 10)
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlerror (&quot;the time delta (between me and the Time Service) is too big (more than 10s), servers aren't NTP synchronized&quot;);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// compute the delta between the other side and our side number of second since 1970
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deltaAdjust = ((TTime) nextsecond - (TTime) GetUniversalTimeSecondsSince1970) * 1000;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// adjust the unitime to the current localtime
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetUniversalTimeUniTime += deltaAdjust;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;_CUniTime::syncUniTimeFromService(): rtime:%ds, runitime:%&quot;NL_I64&quot;ds, rlocaltime:%&quot;NL_I64&quot;d, deltaAjust:%&quot;NL_I64&quot;dms&quot;, nextsecond, GetUniversalTimeUniTime, lt, deltaAdjust);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;else
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;_CUniTime::syncUniTimeFromService(): runitime:%&quot;NL_I64&quot;ds, rlocaltime:%&quot;NL_I64&quot;d&quot;, GetUniversalTimeUniTime, lt);
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;_CUniTime::setUniTime (GetUniversalTimeUniTime, lt);
+
+ &nbsp; &nbsp; &nbsp; &nbsp;server.disconnect ();
+ &nbsp; &nbsp; &nbsp; &nbsp;return;
+
+error:
+ &nbsp; &nbsp; &nbsp; &nbsp;nlerror (&quot;Time Service is not found, lost or can't synchronize universal time&quot;);
+*/
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////// SYNCHRONISATION BETWEEN CLIENT AND SHARD ///////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Server part
+
+static void cbServerAskUniversalTime (CMessage&amp; msgin, TSockId from, CCallbackNetBase &amp;netbase)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;TTime ut = _CUniTime::getUniTime ();
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// afficher l adresse de celui qui demande
+ &nbsp; &nbsp; &nbsp; &nbsp;nlinfo(&quot;Send the universal time %&quot;NL_I64&quot;d to '%s'&quot;, ut, netbase.hostAddress(from).asString().c_str());
+ &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp;CMessage msgout (netbase.getSIDA(), &quot;GUT&quot;);
+ &nbsp; &nbsp; &nbsp; &nbsp;msgout.serial (ut);
+ &nbsp; &nbsp; &nbsp; &nbsp;netbase.send (msgout, from);
+}
+
+TCallbackItem ServerTimeServiceCallbackArray[] =
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;{ &quot;AUT&quot;, cbServerAskUniversalTime },
+};
+
+void _CUniTime::installServer (CCallbackServer *server)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;static bool alreadyAddedCallback = false;
+ &nbsp; &nbsp; &nbsp; &nbsp;nlassert (server != NULL);
+ &nbsp; &nbsp; &nbsp; &nbsp;nlassert (!alreadyAddedCallback);
+
+ &nbsp; &nbsp; &nbsp; &nbsp;server-&gt;addCallbackArray (ServerTimeServiceCallbackArray, sizeof (ServerTimeServiceCallbackArray) / sizeof (ServerTimeServiceCallbackArray[0]));
+ &nbsp; &nbsp; &nbsp; &nbsp;alreadyAddedCallback = true;
+}
+
+// Client part
+
+static bool GetClientUniversalTime;
+static TTime GetClientUniversalTimeUniTime;
+
+static void cbClientGetUniversalTime (CMessage &amp;msgin, TSockId from, CCallbackNetBase &amp;netbase)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+ &nbsp; &nbsp; &nbsp; &nbsp;// get the association between a date and unitime
+ &nbsp; &nbsp; &nbsp; &nbsp;msgin.serial (GetClientUniversalTimeUniTime);
+ &nbsp; &nbsp; &nbsp; &nbsp;GetClientUniversalTime = true;
+}
+
+static TCallbackItem ClientUniTimeCallbackArray[] =
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;{ &quot;GUT&quot;, cbClientGetUniversalTime }
+};
+
+
+void _CUniTime::syncUniTimeFromServer (CCallbackClient *client)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlstop;
+/* &nbsp; &nbsp; &nbsp;static bool alreadyAddedCallback = false;
+ &nbsp; &nbsp; &nbsp; &nbsp;nlassert (client != NULL);
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if (!alreadyAddedCallback)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;client-&gt;addCallbackArray (ClientUniTimeCallbackArray, sizeof (ClientUniTimeCallbackArray) / sizeof (ClientUniTimeCallbackArray[0]));
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;alreadyAddedCallback = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;sint attempt = 0;
+ &nbsp; &nbsp; &nbsp; &nbsp;TTime bestdelta = 60000; &nbsp; &nbsp; &nbsp; &nbsp;// 1 minute
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if (!client-&gt;connected ()) goto error;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;while (attempt &lt; 10)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CMessage msgout (client-&gt;getSIDA(), &quot;AUT&quot;);
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!client-&gt;connected()) goto error;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// send the message
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;client-&gt;send (msgout);
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// before time
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TTime before = CTime::getLocalTime ();
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// receive the answer
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetClientUniversalTime = false;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (!GetClientUniversalTime)
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!client-&gt;connected()) goto error;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;client-&gt;update ();
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TTime after = CTime::getLocalTime (), delta = after - before;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (delta &lt; 10 || delta &lt; bestdelta)
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bestdelta = delta;
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_CUniTime::setUniTime (GetClientUniversalTimeUniTime, (before+after)/2);
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (delta &lt; 10) break;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;attempt++;
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;client-&gt;disconnect ();
+ &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;Universal time is %&quot;NL_I64&quot;dms with a mean error of %&quot;NL_I64&quot;dms&quot;, _CUniTime::getUniTime(), bestdelta/2);
+ &nbsp; &nbsp; &nbsp; &nbsp;return;
+error:
+ &nbsp; &nbsp; &nbsp; &nbsp;nlwarning (&quot;there's no connection or lost or can't synchronize universal time&quot;);
+*/
+}
+
+
+//
+// Commands
+//
+/*
+NLMISC_COMMAND (time, &quot;displays the universal time&quot;, &quot;&quot;)
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;if(args.size() != 0) return false;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( _CUniTime::Sync )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log.displayNL (&quot;CTime::getLocalTime(): %&quot;NL_I64&quot;dms, _CUniTime::getUniTime(): %&quot;NL_I64&quot;dms&quot;, CTime::getLocalTime (), _CUniTime::getUniTime ());
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log.displayNL (&quot;_CUniTime::getStringUniTime(): '%s'&quot;, _CUniTime::getStringUniTime());
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;else
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log.displayNL (&quot;CTime::getLocalTime(): %&quot;NL_I64&quot;dms &lt;Universal time not sync&gt;&quot;, CTime::getLocalTime ());
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;return true;
+}
+*/
+
+} // NLNET
+</PRE> \ No newline at end of file