/////////////////////////////////////////////////////////////////////////////
-// 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"
-#if defined(__SVR4__) && !defined(__SYSV__)
-#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>
+// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here
-#ifndef __WXMAC__
-#include <sys/types.h>
+#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM)
+ #include <windows.h>
#endif
-#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__)
-#include <sys/timeb.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
-#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
- defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
- defined(__SALFORDC__) || defined(__EMX__)
-#include <sys/time.h>
-#endif
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
-#ifdef __MINGW32__
-#include "windows.h"
-#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
-#if defined(__SUN__) || defined(__OSF__) || defined(__FreeBSD__)
-// At least on Sun, ftime is undeclared.
-// Need to be verified on other platforms.
-extern "C" int ftime(struct timeb *tp);
-//extern "C" int gettimeofday(struct timeval *tp, void *);
-// 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
+// ============================================================================
+// implementation
+// ============================================================================
-/*
- * Timer functions
- *
- */
+// ----------------------------------------------------------------------------
+// wxStopWatch
+// ----------------------------------------------------------------------------
-long wxStartTime = 0;
-void wxStartTimer(void)
+void wxStopWatch::Start(long t)
{
- wxStartTime=wxGetCurrentMTime();
+ m_t0 = wxGetCurrentMTime() - t;
+
+ m_pause = 0;
}
-// Returns elapsed time in milliseconds
-long wxGetElapsedTime(bool resetTimer)
+long wxStopWatch::Time() const
{
- long oldTime = wxStartTime;
- long newTime=wxGetCurrentMTime();
-
- if (resetTimer) wxStartTime = newTime;
- return newTime - oldTime;
+ return m_pause ? m_pause : GetElapsedTime();
}
+// ----------------------------------------------------------------------------
+// old timer functions superceded by wxStopWatch
+// ----------------------------------------------------------------------------
-// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
-long wxGetCurrentTime(void)
+static long wxStartTime = 0;
+
+// starts the global timer
+void wxStartTimer()
{
- return wxGetCurrentMTime()/1000;
+ wxStartTime = wxGetCurrentMTime();
}
-// return GMT time in millisecond
-long wxGetCurrentMTime()
+// Returns elapsed time in milliseconds
+long wxGetElapsedTime(bool resetTimer)
{
-#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
- return (1000*tp.tv_sec + tp.tv_usec / 1000);
-#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \
- defined(__MINGW32__)|| defined(__MWERKS__) || defined(__FreeBSD__))
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
-#else
- struct timeb tp;
- ftime(&tp);
- return (1000*tp.time + tp.millitm);
-#endif
-}
+ long oldTime = wxStartTime;
+ long newTime = wxGetCurrentMTime();
-//---------------
-// wxChrono class
-// This class encapsulates the above fonctions,
-// such that several wxChrono can be created
-// simultaneously
+ if ( resetTimer )
+ wxStartTime = newTime;
-wxChrono::wxChrono()
-{
- Start();
+ return newTime - oldTime;
}
-void wxChrono::Start(long t)
-{
- m_t0=wxGetCurrentMTime()-t;
- m_pause=0;
-}
-void wxChrono::Pause()
+// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
+long wxGetCurrentTime()
{
- m_pause=wxGetCurrentMTime()-m_t0;
+ return wxGetCurrentMTime() / 1000;
}
-void wxChrono::Resume()
-{
- m_t0=wxGetCurrentMTime()-m_pause;
- m_pause=0;
-}
+// ----------------------------------------------------------------------------
+// the functions to get the current time and timezone info
+// ----------------------------------------------------------------------------
-long wxChrono::Time()
+// return GMT time in millisecond
+long wxGetCurrentMTime()
{
- if (m_pause) return m_pause;
- return wxGetCurrentMTime()-m_t0;
-}
+#if defined(__WIN32__)
+ SYSTEMTIME st;
+ ::GetLocalTime(&st);
+ return 1000*(60*(60*st.wHour+st.wMinute)+st.wSecond)+st.wMilliseconds;
+#else
+#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
+ #error "no function to find the current time on this system"
+#endif
+ wxLogSysError(_("Failed to get the system time"));
+
+ return -1;
+#endif // __WIN32__/!__WIN32__
+}
-// EXPERIMENTAL: comment this out if it doesn't compile.
-#ifndef __VMS__
bool wxGetLocalTime(long *timeZone, int *dstObserved)
{
-#if defined(__MINGW32__)
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
-# if __GNUC__ == 2 && __GNUC_MINOR__ <= 8
- // gcc 2.8.x or earlier
- timeb tz;
- ftime(& tz);
- *timeZone = tz._timezone;
-# else
- // egcs or gcc 2.95
- *timeZone = _timezone; // tp->tm_gmtoff; // ???
-# endif
- *dstObserved = tp->tm_isdst;
-#else
-// not mingw32...
-#if (((defined(__SYSV__) && !defined(__HPUX__)) || defined(__MSDOS__) || defined(__WXMSW__) || defined(__WXPM__)) \
- && !defined(__GNUWIN32__) && !defined(__MWERKS__) )
-# if defined(__BORLANDC__)
- /* Borland uses underscores */
- *timeZone = _timezone;
- *dstObserved = _daylight;
-# elif defined(__SALFORDC__)
- *timeZone = _timezone;
- *dstObserved = daylight;
-# elif defined(__VISAGECPP__)
- *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;
+#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;
}
-#endif