]> git.saurik.com Git - wxWidgets.git/blob - src/msw/wince/time.cpp
WinCE compile fix
[wxWidgets.git] / src / msw / wince / time.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/wince/time.cpp
3 // Purpose: Implements missing time functionality for WinCE
4 // Author: Marco Cavallini (MCK) - wx@koansoftware.com
5 // Modified by:
6 // Created: 31-08-2003
7 // RCS-ID:
8 // Copyright: (c) Marco Cavallini
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ===========================================================================
13 // declarations
14 // ===========================================================================
15
16 // ---------------------------------------------------------------------------
17 // headers
18 // ---------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #ifndef WX_PRECOMP
28 #include "wx/msw/wrapwin.h"
29 #endif
30
31 #include "wx/msw/wince/time.h"
32 #include <winbase.h>
33
34 #define is_leap(y) (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
35 #define SECONDS_IN_ONE_MINUTE 60
36 #define DAYS_IN_ONE_YEAR 365
37 #define SECONDS_IN_ONE_MIN 60
38 #define SECONDS_IN_ONE_HOUR 3600
39 #define SECONDS_IN_ONE_DAY 86400
40 #define DEFAULT_TIMEZONE 28800
41 #define DO_GMTIME 0
42 #define DO_LOCALTIME 1
43
44
45 long timezone ; // global variable
46
47
48 ////////////////////////////////////////////////////////////////////////
49 // Common code for localtime and gmtime (static)
50 ////////////////////////////////////////////////////////////////////////
51
52 static struct tm * __cdecl common_localtime(const time_t *t, BOOL bLocal)
53 {
54 wxLongLong i64;
55 FILETIME ft;
56 wxString str ;
57 SYSTEMTIME SystemTime;
58 TIME_ZONE_INFORMATION pTz;
59 static struct tm st_res ; // data holder
60 static struct tm * res = &st_res ; // data pointer
61 int iLeap;
62 const unsigned short int __mon_yday[2][13] =
63 {
64 // Normal years
65 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
66 // Leap years
67 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
68 };
69
70 if (!*t)
71 ::GetLocalTime(&SystemTime);
72 else
73 {
74 i64 = *t;
75 i64 = i64 * 10000000 + 116444736000000000;
76
77 ft.dwLowDateTime = i64.GetLo();
78 ft.dwHighDateTime = i64.GetHi();
79
80 ::FileTimeToSystemTime(&ft, &SystemTime);
81 }
82
83 ::GetTimeZoneInformation(&pTz);
84
85 ///////////////////////////////////////////////
86 // Set timezone
87 timezone = pTz.Bias * SECONDS_IN_ONE_MINUTE ;
88 ///////////////////////////////////////////////
89
90 iLeap = is_leap(SystemTime.wYear) ;
91
92 res->tm_hour = SystemTime.wHour;
93 res->tm_min = SystemTime.wMinute;
94 res->tm_sec = SystemTime.wSecond;
95
96 res->tm_mday = SystemTime.wDay;
97 res->tm_mon = SystemTime.wMonth - 1; // this the correct month but localtime returns month aligned to zero
98 res->tm_year = SystemTime.wYear; // this the correct year
99 res->tm_year = res->tm_year - 1900; // but localtime returns the value starting at the 1900
100
101 res->tm_wday = SystemTime.wDayOfWeek;
102 res->tm_yday = __mon_yday[iLeap][res->tm_mon] + SystemTime.wDay - 1; // localtime returns year-day aligned to zero
103
104 // if localtime behavior and daylight saving
105 if (bLocal && pTz.DaylightBias != 0)
106 res->tm_isdst = 1;
107 else
108 res->tm_isdst = 0; // without daylight saving or gmtime
109
110 return res;
111 }
112
113 extern "C"
114 {
115
116 ////////////////////////////////////////////////////////////////////////
117 // Receive the number of seconds elapsed since midnight(00:00:00)
118 // and convert a time value and corrects for the local time zone
119 ////////////////////////////////////////////////////////////////////////
120 struct tm * __cdecl localtime(const time_t * t)
121 {
122 return common_localtime(t, DO_LOCALTIME) ;
123 }
124
125 ////////////////////////////////////////////////////////////////////////
126 // Receives the number of seconds elapsed since midnight(00:00:00)
127 // and converts a time value WITHOUT correcting for the local time zone
128 ////////////////////////////////////////////////////////////////////////
129 struct tm * __cdecl gmtime(const time_t *t)
130 {
131 return common_localtime(t, DO_GMTIME) ;
132 }
133
134 }
135
136 ////////////////////////////////////////////////////////////////////////
137 // Common code for conversion of struct tm into time_t (static)
138 ////////////////////////////////////////////////////////////////////////
139 static time_t __cdecl common_tm_to_time(int day, int month, int year, int hour, int minute, int second)
140 {
141 time_t prog = 0 ;
142 static int mdays[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 } ;
143
144 while (--month)
145 {
146 prog += mdays[month - 1] ;
147 if (month == 2 && is_leap(year))
148 prog++ ;
149 }
150
151 // Calculate seconds in elapsed days
152 prog = day - 1 ; // align first day of the year to zero
153 prog += (DAYS_IN_ONE_YEAR * (year - 1970) + (year - 1901) / 4 - 19) ;
154 prog *= SECONDS_IN_ONE_DAY ;
155
156 // Add Calculated elapsed seconds in the current day
157 prog += (hour * SECONDS_IN_ONE_HOUR + minute *
158 SECONDS_IN_ONE_MIN + second) ;
159
160 return prog ;
161 }
162
163 extern "C"
164 {
165
166 ////////////////////////////////////////////////////////////////////////
167 // Returns the number of seconds elapsed since
168 // midnight(00:00:00) of 1 January 1970
169 ////////////////////////////////////////////////////////////////////////
170 time_t __cdecl time(time_t *t)
171 {
172 time_t prog = 0 ;
173
174 if (t != NULL)
175 {
176 SYSTEMTIME SystemTime;
177
178 ::GetLocalTime(&SystemTime) ;
179 prog = common_tm_to_time(SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear,
180 SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond) ;
181 *t = prog ;
182 }
183
184 return prog ;
185 }
186
187 ////////////////////////////////////////////////////////////////////////
188 // Converts the local time provided by struct tm
189 // into a time_t calendar value
190 ////////////////////////////////////////////////////////////////////////
191 time_t __cdecl mktime(struct tm *t)
192 {
193 return (common_tm_to_time(t->tm_mday, t->tm_mon+1, t->tm_year+1900, t->tm_hour, t->tm_min, t->tm_sec)) ;
194 }
195
196
197 size_t __cdecl wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *)
198 {
199 // TODO : maybe copy something from wxString::Printf
200
201 return 0;
202 }
203
204 } // extern "C"