summaryrefslogtreecommitdiff
path: root/worldtime/timezone.cpp
blob: ee4a8ed6b87588673456eca8ece71ef70cf653bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "common.h"
#include "timezone.h"

TimeList timezone_list, geo_timezone_list;

bool LS_TZREG::operator<(const LS_TZREG &other) {
	//return Index < other.Index;
	return TZI.Bias < other.TZI.Bias;
}

bool build_timezone_list() {
	HKEY HKlmtz;
	HKEY KKtz;
	DWORD dwIndex = 0;
	CHAR tcName[MAX_SIZE];
	DWORD dwcbName = MAX_SIZE;
	DWORD dwcbValue;
	DWORD dwcbSTD;
	DWORD dwcbDLT;
	LS_TZREG Temp;
	FILETIME ftLastWrite;
	unsigned int list_index = 0;
	bool win9x = false;

	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TZREG, 0, KEY_ENUMERATE_SUB_KEYS, &HKlmtz) != ERROR_SUCCESS) {
		win9x = true;
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TZREG_9X, 0, KEY_ENUMERATE_SUB_KEYS, &HKlmtz) != ERROR_SUCCESS)
			return false;
	}

	while(RegEnumKeyEx(HKlmtz, dwIndex++, tcName, &dwcbName, NULL, NULL, NULL, &ftLastWrite) != ERROR_NO_MORE_ITEMS) {

		if(RegOpenKeyEx(HKlmtz, tcName, 0,KEY_QUERY_VALUE, &KKtz) != ERROR_SUCCESS) {
			RegCloseKey(HKlmtz);
			return false;
		}

		strncpy(Temp.tcName, tcName, MAX_SIZE);
		dwcbValue = MAX_SIZE;
		RegQueryValueEx(KKtz,"Display",NULL,NULL,(BYTE*)Temp.tcDisp,&dwcbValue);
		dwcbDLT = MAX_SIZE;
		RegQueryValueEx(KKtz,"Dlt",NULL,NULL,(BYTE*)Temp.tcDLT,&dwcbDLT);
		dwcbSTD = MAX_SIZE;
		RegQueryValueEx(KKtz,"Std",NULL,NULL,(BYTE*)Temp.tcSTD,&dwcbSTD);
		dwcbValue = MAX_SIZE;
		RegQueryValueEx(KKtz,"MapID",NULL,NULL,(BYTE*)Temp.MapID,&dwcbValue);
		if(!win9x) {
			dwcbValue = sizeof(DWORD);
			RegQueryValueEx(KKtz,"Index",NULL,NULL,(BYTE*)&Temp.Index,&dwcbValue);
		}
		dwcbValue = sizeof(Temp.TZI);
		RegQueryValueEx(KKtz,"TZI",NULL,NULL,(BYTE*)&Temp.TZI,&dwcbValue);

		RegCloseKey(KKtz);

		Temp.list_index = list_index;
		timezone_list.push_back(Temp);

		dwcbName = MAX_SIZE;
		list_index++;
	}

	RegCloseKey(HKlmtz);

	geo_timezone_list = timezone_list;
	std::sort(geo_timezone_list.begin(), geo_timezone_list.end());
	
	return true;
}