]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied [ 798206 ] WinCE time.cpp
authorJulian Smart <julian@anthemion.co.uk>
Thu, 11 Sep 2003 07:15:41 +0000 (07:15 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 11 Sep 2003 07:15:41 +0000 (07:15 +0000)
by Marco Cavallini

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23489 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/wince/time.cpp

index d9657f70511f07268dbe470debdf9596343f81aa..22fd23687fd38732023f20a66ded1db52c6f98d0 100644 (file)
@@ -1,11 +1,11 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/msw/wince/time.cpp
 // Purpose:     Implements missing time functionality for WinCE
-// Author:      
-// Modified by: 
-// Created:     2003-07-10
-// RCS-ID:      $Id$
-// Copyright:   
+// Author:      Marco Cavallini (MCK) - wx@koansoftware.com
+// Modified by:
+// Created:     31-08-2003
+// RCS-ID:
+// Copyright:  (c) Marco Cavallini
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #endif
 
 #include "wx/msw/wince/time.h"
+#include <winbase.h>
 
-long timezone = 0;
+#define is_leap(y)   (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
+#define SECONDS_IN_ONE_MINUTE  60
+#define DAYS_IN_ONE_YEAR               365
+#define SECONDS_IN_ONE_MIN             60
+#define SECONDS_IN_ONE_HOUR            3600
+#define SECONDS_IN_ONE_DAY             86400
+#define DEFAULT_TIMEZONE               28800
+#define DO_GMTIME                              0
+#define DO_LOCALTIME                   1
 
-// Hint: use GetSystemTime()
 
-struct tm * __cdecl localtime(const time_t *)
+long timezone ;                // global variable
+
+
+////////////////////////////////////////////////////////////////////////
+// Common code for localtime and gmtime (static)
+////////////////////////////////////////////////////////////////////////
+static struct tm * __cdecl common_localtime(const time_t * t, BOOL bLocal)
 {
-    // TODO
-    return NULL;
-
-    // Possible implementation
-#if 0
-  // Localtime for WinCE
-  // By martin brown (mpatalberta@yahoo.com)
-  // This is really stupid, converting FILETIME to timeval back and
-  // forth.  It assumes FILETIME and DWORDLONG are the same structure
-  // internally.
- TIME_ZONE_INFORMATION pTz;
- const unsigned short int __mon_yday[2][13] =
-  {
-     /* Normal years.  */
-     { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
-    /* Leap years.  */
-     { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
-   };
-
-
-  ULARGE_INTEGER _100ns;
-  ::GetTimeZoneInformation(&pTz);
-
-  // FIXME
-  _100ns.QuadPart = (DWORDLONG) *t * 10000 * 1000 /* + ACE_Time_Value::FILETIME_to_timval_skew */;
-  FILETIME file_time;
-  file_time.dwLowDateTime = _100ns.LowPart;
-  file_time.dwHighDateTime = _100ns.HighPart;
-  
-  FILETIME localtime;
-  SYSTEMTIME systime;
-  FileTimeToLocalFileTime (&file_time, &localtime);
-  FileTimeToSystemTime (&localtime, &systime);
-
-  res->tm_hour = systime.wHour;
-
-  if(pTz.DaylightBias!=0)
-  {
- res->tm_isdst = 1;
-  }
-  else
-  {
- res->tm_isdst = 1;
-  }
-
-  int iLeap;
-  iLeap = (res->tm_year % 4 == 0 && (res->tm_year% 100 != 0 || res->tm_year % 400 == 0));
-  // based on leap select which group to use
-  
-  res->tm_mday = systime.wDay;
-  res->tm_min = systime.wMinute;
-  res->tm_mon = systime.wMonth;
-  res->tm_sec = systime.wSecond;
-  res->tm_wday = systime.wDayOfWeek;
-  res->tm_yday = __mon_yday[iLeap][systime.wMonth] + systime.wDay;
-  res->tm_year = systime.wYear;// this the correct year but bias the value to start at the 1900
-  res->tm_year = res->tm_year - 1900;
-
-  return res;
-#endif
+       wxString str ;
+       SYSTEMTIME SystemTime;
+       TIME_ZONE_INFORMATION pTz;
+       static struct tm st_res ;                       // data holder
+       static struct tm * res = &st_res ;      // data pointer
+       int iLeap;
+       const unsigned short int __mon_yday[2][13] =
+       {
+               // Normal years
+               { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+               // Leap years
+               { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+       };
+
+       ::GetLocalTime(&SystemTime) ;
+       ::GetTimeZoneInformation(&pTz);
+
+       ///////////////////////////////////////////////
+       // Set timezone
+       timezone = pTz.Bias * SECONDS_IN_ONE_MINUTE ;
+       ///////////////////////////////////////////////
+
+       iLeap = is_leap(SystemTime.wYear) ;
+
+       res->tm_hour = SystemTime.wHour;
+       res->tm_min     = SystemTime.wMinute;
+       res->tm_sec = SystemTime.wSecond;
+
+       res->tm_mday = SystemTime.wDay;
+       res->tm_mon = SystemTime.wMonth - 1;// this the correct month but localtime returns month aligned to zero
+       res->tm_year = SystemTime.wYear;        // this the correct year
+       res->tm_year = res->tm_year - 1900;     // but localtime returns the value starting at the 1900
+
+       res->tm_wday = SystemTime.wDayOfWeek;
+       res->tm_yday = __mon_yday[iLeap][res->tm_mon] + SystemTime.wDay - 1; // localtime returns year-day aligned to zero
+
+       // if localtime behavior and daylight saving
+       if (bLocal && pTz.DaylightBias != 0)
+               res->tm_isdst = 1;
+       else
+               res->tm_isdst = 0;      // without daylight saving or gmtime
+
+    return res;
 }
 
-time_t __cdecl time(time_t *)
+////////////////////////////////////////////////////////////////////////
+// Receive the number of seconds elapsed since midnight(00:00:00)
+// and convert a time value and corrects for the local time zone
+////////////////////////////////////////////////////////////////////////
+struct tm * __cdecl localtime(const time_t * t)
 {
-    // TODO
-    return 0;
+       return common_localtime(t, DO_LOCALTIME) ;
 }
 
-size_t __cdecl wcsftime(wchar_t *, size_t, const wchar_t *,
-        const struct tm *)
+////////////////////////////////////////////////////////////////////////
+// Receives the number of seconds elapsed since midnight(00:00:00)
+// and converts a time value WITHOUT correcting for the local time zone
+////////////////////////////////////////////////////////////////////////
+struct tm * __cdecl gmtime(const time_t *t)
 {
-    // TODO
-    return 0;
+       return common_localtime(t, DO_GMTIME) ;
 }
 
-time_t __cdecl mktime(struct tm *)
+
+////////////////////////////////////////////////////////////////////////
+// Common code for conversion of struct tm into time_t   (static)
+////////////////////////////////////////////////////////////////////////
+static time_t __cdecl common_tm_to_time(int day, int month, int year, int hour, int minute, int second)
 {
-    // TODO
-    return 0;
+       time_t prog = 0 ;
+       static int mdays[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 } ;
+
+       while (--month)
+       {
+               prog += mdays[month - 1] ;
+               if (month == 2 && is_leap(year))
+                       prog++ ;
+       }
+
+       // Calculate seconds in elapsed days
+       prog = day - 1 ;                // align first day of the year to zero
+       prog += (DAYS_IN_ONE_YEAR * (year - 1970) + (year - 1901) / 4 - 19) ;
+       prog *= SECONDS_IN_ONE_DAY ;
+
+       // Add Calculated elapsed seconds in the current day
+       prog += (hour * SECONDS_IN_ONE_HOUR + minute *
+                                                               SECONDS_IN_ONE_MIN + second) ;
+
+       return prog ;
 }
 
-struct tm * __cdecl gmtime(const time_t *)
+
+////////////////////////////////////////////////////////////////////////
+// Returns the number of seconds elapsed since
+// midnight(00:00:00) of 1 January 1970
+////////////////////////////////////////////////////////////////////////
+time_t __cdecl time(time_t *t)
 {
-    // TODO
-    return NULL;
+       time_t prog = 0 ;
+
+       if (t != NULL)
+       {
+               SYSTEMTIME SystemTime;
+
+               ::GetLocalTime(&SystemTime) ;
+               prog = common_tm_to_time(SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear,
+                                                       SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond) ;
+               *t = prog ;
+       }
+
+       return prog ;
 }
 
+////////////////////////////////////////////////////////////////////////
+// Converts the local time provided by struct tm
+// into a time_t calendar value
+////////////////////////////////////////////////////////////////////////
+time_t __cdecl mktime(struct tm *t)
+{
+       return (common_tm_to_time(t->tm_mday, t->tm_mon, t->tm_year, t->tm_hour, t->tm_min, t->tm_sec)) ;
+}
+
+
+size_t __cdecl wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *)
+{
+    // TODO : maybe copy something from wxString::Printf
+
+    return 0;
+}