ReactOS 0.4.15-dev-8116-gf69e256
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
35 LONG Bias,
36 LPWSTR lpDescription)
37{
39
41 while (Entry != NULL)
42 {
43 if (Entry->TimezoneInfo.Bias < Bias)
44 return Entry;
45
46 if (Entry->TimezoneInfo.Bias == Bias)
47 {
48 if (_wcsicmp(Entry->Description, lpDescription) > 0)
49 return Entry;
50 }
51
52 Entry = Entry->Next;
53 }
54
55 return NULL;
56}
57
58static LONG
60 IN HKEY hZoneKey,
62{
63 LONG lError;
65 PTIMEZONE_ENTRY Current;
66 ULONG DescriptionSize;
67 ULONG StandardNameSize;
68 ULONG DaylightNameSize;
69
71 if (Entry == NULL)
72 {
74 }
75
76 DescriptionSize = sizeof(Entry->Description);
77 StandardNameSize = sizeof(Entry->StandardName);
78 DaylightNameSize = sizeof(Entry->DaylightName);
79
80 lError = QueryTimeZoneData(hZoneKey,
81 NULL,
82 &Entry->TimezoneInfo,
83 Entry->Description,
84 &DescriptionSize,
85 Entry->StandardName,
86 &StandardNameSize,
87 Entry->DaylightName,
88 &DaylightNameSize);
89 if (lError != ERROR_SUCCESS)
90 {
92 return lError;
93 }
94
95 if (TimeZoneListHead == NULL &&
97 {
98 Entry->Prev = NULL;
99 Entry->Next = NULL;
102 }
103 else
104 {
105 Current = GetLargerTimeZoneEntry(Entry->TimezoneInfo.Bias, Entry->Description);
106 if (Current != NULL)
107 {
108 if (Current == TimeZoneListHead)
109 {
110 /* Prepend to head */
111 Entry->Prev = NULL;
112 Entry->Next = TimeZoneListHead;
115 }
116 else
117 {
118 /* Insert before current */
119 Entry->Prev = Current->Prev;
120 Entry->Next = Current;
121 Current->Prev->Next = Entry;
122 Current->Prev = Entry;
123 }
124 }
125 else
126 {
127 /* Append to tail */
128 Entry->Prev = TimeZoneListTail;
129 Entry->Next = NULL;
132 }
133 }
134
135 return ERROR_SUCCESS;
136}
137
138static VOID
140{
142}
143
144static VOID
146{
148
149 while (TimeZoneListHead != NULL)
150 {
152
153 TimeZoneListHead = Entry->Next;
154 if (TimeZoneListHead != NULL)
155 {
157 }
158
160 }
161
163}
164
165
166static VOID
168{
169 TIME_ZONE_INFORMATION TimeZoneInfo;
171 DWORD dwCount;
172 DWORD dwIndex = 0;
173 BOOL bFound = FALSE;
174
175 if (GetTimeZoneInformation(&TimeZoneInfo) == TIME_ZONE_ID_INVALID)
176 {
177 /* Failed to retrieve current time-zone info, reset it */
178 ZeroMemory(&TimeZoneInfo, sizeof(TimeZoneInfo));
179 }
180
181 for (Entry = TimeZoneListHead; Entry != NULL; Entry = Entry->Next)
182 {
183 dwCount = SendMessageW(hwnd,
185 0,
186 (LPARAM)Entry->Description);
187 if (dwCount == CB_ERR || dwCount == CB_ERRSPACE)
188 continue;
189
190 /* If the time-zone was found in the list, skip the tests */
191 if (bFound)
192 continue;
193
194 if (*TimeZoneInfo.StandardName && *Entry->StandardName)
195 {
196 /* Compare by name */
197 if (wcscmp(Entry->StandardName, TimeZoneInfo.StandardName) == 0)
198 {
199 dwIndex = dwCount;
200 bFound = TRUE;
201 }
202 }
203 else
204 {
205 /* Compare by date and bias */
206 if ((Entry->TimezoneInfo.Bias == TimeZoneInfo.Bias) &&
207 (Entry->TimezoneInfo.StandardBias == TimeZoneInfo.StandardBias) &&
208 (Entry->TimezoneInfo.DaylightBias == TimeZoneInfo.DaylightBias) &&
209 (memcmp(&Entry->TimezoneInfo.StandardDate, &TimeZoneInfo.StandardDate, sizeof(SYSTEMTIME)) == 0) &&
210 (memcmp(&Entry->TimezoneInfo.DaylightDate, &TimeZoneInfo.DaylightDate, sizeof(SYSTEMTIME)) == 0))
211 {
212 dwIndex = dwCount;
213 bFound = TRUE;
214 }
215 }
216 }
217
220 (WPARAM)dwIndex,
221 0);
222}
223
224
225static VOID
227{
228 TIME_ZONE_INFORMATION TimeZoneInformation;
230 DWORD dwIndex;
231 DWORD i;
232
233 dwIndex = (DWORD)SendMessageW(hwnd,
235 0,
236 0);
237
238 i = 0;
240 while (i < dwIndex)
241 {
242 if (Entry == NULL)
243 return;
244
245 i++;
246 Entry = Entry->Next;
247 }
248
249 wcscpy(TimeZoneInformation.StandardName,
250 Entry->StandardName);
251 wcscpy(TimeZoneInformation.DaylightName,
252 Entry->DaylightName);
253
254 TimeZoneInformation.Bias = Entry->TimezoneInfo.Bias;
255 TimeZoneInformation.StandardBias = Entry->TimezoneInfo.StandardBias;
256 TimeZoneInformation.DaylightBias = Entry->TimezoneInfo.DaylightBias;
257
258 memcpy(&TimeZoneInformation.StandardDate,
259 &Entry->TimezoneInfo.StandardDate,
260 sizeof(SYSTEMTIME));
261 memcpy(&TimeZoneInformation.DaylightDate,
262 &Entry->TimezoneInfo.DaylightDate,
263 sizeof(SYSTEMTIME));
264
265 /* Set time zone information */
266 SetTimeZoneInformation(&TimeZoneInformation);
267}
268
269
270/* Property page dialog callback */
273 UINT uMsg,
276{
278
279 switch (uMsg)
280 {
281 case WM_INITDIALOG:
282 {
285
288
290 if (hBitmap != NULL)
291 {
292 GetObjectW(hBitmap, sizeof(bitmap), &bitmap);
293
294 cxSource = bitmap.bmWidth;
295 cySource = bitmap.bmHeight;
296 }
297 break;
298 }
299
300 case WM_DRAWITEM:
301 {
302 LPDRAWITEMSTRUCT lpDrawItem;
303 lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
304 if(lpDrawItem->CtlID == IDC_WORLD_BACKGROUND)
305 {
306 HDC hdcMem;
307 hdcMem = CreateCompatibleDC(lpDrawItem->hDC);
308 if (hdcMem != NULL)
309 {
311 StretchBlt(lpDrawItem->hDC, lpDrawItem->rcItem.left, lpDrawItem->rcItem.top,
312 lpDrawItem->rcItem.right - lpDrawItem->rcItem.left,
313 lpDrawItem->rcItem.bottom - lpDrawItem->rcItem.top,
316 }
317 }
318 }
319 break;
320
321 case WM_COMMAND:
324 {
325 /* Enable the 'Apply' button */
326 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
327 }
328 break;
329
330 case WM_DESTROY:
333 break;
334
335 case WM_NOTIFY:
336 {
337 LPNMHDR lpnm = (LPNMHDR)lParam;
338
339 switch (lpnm->code)
340 {
341 case PSN_APPLY:
342 {
344 BM_GETCHECK, 0, 0) != BST_UNCHECKED);
347 return TRUE;
348 }
349
350 default:
351 break;
352 }
353 }
354 break;
355 }
356
357 return FALSE;
358}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
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:139
static VOID SetLocalTimeZone(HWND hwnd)
Definition: timezone.c:226
INT_PTR CALLBACK TimeZonePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: timezone.c:272
static int cySource
Definition: timezone.c:27
static LONG RetrieveTimeZone(IN HKEY hZoneKey, IN PVOID Context)
Definition: timezone.c:59
static int cxSource
Definition: timezone.c:27
static HBITMAP hBitmap
Definition: timezone.c:26
PTIMEZONE_ENTRY TimeZoneListHead
Definition: timezone.c:29
static PTIMEZONE_ENTRY GetLargerTimeZoneEntry(LONG Bias, LPWSTR lpDescription)
Definition: timezone.c:34
static VOID DestroyTimeZoneList(VOID)
Definition: timezone.c:145
struct _TIMEZONE_ENTRY * PTIMEZONE_ENTRY
PTIMEZONE_ENTRY TimeZoneListTail
Definition: timezone.c:30
struct _TIMEZONE_ENTRY TIMEZONE_ENTRY
static VOID ShowTimeZoneList(HWND hwnd)
Definition: timezone.c:167
#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
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 memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
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
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
base of all file and directory entries
Definition: entries.h:83
Definition: bl.h:1331
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:1211
WCHAR DaylightName[32]
Definition: winbase.h:1210
WCHAR StandardName[32]
Definition: winbase.h:1207
SYSTEMTIME StandardDate
Definition: winbase.h:1208
Definition: uimain.c:89
UINT code
Definition: winuser.h:3159
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#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 ZeroMemory
Definition: winbase.h:1712
#define TIME_ZONE_ID_INVALID
Definition: winbase.h:286
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
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:1539
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:2436
#define WM_COMMAND
Definition: winuser.h:1740
#define CB_ERR
Definition: winuser.h:2435
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:2234
#define CB_SETCURSEL
Definition: winuser.h:1961
#define WM_INITDIALOG
Definition: winuser.h:1739
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define WM_DRAWITEM
Definition: winuser.h:1645
#define CBN_SELCHANGE
Definition: winuser.h:1979
#define BM_SETCHECK
Definition: winuser.h:1921
#define CB_ADDSTRING
Definition: winuser.h:1936
struct tagNMHDR * LPNMHDR
HWND WINAPI GetParent(_In_ HWND)
#define DWLP_MSGRESULT
Definition: winuser.h:870
#define LR_DEFAULTCOLOR
Definition: winuser.h:1087
#define BN_CLICKED
Definition: winuser.h:1925
#define WM_DESTROY
Definition: winuser.h:1609
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define CB_GETCURSEL
Definition: winuser.h:1943
#define SendDlgItemMessage
Definition: winuser.h:5842
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1918
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184