]>
Commit | Line | Data |
---|---|---|
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 | #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) | |
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 | |
32 | #include "wx/msw/wrapwin.h" | |
33 | #endif | |
34 | ||
35 | #include "wx/msw/wince/time.h" | |
36 | #include <winbase.h> | |
37 | ||
38 | #define is_leap(y) (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) | |
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 | |
47 | ||
48 | ||
49 | long timezone ; // global variable | |
50 | ||
51 | ||
52 | //////////////////////////////////////////////////////////////////////// | |
53 | // Common code for localtime and gmtime (static) | |
54 | //////////////////////////////////////////////////////////////////////// | |
55 | static struct tm * __cdecl common_localtime(const time_t * WXUNUSED(t), BOOL bLocal) | |
56 | { | |
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 | |
98 | ||
99 | return res; | |
100 | } | |
101 | ||
102 | //////////////////////////////////////////////////////////////////////// | |
103 | // Receive the number of seconds elapsed since midnight(00:00:00) | |
104 | // and convert a time value and corrects for the local time zone | |
105 | //////////////////////////////////////////////////////////////////////// | |
106 | struct tm * __cdecl localtime(const time_t * t) | |
107 | { | |
108 | return common_localtime(t, DO_LOCALTIME) ; | |
109 | } | |
110 | ||
111 | //////////////////////////////////////////////////////////////////////// | |
112 | // Receives the number of seconds elapsed since midnight(00:00:00) | |
113 | // and converts a time value WITHOUT correcting for the local time zone | |
114 | //////////////////////////////////////////////////////////////////////// | |
115 | struct tm * __cdecl gmtime(const time_t *t) | |
116 | { | |
117 | return common_localtime(t, DO_GMTIME) ; | |
118 | } | |
119 | ||
120 | ||
121 | //////////////////////////////////////////////////////////////////////// | |
122 | // Common code for conversion of struct tm into time_t (static) | |
123 | //////////////////////////////////////////////////////////////////////// | |
124 | static time_t __cdecl common_tm_to_time(int day, int month, int year, int hour, int minute, int second) | |
125 | { | |
126 | time_t prog = 0 ; | |
127 | static int mdays[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 } ; | |
128 | ||
129 | while (--month) | |
130 | { | |
131 | prog += mdays[month - 1] ; | |
132 | if (month == 2 && is_leap(year)) | |
133 | prog++ ; | |
134 | } | |
135 | ||
136 | // Calculate seconds in elapsed days | |
137 | prog = day - 1 ; // align first day of the year to zero | |
138 | prog += (DAYS_IN_ONE_YEAR * (year - 1970) + (year - 1901) / 4 - 19) ; | |
139 | prog *= SECONDS_IN_ONE_DAY ; | |
140 | ||
141 | // Add Calculated elapsed seconds in the current day | |
142 | prog += (hour * SECONDS_IN_ONE_HOUR + minute * | |
143 | SECONDS_IN_ONE_MIN + second) ; | |
144 | ||
145 | return prog ; | |
146 | } | |
147 | ||
148 | ||
149 | //////////////////////////////////////////////////////////////////////// | |
150 | // Returns the number of seconds elapsed since | |
151 | // midnight(00:00:00) of 1 January 1970 | |
152 | //////////////////////////////////////////////////////////////////////// | |
153 | time_t __cdecl time(time_t *t) | |
154 | { | |
155 | time_t prog = 0 ; | |
156 | ||
157 | if (t != NULL) | |
158 | { | |
159 | SYSTEMTIME SystemTime; | |
160 | ||
161 | ::GetLocalTime(&SystemTime) ; | |
162 | prog = common_tm_to_time(SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear, | |
163 | SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond) ; | |
164 | *t = prog ; | |
165 | } | |
166 | ||
167 | return prog ; | |
168 | } | |
169 | ||
170 | //////////////////////////////////////////////////////////////////////// | |
171 | // Converts the local time provided by struct tm | |
172 | // into a time_t calendar value | |
173 | //////////////////////////////////////////////////////////////////////// | |
174 | time_t __cdecl mktime(struct tm *t) | |
175 | { | |
176 | 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)) ; | |
177 | } | |
178 | ||
179 | ||
180 | size_t __cdecl wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *) | |
181 | { | |
182 | // TODO : maybe copy something from wxString::Printf | |
183 | ||
184 | return 0; | |
185 | } |