[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kjs
From:       Carlo Segato <brandon.ml () gmail ! com>
Date:       2011-01-06 22:22:36
Message-ID: 20110106222236.3AC26AC8B0 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1212416 by segato:

fix crash on windows for date < 1970 and > 2038
BUG:189321


 M  +41 -0     date_object.cpp  


--- trunk/KDE/kdelibs/kjs/date_object.cpp #1212415:1212416
@@ -61,6 +61,7 @@
 #endif
 
 #if PLATFORM(WIN_OS)
+#include <windows.h>
 #define copysign(x, y) _copysign(x, y)
 #define snprintf _snprintf
 #if !COMPILER(GCC)
@@ -458,7 +459,11 @@
   // check whether time value is outside time_t's usual range
   // make the necessary transformations if necessary
   static bool time_tIsSigned = isTime_tSigned();
+#if PLATFORM(WIN_OS)
+  static double time_tMin = 0; //on windows localtime/gmtime returns NULL for pre \
1970 dates +#else
   static double time_tMin = (time_tIsSigned ? - (double)(1ULL << (8 * sizeof(time_t) \
- 1)) : 0); +#endif
   static double time_tMax = (time_tIsSigned ? (1ULL << (8 * sizeof(time_t) - 1)) - 1 \
: 2 * (double)(1ULL << (8 * sizeof(time_t) - 1)) - 1);  int realYearOffset = 0;
   double milliOffset = 0.0;
@@ -914,6 +919,23 @@
     { "PDT", -420 }
 };
 
+#if PLATFORM(WIN_OS)
+void FileTimeToUnixTime(LPFILETIME pft, double* pt)
+{
+    ULARGE_INTEGER ull;
+    ull.LowPart = pft->dwLowDateTime;
+    ull.HighPart = pft->dwHighDateTime;
+    *pt = (double)(ull.QuadPart / 10000000ULL) - 11644473600ULL;
+}
+
+void SystemTimeToUnixTime(LPSYSTEMTIME pst, double* pt)
+{
+    FILETIME ft;
+    SystemTimeToFileTime(pst, &ft);
+    FileTimeToUnixTime(&ft, pt);
+}
+#endif
+
 static double makeTime(tm *t, double ms, bool utc)
 {
     int utcOffset;
@@ -942,6 +964,7 @@
         t->tm_isdst = -1;
     }
 
+#if !PLATFORM(WIN_OS)
     double yearOffset = 0.0;
     if (t->tm_year < (1971 - 1900) || t->tm_year > (2037 - 1900)) {
         // we'll fool mktime() into believing that this year is within
@@ -967,6 +990,24 @@
     }
 
     return (mktime(t) + utcOffset) * msPerSecond + ms + yearOffset;
+#else
+    SYSTEMTIME st, dt;
+    double tval;
+
+    st.wYear = 1900 + t->tm_year;
+    st.wMonth = t->tm_mon + 1;
+    st.wDayOfWeek = t->tm_wday;
+    st.wDay = t->tm_mday;
+    st.wHour = t->tm_hour;
+    st.wMinute = t->tm_min;
+    st.wSecond = t->tm_sec;
+    st.wMilliseconds = 0;
+
+    TzSpecificLocalTimeToSystemTime(0, &st, &dt);        
+    SystemTimeToUnixTime(&dt, &tval);
+
+    return (tval + utcOffset) * msPerSecond + ms;
+#endif
 }
 
 inline static bool isSpaceLike(char c)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic