/////////////////////////////////////////////////////////////////////////////
-// Name: timercmn.cpp
+// Name: common/timercmn.cpp
// Purpose: Common timer implementation
// Author: Julian Smart
-// Modified by:
+// Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
#ifdef __GNUG__
-//#pragma implementation "timercmn.h"
-#pragma implementation
+ #pragma implementation "timerbase.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#ifndef WX_PRECOMP
-#include "wx/defs.h"
-#include "wx/list.h"
+ #include "wx/intl.h"
+ #include "wx/log.h"
#endif
#include "wx/timer.h"
-#ifdef __SVR4__
-#define __SYSV__
+// I'm told VMS is POSIX, so should have localtime()
+#if defined(__WXMSW__) || defined(__VMS__) || defined(__WXPM__) || defined(__WXMAC__)
+ // configure might have found it already for us
+ #ifndef HAVE_LOCALTIME
+ #define HAVE_LOCALTIME
+ #endif
#endif
-#include <time.h>
-#ifndef __WXMAC__
-#include <sys/types.h>
-#endif
+// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here
-#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__)
-#include <sys/timeb.h>
+#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM)
+ #include <windows.h>
#endif
-#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
- defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__)
-#include <sys/time.h>
+#if defined(HAVE_GETTIMEOFDAY)
+ #include <sys/time.h>
+ #include <unistd.h>
+#elif defined(HAVE_LOCALTIME)
+ #include <time.h>
+ #ifndef __WXMAC__
+ #include <sys/types.h> // for time_t
+ #endif
+#elif defined(HAVE_FTIME)
+ #include <sys/timeb.h>
+#else
+ #error "no function to find the current time on this system"
#endif
-#ifdef __MINGW32__
-#include "windows.h"
-#endif
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
-#if defined(__SUN__) || defined(__OSF__)
-// At least on Sun, ftime is undeclared.
-// Need to be verified on other platforms.
-extern "C" int ftime(struct timeb *tp);
-// extern "C" time_t time(time_t);
-// #include <sys/timeb.h>
-#if defined(__SVR4__) && !defined(__ALPHA__)
-// ditto for gettimeofday on Solaris 2.x.
-extern "C" int gettimeofday(struct timeval *tp, void *);
-#endif
-#endif
+// on some really old systems gettimeofday() doesn't have the second argument,
+// define wxGetTimeOfDay() to hide this difference
+#ifdef HAVE_GETTIMEOFDAY
+ #ifdef WX_GETTIMEOFDAY_NO_TZ
+ struct timezone;
+ #define wxGetTimeOfDay(tv, tz) gettimeofday(tv)
+ #else
+ #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz))
+ #endif
+#endif // HAVE_GETTIMEOFDAY
-/*
- * Timer functions
- *
- */
+// ============================================================================
+// implementation
+// ============================================================================
-long wxStartTime = 0;
-void wxStartTimer(void)
+// ----------------------------------------------------------------------------
+// wxStopWatch
+// ----------------------------------------------------------------------------
+
+void wxStopWatch::Start(long t)
{
-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
-#else
- gettimeofday(&tp);
-#endif
- wxStartTime = 1000*tp.tv_sec + tp.tv_usec/1000;
-#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__) || defined(__MWERKS__))
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- wxStartTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
-#else
- struct timeb tp;
- ftime(&tp);
- wxStartTime = 1000*tp.time + tp.millitm;
-#endif
+ m_t0 = wxGetCurrentMTime() - t;
+
+ m_pause = 0;
}
-// Returns elapsed time in milliseconds
-long wxGetElapsedTime(bool resetTimer)
+long wxStopWatch::Time() const
{
-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
-#else
- gettimeofday(&tp);
-#endif
- long oldTime = wxStartTime;
- long newTime = 1000*tp.tv_sec + tp.tv_usec / 1000;
- if (resetTimer)
- wxStartTime = newTime;
-#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__)|| defined(__MWERKS__))
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- long oldTime = wxStartTime;
- long newTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
- if (resetTimer)
- wxStartTime = newTime;
-#else
- struct timeb tp;
- ftime(&tp);
- long oldTime = wxStartTime;
- long newTime = 1000*tp.time + tp.millitm;
- if (resetTimer)
- wxStartTime = newTime;
-#endif
- return newTime - oldTime;
+ return m_pause ? m_pause : GetElapsedTime();
}
-// EXPERIMENTAL: comment this out if it doesn't compile.
-#ifndef __VMS__
-bool wxGetLocalTime(long *timeZone, int *dstObserved)
+// ----------------------------------------------------------------------------
+// old timer functions superceded by wxStopWatch
+// ----------------------------------------------------------------------------
+
+static long wxStartTime = 0;
+
+// starts the global timer
+void wxStartTimer()
{
-#if defined(__MINGW32__) && defined(__EGCS__)
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- *timeZone = timezone; // tp->tm_gmtoff; // ???
- *dstObserved = tp->tm_isdst;
-#elif defined(__MINGW32__)
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- timeb tz;
- ftime(& tz);
- *timeZone = tz._timezone;
- *dstObserved = tp->tm_isdst;
-#else
+ wxStartTime = wxGetCurrentMTime();
+}
-#if (((defined(__SYSV__) && !defined(__HPUX__)) || defined(__MSDOS__) || defined(__WXMSW__)) && !defined(__GNUWIN32__) && !defined(__MWERKS__))
-#ifdef __BORLANDC__
- /* Borland uses underscores */
- *timeZone = _timezone;
- *dstObserved = _daylight;
-#else
- *timeZone = timezone;
- *dstObserved = daylight;
-#endif
-#elif defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || defined(__MWERKS__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
-#ifndef __MWERKS__ // shouldn't this be one scope below ?
- struct timeval tp;
-#endif
-#if defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32))
- struct timezone tz;
- gettimeofday(&tp, &tz);
- *timeZone = 60*(tz.tz_minuteswest);
- *dstObserved = tz.tz_dsttime;
-#else
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
-#ifndef __MWERKS__
- *timeZone = tp->tm_gmtoff; // ???
-#else
- *timeZone = 0 ;
-#endif
- *dstObserved = tp->tm_isdst;
-#endif
-#elif defined(__WXSTUBS__)
- return FALSE;
-#else
-// #error wxGetLocalTime not implemented.
- struct timeval tp;
- struct timezone tz;
- gettimeofday(&tp, &tz);
- *timeZone = 60*(tz.tz_minuteswest);
- *dstObserved = tz.tz_dsttime;
-#endif
-#endif
- // __MINGW32__
- return TRUE;
+// Returns elapsed time in milliseconds
+long wxGetElapsedTime(bool resetTimer)
+{
+ long oldTime = wxStartTime;
+ long newTime = wxGetCurrentMTime();
+
+ if ( resetTimer )
+ wxStartTime = newTime;
+
+ return newTime - oldTime;
}
-#endif
+
// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
-long wxGetCurrentTime(void)
+long wxGetCurrentTime()
{
-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
+ return wxGetCurrentMTime() / 1000;
+}
+
+// ----------------------------------------------------------------------------
+// the functions to get the current time and timezone info
+// ----------------------------------------------------------------------------
+
+// return GMT time in millisecond
+long wxGetCurrentMTime()
+{
+#if defined(__WIN32__)
+ SYSTEMTIME st;
+ ::GetLocalTime(&st);
+
+ return 1000*(60*(60*st.wHour+st.wMinute)+st.wSecond)+st.wMilliseconds;
#else
- gettimeofday(&tp);
-#endif
- return tp.tv_sec;
-#else // (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__))
- return time(0);
-#endif
-/*
+#if defined(HAVE_LOCALTIME)
+ time_t t0 = time(&t0);
+ if ( t0 != (time_t)-1 )
+ {
+ struct tm *tp = localtime(&t0);
+
+ if ( tp )
+ {
+ return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
+ }
+ }
+#elif defined(HAVE_GETTIMEOFDAY)
+ struct timeval tp;
+ if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
+ {
+ return (1000*tp.tv_sec + tp.tv_usec / 1000);
+ }
+#elif defined(HAVE_FTIME)
+ struct timeb tp;
+ if ( ftime(&tp) == 0 )
+ {
+ return (1000*tp.time + tp.millitm);
+ }
#else
- struct timeb tp;
- ftime(&tp);
- return tp.time;
+ #error "no function to find the current time on this system"
#endif
-*/
+
+ wxLogSysError(_("Failed to get the system time"));
+
+ return -1;
+#endif // __WIN32__/!__WIN32__
}
+bool wxGetLocalTime(long *timeZone, int *dstObserved)
+{
+#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM)
+ time_t t0 = time(&t0);
+ if ( t0 != (time_t)-1 )
+ {
+ struct tm *tm = localtime(&t0);
+
+ if ( tm )
+ {
+ *timeZone = tm->tm_gmtoff;
+ *dstObserved = tm->tm_isdst;
+
+ return TRUE;
+ }
+ }
+#elif defined(HAVE_GETTIMEOFDAY) && !defined(WX_GETTIMEOFDAY_NO_TZ)
+ struct timeval tp;
+ struct timezone tz;
+ if ( gettimeofday(&tp, &tz) != -1 )
+ {
+ *timeZone = 60*tz.tz_minuteswest;
+ *dstObserved = tz.tz_dsttime;
+
+ return TRUE;
+ }
+#elif defined(HAVE_FTIME)
+ struct timeb tb;
+ if ( ftime(&tb) == 0 )
+ {
+ *timeZone = 60*tb.timezone;
+ *dstObserved = tb.dstflag;
+ }
+#else // no standard function return tz info
+ // special hacks for known compilers
+ #if defined(__BORLANDC__) || defined(__VISUALC__)
+ *timeZone = _timezone;
+ *dstObserved = _daylight;
+ #elif defined(__SALFORDC__)
+ *timeZone = _timezone;
+ *dstObserved = daylight;
+ #elif defined(__VISAGECPP__)
+ *timeZone = _timezone;
+ *dstObserved = daylight;
+ #elif defined(__WIN32__)
+ TIME_ZONE_INFORMATION tzInfo;
+ switch ( GetTimeZoneInformation(&tzInfo) )
+ {
+ default:
+ wxFAIL_MSG(_T("unknown GetTimeZoneInformation return code"));
+ // fall through
+
+ case TIME_ZONE_ID_UNKNOWN:
+ case TIME_ZONE_ID_STANDARD:
+ *dstObserved = FALSE;
+ break;
+
+ case TIME_ZONE_ID_DAYLIGHT:
+ *dstObserved = TRUE;
+ break;
+ }
+
+ *timeZone = 60*tzInfo.Bias;
+ #else
+ wxFAIL_MSG(_T("wxGetLocalTime() not implemented"));
+ #endif // compiler
+#endif // all ways in the known Universe to get tz info
+
+ return FALSE;
+}