ReactOS 0.4.16-dev-2491-g3dc6630
timezone.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Timedate Control Panel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/timedate/timezone.c
5 * PURPOSE: Time Zone property page
6 * COPYRIGHT: Copyright 2004-2005 Eric Kohl
7 * Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
8 * Copyright 2006 Christoph v. Wittich <Christoph@ActiveVB.de>
9 *
10 */
11
12#include "timedate.h"
13#include <tzlib.h>
14
15typedef struct _TIMEZONE_ENTRY
16{
19 WCHAR Description[128]; /* 'Display' */
20 WCHAR StandardName[33]; /* 'Std' */
21 WCHAR DaylightName[33]; /* 'Dlt' */
24
25
27static int cxSource, cySource;
28
31
32static PTIMEZONE_ENTRY
34{
36 DWORD dwIndex;
37 DWORD i;
38
39 dwIndex = (DWORD)SendMessageW(hwndCombo, CB_GETCURSEL, 0, 0);
40 if (dwIndex == CB_ERR)
41 return NULL;
42
43 for (Entry = TimeZoneListHead, i = 0; i < dwIndex; i++, Entry = Entry->Next)
44 {
45 if (Entry == NULL)
46 return NULL;
47 }
48
49 return Entry;
50}
51
52static BOOL
54{
55 /* If StandardDate.wMonth is 0, DST does not apply to this timezone */
56 return (Entry != NULL && Entry->TimezoneInfo.StandardDate.wMonth != 0);
57}
58
59static VOID
61{
62 HWND hwndCombo = GetDlgItem(hwndDlg, IDC_TIMEZONELIST);
63 HWND hwndCheckbox = GetDlgItem(hwndDlg, IDC_AUTODAYLIGHT);
65 BOOL bHasDst;
66
68 bHasDst = HasDaylightSaving(Entry);
69
70 /* Enable or disable the checkbox based on DST support, and respect user preference when DST is supported */
71 if (bHasDst)
72 {
73 BOOL bAutoDaylight = GetAutoDaylight();
74
75 EnableWindow(hwndCheckbox, TRUE);
76 SendMessageW(hwndCheckbox,
78 bAutoDaylight ? BST_CHECKED : BST_UNCHECKED,
79 0);
80 }
81 else
82 {
83 EnableWindow(hwndCheckbox, FALSE);
84 SendMessageW(hwndCheckbox, BM_SETCHECK, BST_UNCHECKED, 0);
85 }
86}
87
88static
91 LONG Bias,
92 LPWSTR lpDescription)
93{
95
97 while (Entry != NULL)
98 {
99 if (Entry->TimezoneInfo.Bias < Bias)
100 return Entry;
101 if (Entry->TimezoneInfo.Bias == Bias)
102 {
103 if (_wcsicmp(Entry->Description, lpDescription) > 0)
104 return Entry;
105 }
106
107 Entry = Entry->Next;
108 }
109
110 return NULL;
111}
112
113static LONG
115 IN HKEY hZoneKey,
117{
118 LONG lError;
120 PTIMEZONE_ENTRY Current;
121 ULONG DescriptionSize;
122 ULONG StandardNameSize;
123 ULONG DaylightNameSize;
124
126 if (Entry == NULL)
127 {
129 }
130
131 DescriptionSize = sizeof(Entry->Description);
132 StandardNameSize = sizeof(Entry->StandardName);
133 DaylightNameSize = sizeof(Entry->DaylightName);
134
135 lError = QueryTimeZoneData(hZoneKey,
136 NULL,
137 &Entry->TimezoneInfo,
138 Entry->Description,
139 &DescriptionSize,
140 Entry->StandardName,
141 &StandardNameSize,
142 Entry->DaylightName,
143 &DaylightNameSize);
144 if (lError != ERROR_SUCCESS)
145 {
147 return lError;
148 }
149
150 if (TimeZoneListHead == NULL &&
152 {
153 Entry->Prev = NULL;
154 Entry->Next = NULL;
157 }
158 else
159 {
160 Current = GetLargerTimeZoneEntry(Entry->TimezoneInfo.Bias, Entry->Description);
161 if (Current != NULL)
162 {
163 if (Current == TimeZoneListHead)
164 {
165 /* Prepend to head */
166 Entry->Prev = NULL;
167 Entry->Next = TimeZoneListHead;
170 }
171 else
172 {
173 /* Insert before current */
174 Entry->Prev = Current->Prev;
175 Entry->Next = Current;
176 Current->Prev->Next = Entry;
177 Current->Prev = Entry;
178 }
179 }
180 else
181 {
182 /* Append to tail */
183 Entry->Prev = TimeZoneListTail;
184 Entry->Next = NULL;
187 }
188 }
189
190 return ERROR_SUCCESS;
191}
192
193static VOID
195{
197}
198
199static VOID
201{
203
204 while (TimeZoneListHead != NULL)
205 {
207
208 TimeZoneListHead = Entry->Next;
209 if (TimeZoneListHead != NULL)
210 {
212 }
213
215 }
216
218}
219
220
221static VOID
223{
224 TIME_ZONE_INFORMATION TimeZoneInfo;
226 DWORD dwCount;
227 DWORD dwIndex = 0;
228 BOOL bFound = FALSE;
229
230 if (GetTimeZoneInformation(&TimeZoneInfo) == TIME_ZONE_ID_INVALID)
231 {
232 /* Failed to retrieve current time-zone info, reset it */
233 ZeroMemory(&TimeZoneInfo, sizeof(TimeZoneInfo));
234 }
235
236 for (Entry = TimeZoneListHead; Entry != NULL; Entry = Entry->Next)
237 {
238 dwCount = SendMessageW(hwnd,
240 0,
241 (LPARAM)Entry->Description);
242 if (dwCount == CB_ERR || dwCount == CB_ERRSPACE)
243 continue;
244
245 /* If the time-zone was found in the list, skip the tests */
246 if (bFound)
247 continue;
248
249 if (*TimeZoneInfo.StandardName && *Entry->StandardName)
250 {
251 /* Compare by name */
252 if (wcscmp(Entry->StandardName, TimeZoneInfo.StandardName) == 0)
253 {
254 dwIndex = dwCount;
255 bFound = TRUE;
256 }
257 }
258 else
259 {
260 /* Compare by date and bias */
261 if ((Entry->TimezoneInfo.Bias == TimeZoneInfo.Bias) &&
262 (Entry->TimezoneInfo.StandardBias == TimeZoneInfo.StandardBias) &&
263 (Entry->TimezoneInfo.DaylightBias == TimeZoneInfo.DaylightBias) &&
264 (memcmp(&Entry->TimezoneInfo.StandardDate, &TimeZoneInfo.StandardDate, sizeof(SYSTEMTIME)) == 0) &&
265 (memcmp(&Entry->TimezoneInfo.DaylightDate, &TimeZoneInfo.DaylightDate, sizeof(SYSTEMTIME)) == 0))
266 {
267 dwIndex = dwCount;
268 bFound = TRUE;
269 }
270 }
271 }
272
275 (WPARAM)dwIndex,
276 0);
277}
278
279
280static VOID
282{
283 TIME_ZONE_INFORMATION TimeZoneInformation;
285
287 if (Entry == NULL)
288 return;
289
290 wcscpy(TimeZoneInformation.StandardName,
291 Entry->StandardName);
292 wcscpy(TimeZoneInformation.DaylightName,
293 Entry->DaylightName);
294
295 TimeZoneInformation.Bias = Entry->TimezoneInfo.Bias;
296 TimeZoneInformation.StandardBias = Entry->TimezoneInfo.StandardBias;
297 TimeZoneInformation.DaylightBias = Entry->TimezoneInfo.DaylightBias;
298
299 memcpy(&TimeZoneInformation.StandardDate,
300 &Entry->TimezoneInfo.StandardDate,
301 sizeof(SYSTEMTIME));
302 memcpy(&TimeZoneInformation.DaylightDate,
303 &Entry->TimezoneInfo.DaylightDate,
304 sizeof(SYSTEMTIME));
305
306 /* Set time zone information */
307 SetTimeZoneInformation(&TimeZoneInformation);
308}
309
310
311/* Property page dialog callback */
314 UINT uMsg,
317{
319
320 switch (uMsg)
321 {
322 case WM_INITDIALOG:
323 {
326
327 /* Update DST checkbox based on the selected timezone's DST support */
328 UpdateDstCheckbox(hwndDlg);
329
331 if (hBitmap != NULL)
332 {
333 GetObjectW(hBitmap, sizeof(bitmap), &bitmap);
334
335 cxSource = bitmap.bmWidth;
336 cySource = bitmap.bmHeight;
337 }
338 break;
339 }
340
341 case WM_DRAWITEM:
342 {
343 LPDRAWITEMSTRUCT lpDrawItem;
344 lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
345 if(lpDrawItem->CtlID == IDC_WORLD_BACKGROUND)
346 {
347 HDC hdcMem;
348 hdcMem = CreateCompatibleDC(lpDrawItem->hDC);
349 if (hdcMem != NULL)
350 {
352 StretchBlt(lpDrawItem->hDC, lpDrawItem->rcItem.left, lpDrawItem->rcItem.top,
353 lpDrawItem->rcItem.right - lpDrawItem->rcItem.left,
354 lpDrawItem->rcItem.bottom - lpDrawItem->rcItem.top,
357 }
358 }
359 }
360 break;
361
362 case WM_COMMAND:
364 {
365 /* Update DST checkbox based on the selected timezone's DST support */
366 UpdateDstCheckbox(hwndDlg);
367 /* Enable the 'Apply' button */
368 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
369 }
371 {
372 /* Enable the 'Apply' button */
373 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
374 }
375 break;
376
377 case WM_DESTROY:
380 break;
381
382 case WM_NOTIFY:
383 {
384 LPNMHDR lpnm = (LPNMHDR)lParam;
385
386 switch (lpnm->code)
387 {
388 case PSN_APPLY:
389 {
391 BM_GETCHECK, 0, 0) != BST_UNCHECKED);
394 return TRUE;
395 }
396
397 default:
398 break;
399 }
400 }
401 break;
402 }
403
404 return FALSE;
405}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HINSTANCE hApplet
Definition: access.c:17
#define IDC_WORLD_BACKGROUND
Definition: resource.h:18
#define IDC_TIMEZONELIST
Definition: resource.h:16
#define IDC_WORLD
Definition: resource.h:19
#define IDC_AUTODAYLIGHT
Definition: resource.h:17
static VOID CreateTimeZoneList(VOID)
Definition: timezone.c:194
static VOID SetLocalTimeZone(HWND hwnd)
Definition: timezone.c:281
INT_PTR CALLBACK TimeZonePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: timezone.c:313
static int cySource
Definition: timezone.c:27
static VOID UpdateDstCheckbox(HWND hwndDlg)
Definition: timezone.c:60
static LONG RetrieveTimeZone(IN HKEY hZoneKey, IN PVOID Context)
Definition: timezone.c:114
static int cxSource
Definition: timezone.c:27
static HBITMAP hBitmap
Definition: timezone.c:26
static BOOL HasDaylightSaving(PTIMEZONE_ENTRY Entry)
Definition: timezone.c:53
PTIMEZONE_ENTRY TimeZoneListHead
Definition: timezone.c:29
static PTIMEZONE_ENTRY GetLargerTimeZoneEntry(LONG Bias, LPWSTR lpDescription)
Definition: timezone.c:90
static VOID DestroyTimeZoneList(VOID)
Definition: timezone.c:200
struct _TIMEZONE_ENTRY * PTIMEZONE_ENTRY
PTIMEZONE_ENTRY TimeZoneListTail
Definition: timezone.c:30
struct _TIMEZONE_ENTRY TIMEZONE_ENTRY
static PTIMEZONE_ENTRY GetSelectedTimeZoneEntry(HWND hwndCombo)
Definition: timezone.c:33
static VOID ShowTimeZoneList(HWND hwnd)
Definition: timezone.c:222
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
BOOL WINAPI SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation)
Definition: timezone.c:316
DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
Definition: timezone.c:262
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
unsigned int UINT
Definition: ndis.h:50
#define DWORD
Definition: nt_native.h:44
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define PSN_APPLY
Definition: prsht.h:117
#define PSNRET_NOERROR
Definition: prsht.h:129
#define WM_NOTIFY
Definition: richedit.h:61
wcscpy
_In_ PVOID Context
Definition: storport.h:2269
base of all file and directory entries
Definition: entries.h:83
Definition: timezone.c:16
REG_TZI_FORMAT TimezoneInfo
Definition: timezone.c:22
WCHAR StandardName[33]
Definition: timezone.c:20
WCHAR DaylightName[33]
Definition: timezone.c:21
struct _TIMEZONE_ENTRY * Prev
Definition: timezone.c:17
struct _TIMEZONE_ENTRY * Next
Definition: timezone.c:18
WCHAR Description[128]
Definition: timezone.c:19
SYSTEMTIME DaylightDate
Definition: winbase.h:936
WCHAR DaylightName[32]
Definition: winbase.h:935
WCHAR StandardName[32]
Definition: winbase.h:932
SYSTEMTIME StandardDate
Definition: winbase.h:933
Definition: uimain.c:89
UINT code
Definition: winuser.h:3267
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
#define SetWindowLongPtr
Definition: treelist.c:70
int32_t INT_PTR
Definition: typedefs.h:64
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
VOID EnumerateTimeZoneList(IN PENUM_TIMEZONE_CALLBACK Callback, IN PVOID Context OPTIONAL)
Definition: tzlib.c:223
LONG QueryTimeZoneData(IN HKEY hZoneKey, OUT PULONG Index OPTIONAL, OUT PREG_TZI_FORMAT TimeZoneInfo, OUT PWCHAR Description OPTIONAL, IN OUT PULONG DescriptionSize OPTIONAL, OUT PWCHAR StandardName OPTIONAL, IN OUT PULONG StandardNameSize OPTIONAL, OUT PWCHAR DaylightName OPTIONAL, IN OUT PULONG DaylightNameSize OPTIONAL)
Definition: tzlib.c:141
VOID SetAutoDaylight(IN BOOL EnableAutoDaylightTime)
Definition: tzlib.c:323
BOOL GetAutoDaylight(VOID)
Definition: tzlib.c:283
HDC hdcMem
Definition: welcome.c:104
#define TIME_ZONE_ID_INVALID
Definition: winbase.h:310
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333
BOOL WINAPI DeleteDC(_In_ HDC)
struct tagDRAWITEMSTRUCT * LPDRAWITEMSTRUCT
#define IMAGE_BITMAP
Definition: winuser.h:211
#define BST_UNCHECKED
Definition: winuser.h:199
#define CB_ERRSPACE
Definition: winuser.h:2472
#define WM_COMMAND
Definition: winuser.h:1768
#define CB_ERR
Definition: winuser.h:2471
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2572
#define CB_SETCURSEL
Definition: winuser.h:1990
#define WM_INITDIALOG
Definition: winuser.h:1767
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define WM_DRAWITEM
Definition: winuser.h:1673
#define CBN_SELCHANGE
Definition: winuser.h:2008
#define BM_SETCHECK
Definition: winuser.h:1950
#define CB_ADDSTRING
Definition: winuser.h:1965
struct tagNMHDR * LPNMHDR
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define DWLP_MSGRESULT
Definition: winuser.h:881
#define LR_DEFAULTCOLOR
Definition: winuser.h:1098
#define BN_CLICKED
Definition: winuser.h:1954
#define WM_DESTROY
Definition: winuser.h:1637
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define CB_GETCURSEL
Definition: winuser.h:1972
#define SendDlgItemMessage
Definition: winuser.h:6008
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1947
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184