X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f3ac409263ef169b015057f2718c6a98498f163..85d11a7072d9ee43744f6f043d98901967dcdf8f:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index b1556e325e..8a34f3cfda 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,230 +1,247 @@ ///////////////////////////////////////////////////////////////////////////// -// 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 +// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here -#ifndef __WXMAC__ -#include +#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM) + #include #endif -#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__) -#include +#if defined(HAVE_GETTIMEOFDAY) + #include + #include +#elif defined(HAVE_LOCALTIME) + #include + #ifndef __WXMAC__ + #include // for time_t + #endif +#elif defined(HAVE_FTIME) + #include +#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 -#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 -#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