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