]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/time.cpp
applying patch, closes #13045
[wxWidgets.git] / src / common / time.cpp
index 3b60d2743842274b160d9735d926157aca237f1d..5b2460ca6910797294e6b695428b9a80c510e656 100644 (file)
@@ -26,7 +26,7 @@
 #include "wx/time.h"
 
 #ifndef WX_PRECOMP
-    #ifdef __WXMSW__
+    #ifdef __WINDOWS__
         #include "wx/msw/wrapwin.h"
     #endif
     #include "wx/intl.h"
@@ -36,7 +36,7 @@
 #ifndef WX_GMTOFF_IN_TM
     // Define it for some systems which don't (always) use configure but are
     // known to have tm_gmtoff field.
-    #if defined(__WXPALMOS__) || defined(__DARWIN__)
+    #if defined(__DARWIN__)
         #define WX_GMTOFF_IN_TM
     #endif
 #endif
 #  endif
 #endif
 
-#if defined(__MWERKS__) && defined(__WXMSW__)
-#   undef HAVE_FTIME
-#   undef HAVE_GETTIMEOFDAY
-#endif
-
-#ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
 #include <time.h>
 #else
 #include "wx/msw/private.h"
 #include "wx/msw/wince/time.h"
 #endif
-#endif // __WXPALMOS5__
 
 
 #if !defined(__WXMAC__) && !defined(__WXWINCE__)
     #include <sys/timeb.h>
 #endif
 
-#ifdef __WXPALMOS__
-    #include <DateTime.h>
-    #include <TimeMgr.h>
-    #include <SystemMgr.h>
+#if defined(__DJGPP__) || defined(__WINE__)
+    #include <sys/timeb.h>
+    #include <values.h>
 #endif
 
 namespace
@@ -93,6 +85,76 @@ const int MICROSECONDS_PER_SECOND = 1000*1000;
 // implementation
 // ============================================================================
 
+// NB: VC8 safe time functions could/should be used for wxMSW as well probably
+#if defined(__WXWINCE__) && defined(__VISUALC8__)
+
+struct tm *wxLocaltime_r(const time_t *t, struct tm* tm)
+{
+    __time64_t t64 = *t;
+    return _localtime64_s(tm, &t64) == 0 ? tm : NULL;
+}
+
+struct tm *wxGmtime_r(const time_t* t, struct tm* tm)
+{
+    __time64_t t64 = *t;
+    return _gmtime64_s(tm, &t64) == 0 ? tm : NULL;
+}
+
+#else // !wxWinCE with VC8
+
+#if (!defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R)) && wxUSE_THREADS && !defined(__WINDOWS__)
+static wxMutex timeLock;
+#endif
+
+#ifndef HAVE_LOCALTIME_R
+struct tm *wxLocaltime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+  // No need to waste time with a mutex on windows since it's using
+  // thread local storage for localtime anyway.
+  wxMutexLocker locker(timeLock);
+#endif
+
+  // Borland CRT crashes when passed 0 ticks for some reason, see SF bug 1704438
+#ifdef __BORLANDC__
+  if ( !*ticks )
+      return NULL;
+#endif
+
+  const tm * const t = localtime(ticks);
+  if ( !t )
+      return NULL;
+
+  memcpy(temp, t, sizeof(struct tm));
+  return temp;
+}
+#endif // !HAVE_LOCALTIME_R
+
+#ifndef HAVE_GMTIME_R
+struct tm *wxGmtime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+  // No need to waste time with a mutex on windows since it's
+  // using thread local storage for gmtime anyway.
+  wxMutexLocker locker(timeLock);
+#endif
+
+#ifdef __BORLANDC__
+  if ( !*ticks )
+      return NULL;
+#endif
+
+  const tm * const t = gmtime(ticks);
+  if ( !t )
+      return NULL;
+
+  memcpy(temp, gmtime(ticks), sizeof(struct tm));
+  return temp;
+}
+#endif // !HAVE_GMTIME_R
+
+#endif // wxWinCE with VC8/other platforms
+
 // returns the time zone in the C sense, i.e. the difference UTC - local
 // (in seconds)
 int wxGetTimeZone()
@@ -144,15 +206,18 @@ int wxGetTimeZone()
     #else // VC++ < 8
         return timezone;
     #endif
-#elif defined(WX_TIMEZONE) // If WX_TIMEZONE was defined by configure, use it.
-    return WX_TIMEZONE;
-#elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
-    return _timezone;
-#elif defined(__MWERKS__)
-    return 28800;
-#else // unknown platform -- assume it has timezone
-    return timezone;
-#endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM
+#else // Use some kind of time zone variable.
+    // In any case we must initialize the time zone before using it.
+    tzset();
+
+    #if defined(WX_TIMEZONE) // If WX_TIMEZONE was defined by configure, use it.
+        return WX_TIMEZONE;
+    #elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
+        return _timezone;
+    #else // unknown platform -- assume it has timezone
+        return timezone;
+    #endif // different time zone variables
+#endif // different ways to determine time zone
 }
 
 // Get local time as seconds since 00:00:00, Jan 1st 1970
@@ -196,7 +261,7 @@ long wxGetUTCTime()
 
 wxLongLong wxGetUTCTimeUSec()
 {
-#if defined(__WXMSW__)
+#if defined(__WINDOWS__)
     FILETIME ft;
     ::GetSystemTimeAsFileTime(&ft);
 
@@ -227,23 +292,9 @@ wxLongLong wxGetUTCTimeUSec()
 // Get local time as milliseconds since 00:00:00, Jan 1st 1970
 wxLongLong wxGetUTCTimeMillis()
 {
-    wxLongLong val = MILLISECONDS_PER_SECOND;
-
     // If possible, use a function which avoids conversions from
     // broken-up time structures to milliseconds
-#if defined(__WXPALMOS__)
-    DateTimeType thenst;
-    thenst.second  = 0;
-    thenst.minute  = 0;
-    thenst.hour    = 0;
-    thenst.day     = 1;
-    thenst.month   = 1;
-    thenst.year    = 1970;
-    thenst.weekDay = 5;
-    uint32_t now = TimGetSeconds();
-    uint32_t then = TimDateTimeToSeconds (&thenst);
-    return SysTimeToMilliSecs(SysTimeInSecs(now - then));
-#elif defined(__WXMSW__)
+#if defined(__WINDOWS__)
     FILETIME ft;
     ::GetSystemTimeAsFileTime(&ft);
 
@@ -253,7 +304,10 @@ wxLongLong wxGetUTCTimeMillis()
     t /= 10000;
     t -= wxLL(11644473600000); // Unix - Windows epochs difference in ms.
     return t;
-#elif defined(HAVE_GETTIMEOFDAY)
+#else // !__WINDOWS__
+    wxLongLong val = MILLISECONDS_PER_SECOND;
+
+#if defined(HAVE_GETTIMEOFDAY)
     struct timeval tp;
     if ( wxGetTimeOfDay(&tp) != -1 )
     {
@@ -289,6 +343,8 @@ wxLongLong wxGetUTCTimeMillis()
     val *= wxGetUTCTime();
     return val;
 #endif // time functions
+
+#endif // __WINDOWS__/!__WINDOWS__
 }
 
 wxLongLong wxGetLocalTimeMillis()