summaryrefslogtreecommitdiff
path: root/worldtime_protocol/timezone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'worldtime_protocol/timezone.cpp')
-rw-r--r--worldtime_protocol/timezone.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/worldtime_protocol/timezone.cpp b/worldtime_protocol/timezone.cpp
new file mode 100644
index 0000000..ee4a8ed
--- /dev/null
+++ b/worldtime_protocol/timezone.cpp
@@ -0,0 +1,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;
+}
+