diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fd6ec67b..40336bc8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,7 @@ set(CMAKE_COLOR_MAKEFILE ON) # Include cmake modules include(CheckIncludeFiles) include(CheckLibraryExists) +include(CheckStructHasMember) include(FindPkgConfig) include(TestBigEndian) @@ -98,6 +99,8 @@ check_include_files(stdint.h HAVE_STDINT_H) check_include_files(stdbool.h HAVE_STDBOOL_H) check_include_files(inttypes.h HAVE_INTTYPES_H) +check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF) + # Libraries that we have a hard dependency on find_required_package(OpenSSL) diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 995d7a869..f8e49a3c0 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -2,6 +2,7 @@ option(WITH_DEBUG_TRANSPORT "Print transport debug messages." OFF) option(WITH_DEBUG_CHANNELS "Print channel manager debug messages." OFF) option(WITH_DEBUG_SVC "Print static virtual channel debug messages." OFF) option(WITH_DEBUG_DVC "Print dynamic virtual channel debug messages." OFF) +option(WITH_DEBUG_TIMEZONE "Print timezone redirection related messages." OFF) option(WITH_DEBUG_KBD "Print keyboard related debug messages." OFF) option(WITH_DEBUG_NLA "Print authentication related debug messages." OFF) option(WITH_DEBUG_NEGO "Print negotiation related debug messages." OFF) diff --git a/config.h.in b/config.h.in index 39bf60517..6e6225e26 100644 --- a/config.h.in +++ b/config.h.in @@ -19,6 +19,8 @@ #cmakedefine HAVE_STDBOOL_H #cmakedefine HAVE_INTTYPES_H +#cmakedefine HAVE_TM_GMTOFF + /* Endian */ #cmakedefine BIG_ENDIAN @@ -27,6 +29,7 @@ #cmakedefine WITH_DEBUG_CHANNELS #cmakedefine WITH_DEBUG_SVC #cmakedefine WITH_DEBUG_DVC +#cmakedefine WITH_DEBUG_TIMEZONE #cmakedefine WITH_DEBUG_KBD #cmakedefine WITH_DEBUG_NLA #cmakedefine WITH_DEBUG_NEGO diff --git a/include/freerdp/kbd/locales.h b/include/freerdp/kbd/locales.h index 3da718452..7432b409e 100644 --- a/include/freerdp/kbd/locales.h +++ b/include/freerdp/kbd/locales.h @@ -230,99 +230,6 @@ #define YORUBA 0x046A #define ZULU 0x0435 - -/* -Time zones, taken from Windows Server 2008 - -(GMT -12:00) International Date Line West -(GMT -11:00) Midway Island, Samoa -(GMT -10:00) Hawaii -(GMT -09:00) Alaska -(GMT -08:00) Pacific Time (US & Canada) -(GMT -08:00) Tijuana, Baja California -(GMT -07:00) Arizona -(GMT -07:00) Chihuahua, La Paz, Mazatlan -(GMT -07:00) Mountain Time (US & Canada) -(GMT -06:00) Central America -(GMT -06:00) Central Time (US & Canada) -(GMT -06:00) Guadalajara, Mexico City, Monterrey -(GMT -06:00) Saskatchewan -(GMT -05:00) Bogota, Lima, Quito, Rio Branco -(GMT -05:00) Eastern Time (US & Canada) -(GMT -05:00) Indiana (East) -(GMT -04:30) Caracas -(GMT -04:00) Atlantic Time (Canada) -(GMT -04:00) La Paz -(GMT -04:00) Manaus -(GMT -04:00) Santiago -(GMT -03:30) Newfoundland -(GMT -03:00) Brasilia -(GMT -03:00) Buenos Aires -(GMT -03:00) Georgetown -(GMT -03:00) Greenland -(GMT -03:00) Montevideo -(GMT -02:00) Mid-Atlantic -(GMT -01:00) Azores -(GMT -01:00) Cape Verde Is. -(GMT +00:00) Casablanca -(GMT +00:00) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London -(GMT +00:00) Monrovia, Reykjavik -(GMT +01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna -(GMT +01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague -(GMT +01:00) Brussels, Copenhagen, Madrid, Paris -(GMT +01:00) Sarajevo, Skopje, Warsaw, Zagreb -(GMT +01:00) West Central Africa -(GMT +02:00) Amman -(GMT +02:00) Athens, Bucharest, Istanbul -(GMT +02:00) Beirut -(GMT +02:00) Cairo -(GMT +02:00) Harare, Pretoria -(GMT +02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius -(GMT +02:00) Jerusalem -(GMT +02:00) Minsk -(GMT +02:00) Windhoek -(GMT +03:00) Baghdad -(GMT +03:00) Kuwait, Riyadh -(GMT +03:00) Moscow, St. Petersburg, Volgograd -(GMT +03:00) Nairobi -(GMT +03:00) Tbilisi -(GMT +03:30) Tehran -(GMT +04:00) Abu Dhabi, Muscat -(GMT +04:00) Baku -(GMT +04:00) Port Louis -(GMT +04:00) Yerevan -(GMT +04:30) Kabul -(GMT +05:00) Ekaterinburg -(GMT +05:00) Islamabad, Karachi -(GMT +05:00) Tashkent -(GMT +05:30) Chennai, Kolkata, Mumbai, New Delhi -(GMT +05:30) Sri Jayawardenepura -(GMT +05:45) Kathmandu -(GMT +06:00) Almaty, Novosibirsk -(GMT +06:00) Astana, Dhaka -(GMT +06:30) Yangon (Rangoon) -(GMT +07:00) Bangkok, Hanoi, Jakarta -(GMT +07:00) Krasnoyarsk -(GMT +08:00) Beijing, Chongqing, Hong Kong, Urumqi -(GMT +08:00) Irkutsk, Ulaan Bataar -(GMT +08:00) Kuala Lumpur, Singapore -(GMT +08:00) Perth -(GMT +08:00) Taipei -(GMT +09:00) Osaka, Sapporo, Tokyo -(GMT +09:00) Seoul -(GMT +09:00) Yakutsk -(GMT +09:30) Adelaide -(GMT +09:30) Darwin -(GMT +10:00) Brisbane -(GMT +10:00) Canberra, Melbourne, Sydney -(GMT +10:00) Guam, Port Moresby -(GMT +10:00) Hobart, Vladivostok -(GMT +11:00) Magadan, Solomon Is., New Caledonia -(GMT +12:00) Auckland, Wellington -(GMT +12:00) Fiji, Kamchatka, Marshall Is. -(GMT +13:00) Nuku'alofa -*/ - FREERDP_API uint32 detect_keyboard_layout_from_locale(void); #endif /* __LOCALES_H */ diff --git a/include/freerdp/utils/memory.h b/include/freerdp/utils/memory.h index 892a7ad94..75f81aa38 100644 --- a/include/freerdp/utils/memory.h +++ b/include/freerdp/utils/memory.h @@ -31,4 +31,6 @@ FREERDP_API char* xstrdup(const char* str); #define xnew(_type) (_type*)xzalloc(sizeof(_type)) +#define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(*(_x))) + #endif /* __MEMORY_UTILS_H */ diff --git a/include/freerdp/utils/time.h b/include/freerdp/utils/time.h new file mode 100644 index 000000000..754bf800b --- /dev/null +++ b/include/freerdp/utils/time.h @@ -0,0 +1,36 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Time Utils + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_TIME_UTILS_H +#define FREERDP_TIME_UTILS_H + +#include + +#ifndef _WIN32 +#include +#endif + +#include +#include + +FREERDP_API uint64 rdp_windows_gmtime(); +FREERDP_API uint64 rdp_get_windows_time_from_unix_time(time_t unix_time); +FREERDP_API time_t rdp_get_unix_time_from_windows_time(uint64 windows_time); + +#endif /* FREERDP_TIME_UTILS_H */ diff --git a/libfreerdp-core/CMakeLists.txt b/libfreerdp-core/CMakeLists.txt index 939a9cf52..b01d5f967 100644 --- a/libfreerdp-core/CMakeLists.txt +++ b/libfreerdp-core/CMakeLists.txt @@ -63,6 +63,8 @@ set(LIBFREERDP_CORE_SRCS connection.h redirection.c redirection.h + timezone.c + timezone.h rdp.c rdp.h per.c diff --git a/libfreerdp-core/info.c b/libfreerdp-core/info.c index a10999ba5..dbfe5a942 100644 --- a/libfreerdp-core/info.c +++ b/libfreerdp-core/info.c @@ -17,6 +17,8 @@ * limitations under the License. */ +#include "timezone.h" + #include "info.h" #define INFO_TYPE_LOGON 0x00000000 @@ -34,182 +36,6 @@ static const char* const INFO_TYPE_LOGON_STRINGS[] = }; */ -/** - * Read SYSTEM_TIME structure (TS_SYSTEMTIME).\n - * @msdn{cc240478} - * @param s stream - * @param system_time system time structure - */ - -void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time) -{ - stream_read_uint16(s, system_time->wYear); /* wYear, must be set to 0 */ - stream_read_uint16(s, system_time->wMonth); /* wMonth */ - stream_read_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */ - stream_read_uint16(s, system_time->wDay); /* wDay */ - stream_read_uint16(s, system_time->wHour); /* wHour */ - stream_read_uint16(s, system_time->wMinute); /* wMinute */ - stream_read_uint16(s, system_time->wSecond); /* wSecond */ - stream_read_uint16(s, system_time->wMilliseconds); /* wMilliseconds */ -} - -/** - * Write SYSTEM_TIME structure (TS_SYSTEMTIME).\n - * @msdn{cc240478} - * @param s stream - * @param system_time system time structure - */ - -void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time) -{ - stream_write_uint16(s, system_time->wYear); /* wYear, must be set to 0 */ - stream_write_uint16(s, system_time->wMonth); /* wMonth */ - stream_write_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */ - stream_write_uint16(s, system_time->wDay); /* wDay */ - stream_write_uint16(s, system_time->wHour); /* wHour */ - stream_write_uint16(s, system_time->wMinute); /* wMinute */ - stream_write_uint16(s, system_time->wSecond); /* wSecond */ - stream_write_uint16(s, system_time->wMilliseconds); /* wMilliseconds */ -} - -/** - * Get client time zone information.\n - * @param s stream - * @param settings settings - */ - -void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings) -{ - time_t t; - struct tm* local_time; - TIME_ZONE_INFO* clientTimeZone; - - time(&t); - local_time = localtime(&t); - clientTimeZone = settings->client_time_zone; - -#if defined(sun) - if(local_time->tm_isdst > 0) - clientTimeZone->bias = (uint32) (altzone / 3600); - else - clientTimeZone->bias = (uint32) (timezone / 3600); -#elif defined(HAVE_TM_GMTOFF) - if(local_time->tm_gmtoff >= 0) - clientTimeZone->bias = (uint32) (local_time->tm_gmtoff / 60); - else - clientTimeZone->bias = (uint32) ((-1 * local_time->tm_gmtoff) / 60 + 720); -#else - clientTimeZone->bias = 0; -#endif - - if(local_time->tm_isdst > 0) - { - clientTimeZone->standardBias = clientTimeZone->bias - 60; - clientTimeZone->daylightBias = clientTimeZone->bias; - } - else - { - clientTimeZone->standardBias = clientTimeZone->bias; - clientTimeZone->daylightBias = clientTimeZone->bias + 60; - } - - strftime(clientTimeZone->standardName, 32, "%Z, Standard Time", local_time); - clientTimeZone->standardName[31] = 0; - strftime(clientTimeZone->daylightName, 32, "%Z, Summer Time", local_time); - clientTimeZone->daylightName[31] = 0; -} - -/** - * Read client time zone information (TS_TIME_ZONE_INFORMATION).\n - * @msdn{cc240477} - * @param s stream - * @param settings settings - */ - -boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings) -{ - char* str; - TIME_ZONE_INFO* clientTimeZone; - - if (stream_get_left(s) < 172) - return false; - - clientTimeZone = settings->client_time_zone; - - stream_read_uint32(s, clientTimeZone->bias); /* Bias */ - - /* standardName (64 bytes) */ - str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64); - stream_seek(s, 64); - strncpy(clientTimeZone->standardName, str, sizeof(clientTimeZone->standardName)); - xfree(str); - - rdp_read_system_time(s, &clientTimeZone->standardDate); /* StandardDate */ - stream_read_uint32(s, clientTimeZone->standardBias); /* StandardBias */ - - /* daylightName (64 bytes) */ - str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64); - stream_seek(s, 64); - strncpy(clientTimeZone->daylightName, str, sizeof(clientTimeZone->daylightName)); - xfree(str); - - rdp_read_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */ - stream_read_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */ - - return true; -} - -/** - * Write client time zone information (TS_TIME_ZONE_INFORMATION).\n - * @msdn{cc240477} - * @param s stream - * @param settings settings - */ - -void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings) -{ - size_t length; - uint8* standardName; - uint8* daylightName; - size_t standardNameLength; - size_t daylightNameLength; - TIME_ZONE_INFO* clientTimeZone; - - rdp_get_client_time_zone(s, settings); - clientTimeZone = settings->client_time_zone; - - standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length); - standardNameLength = length; - - daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length); - daylightNameLength = length; - - if (standardNameLength > 62) - standardNameLength = 62; - - if (daylightNameLength > 62) - daylightNameLength = 62; - - stream_write_uint32(s, clientTimeZone->bias); /* Bias */ - - /* standardName (64 bytes) */ - stream_write(s, standardName, standardNameLength); - stream_write_zero(s, 64 - standardNameLength); - - rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */ - stream_write_uint32(s, clientTimeZone->standardBias); /* StandardBias */ - - /* daylightName (64 bytes) */ - stream_write(s, daylightName, daylightNameLength); - stream_write_zero(s, 64 - daylightNameLength); - - rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */ - stream_write_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */ - - xfree(standardName); - xfree(daylightName); -} - /** * Read Server Auto Reconnect Cookie (ARC_SC_PRIVATE_PACKET).\n * @msdn{cc240540} diff --git a/libfreerdp-core/timezone.c b/libfreerdp-core/timezone.c new file mode 100644 index 000000000..3d3eb8b52 --- /dev/null +++ b/libfreerdp-core/timezone.c @@ -0,0 +1,1868 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Time Zone Redirection + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "timezone.h" + +/* Time Zone Redirection table generated with TimeZones.cs script */ + + +struct _SYSTEM_TIME_ENTRY +{ + uint16 wYear; + uint16 wMonth; + uint16 wDayOfWeek; + uint16 wDay; + uint16 wHour; + uint16 wMinute; + uint16 wSecond; + uint16 wMilliseconds; +}; +typedef struct _SYSTEM_TIME_ENTRY SYSTEM_TIME_ENTRY; + +struct _TIME_ZONE_RULE_ENTRY +{ + uint64 TicksStart; + uint64 TicksEnd; + sint32 DaylightDelta; + SYSTEM_TIME_ENTRY StandardDate; + SYSTEM_TIME_ENTRY DaylightDate; +}; +typedef struct _TIME_ZONE_RULE_ENTRY TIME_ZONE_RULE_ENTRY; + +struct _TIME_ZONE_ENTRY +{ + const char* Id; + uint32 Bias; + boolean SupportsDST; + const char* DisplayName; + const char* StandardName; + const char* DaylightName; + TIME_ZONE_RULE_ENTRY* RuleTable; + uint32 RuleTableCount; +}; +typedef struct _TIME_ZONE_ENTRY TIME_ZONE_ENTRY; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_3[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_4[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_5[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_7[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_8[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_10[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_11[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_14[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_15[] = +{ + { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_17[] = +{ + { 633662964000000000ULL, 180000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 9, 6, 1, 23, 59 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_18[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_19[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 2, 0, 1, 2, 0 }, { 0, 11, 0, 1, 0, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 0, 1, 0, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_21[] = +{ + { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 5, 6, 1, 23, 59 }, { 0, 8, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_22[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 0, 1 }, { 0, 4, 0, 1, 0, 1 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 0, 1 }, }, + { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_23[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 2, 0, 1, 2, 0 }, { 0, 11, 0, 1, 0, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 0, 1, 0, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_24[] = +{ + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 1, 1, 1, 0, 0 }, { 0, 12, 0, 1, 0, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 1, 4, 1, 0, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_26[] = +{ + { 633662964000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }, + { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_27[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 9, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 10, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_28[] = +{ + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 1, 6, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_30[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_31[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_33[] = +{ + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 8, 0, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 5, 0, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 8, 6, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 7, 6, 1, 23, 59 }, { 0, 4, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_35[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 0, 1, 1, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_37[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_38[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_39[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_40[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_42[] = +{ + { 634293684000000000ULL, 180000000000ULL, -60, { 0, 9, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 634294548000000000ULL, 60, { 0, 4, 0, 1, 2, 0 }, { 0, 9, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_43[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 9, 5, 1, 1, 0 }, { 0, 3, 4, 1, 0, 0 }, }, + { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 10, 5, 1, 1, 0 }, { 0, 3, 4, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_44[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_45[] = +{ + { 633978324000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 0, 0 }, { 0, 3, 0, 1, 0, 0 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_46[] = +{ + { 632716020000000000ULL, 180000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 5, 1, 0, 0 }, }, + { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 5, 1, 0, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_47[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 9, 3, 1, 23, 59 }, { 0, 3, 5, 1, 23, 59 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 11, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 5, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, }, + { 3155378292000000000ULL, 636188436000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_49[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_50[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 1, 1, 3, 0 }, }, + { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_51[] = +{ + { 632716020000000000ULL, 632401524000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, }, + { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, }, + { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, }, + { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_52[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_53[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 4, 0, 1, 3, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 10, 1, 1, 4, 0 }, { 0, 4, 0, 1, 3, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_54[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_57[] = +{ + { 632716020000000000ULL, 180000000000ULL, 60, { 0, 9, 2, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 9, 6, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, }, + { 3155378292000000000ULL, 633663828000000000ULL, 60, { 0, 9, 1, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_59[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 5, 0 }, { 0, 3, 0, 1, 4, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_60[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_61[] = +{ + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 1, 2, 1, 0, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 1, 4, 1, 0, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_63[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_65[] = +{ + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 5, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 4, 2, 1, 23, 59 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_71[] = +{ + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 12, 4, 1, 23, 59 }, { 0, 6, 5, 1, 23, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_72[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_75[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_77[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_79[] = +{ + { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 1, 0, 1, 0, 0 }, { 0, 12, 0, 1, 2, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 1, 4, 1, 0, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_82[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_85[] = +{ + { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_88[] = +{ + { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_90[] = +{ + { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_91[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_93[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_94[] = +{ + { 633031380000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 9, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 9, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_96[] = +{ + { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 1, 4, 1, 0, 0 }, { 0, 11, 0, 1, 2, 0 }, }, + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 1, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }, + { 3155378292000000000ULL, 634926132000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_97[] = +{ + { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_98[] = +{ + { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, } +}; + +static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_100[] = +{ + { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 1, 5, 1, 0, 0 }, { 0, 9, 6, 1, 23, 59 }, }, + { 3155378292000000000ULL, 634294548000000000ULL, 60, { 0, 4, 0, 1, 1, 0 }, { 0, 9, 0, 1, 0, 0 }, } +}; + +static const TIME_ZONE_ENTRY TimeZoneTable[] = +{ + { + "Dateline Standard Time", 720, false, "(UTC-12:00) International Date Line West", + "Dateline Standard Time", "Dateline Daylight Time", + NULL, 0 + }, + { + "UTC-11", 780, false, "(UTC-11:00) Coordinated Universal Time-11", + "UTC-11", "UTC-11", + NULL, 0 + }, + { + "Hawaiian Standard Time", 840, false, "(UTC-10:00) Hawaii", + "Hawaiian Standard Time", "Hawaiian Daylight Time", + NULL, 0 + }, + { + "Alaskan Standard Time", 900, true, "(UTC-09:00) Alaska", + "Alaskan Standard Time", "Alaskan Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_3, 2 + }, + { + "Pacific Standard Time (Mexico)", 960, true, "(UTC-08:00) Baja California", + "Pacific Standard Time (Mexico)", "Pacific Daylight Time (Mexico)", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_4, 1 + }, + { + "Pacific Standard Time", 960, true, "(UTC-08:00) Pacific Time (US & Canada)", + "Pacific Standard Time", "Pacific Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_5, 2 + }, + { + "US Mountain Standard Time", 1020, false, "(UTC-07:00) Arizona", + "US Mountain Standard Time", "US Mountain Daylight Time", + NULL, 0 + }, + { + "Mountain Standard Time (Mexico)", 1020, true, "(UTC-07:00) Chihuahua, La Paz, Mazatlan", + "Mountain Standard Time (Mexico)", "Mountain Daylight Time (Mexico)", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_7, 1 + }, + { + "Mountain Standard Time", 1020, true, "(UTC-07:00) Mountain Time (US & Canada)", + "Mountain Standard Time", "Mountain Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_8, 2 + }, + { + "Central America Standard Time", 1080, false, "(UTC-06:00) Central America", + "Central America Standard Time", "Central America Daylight Time", + NULL, 0 + }, + { + "Central Standard Time", 1080, true, "(UTC-06:00) Central Time (US & Canada)", + "Central Standard Time", "Central Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_10, 2 + }, + { + "Central Standard Time (Mexico)", 1080, true, "(UTC-06:00) Guadalajara, Mexico City, Monterrey", + "Central Standard Time (Mexico)", "Central Daylight Time (Mexico)", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_11, 1 + }, + { + "Canada Central Standard Time", 1080, false, "(UTC-06:00) Saskatchewan", + "Canada Central Standard Time", "Canada Central Daylight Time", + NULL, 0 + }, + { + "SA Pacific Standard Time", 1140, false, "(UTC-05:00) Bogota, Lima, Quito", + "SA Pacific Standard Time", "SA Pacific Daylight Time", + NULL, 0 + }, + { + "Eastern Standard Time", 1140, true, "(UTC-05:00) Eastern Time (US & Canada)", + "Eastern Standard Time", "Eastern Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_14, 2 + }, + { + "US Eastern Standard Time", 1140, true, "(UTC-05:00) Indiana (East)", + "US Eastern Standard Time", "US Eastern Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_15, 2 + }, + { + "Venezuela Standard Time", 1170, false, "(UTC-04:30) Caracas", + "Venezuela Standard Time", "Venezuela Daylight Time", + NULL, 0 + }, + { + "Paraguay Standard Time", 1200, true, "(UTC-04:00) Asuncion", + "Paraguay Standard Time", "Paraguay Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_17, 14 + }, + { + "Atlantic Standard Time", 1200, true, "(UTC-04:00) Atlantic Time (Canada)", + "Atlantic Standard Time", "Atlantic Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_18, 2 + }, + { + "Central Brazilian Standard Time", 1200, true, "(UTC-04:00) Cuiaba", + "Central Brazilian Standard Time", "Central Brazilian Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_19, 35 + }, + { + "SA Western Standard Time", 1200, false, "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan", + "SA Western Standard Time", "SA Western Daylight Time", + NULL, 0 + }, + { + "Pacific SA Standard Time", 1200, true, "(UTC-04:00) Santiago", + "Pacific SA Standard Time", "Pacific SA Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_21, 6 + }, + { + "Newfoundland Standard Time", 1230, true, "(UTC-03:30) Newfoundland", + "Newfoundland Standard Time", "Newfoundland Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_22, 7 + }, + { + "E. South America Standard Time", 1260, true, "(UTC-03:00) Brasilia", + "E. South America Standard Time", "E. South America Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_23, 35 + }, + { + "Argentina Standard Time", 1260, true, "(UTC-03:00) Buenos Aires", + "Argentina Standard Time", "Argentina Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_24, 3 + }, + { + "SA Eastern Standard Time", 1260, false, "(UTC-03:00) Cayenne, Fortaleza", + "SA Eastern Standard Time", "SA Eastern Daylight Time", + NULL, 0 + }, + { + "Greenland Standard Time", 1260, true, "(UTC-03:00) Greenland", + "Greenland Standard Time", "Greenland Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_26, 14 + }, + { + "Montevideo Standard Time", 1260, true, "(UTC-03:00) Montevideo", + "Montevideo Standard Time", "Montevideo Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_27, 2 + }, + { + "Bahia Standard Time", 1260, true, "(UTC-03:00) Salvador", + "Bahia Standard Time", "Bahia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_28, 30 + }, + { + "UTC-02", 1320, false, "(UTC-02:00) Coordinated Universal Time-02", + "UTC-02", "UTC-02", + NULL, 0 + }, + { + "Mid-Atlantic Standard Time", 1320, true, "(UTC-02:00) Mid-Atlantic", + "Mid-Atlantic Standard Time", "Mid-Atlantic Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_30, 1 + }, + { + "Azores Standard Time", 1380, true, "(UTC-01:00) Azores", + "Azores Standard Time", "Azores Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_31, 1 + }, + { + "Cape Verde Standard Time", 1380, false, "(UTC-01:00) Cape Verde Is.", + "Cape Verde Standard Time", "Cape Verde Daylight Time", + NULL, 0 + }, + { + "Morocco Standard Time", 0, true, "(UTC) Casablanca", + "Morocco Standard Time", "Morocco Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_33, 4 + }, + { + "UTC", 0, false, "(UTC) Coordinated Universal Time", + "Coordinated Universal Time", "Coordinated Universal Time", + NULL, 0 + }, + { + "GMT Standard Time", 0, true, "(UTC) Dublin, Edinburgh, Lisbon, London", + "GMT Standard Time", "GMT Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_35, 1 + }, + { + "Greenwich Standard Time", 0, false, "(UTC) Monrovia, Reykjavik", + "Greenwich Standard Time", "Greenwich Daylight Time", + NULL, 0 + }, + { + "W. Europe Standard Time", 60, true, "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", + "W. Europe Standard Time", "W. Europe Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_37, 1 + }, + { + "Central Europe Standard Time", 60, true, "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague", + "Central Europe Standard Time", "Central Europe Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_38, 1 + }, + { + "Romance Standard Time", 60, true, "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris", + "Romance Standard Time", "Romance Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_39, 1 + }, + { + "Central European Standard Time", 60, true, "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb", + "Central European Standard Time", "Central European Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_40, 1 + }, + { + "W. Central Africa Standard Time", 60, false, "(UTC+01:00) West Central Africa", + "W. Central Africa Standard Time", "W. Central Africa Daylight Time", + NULL, 0 + }, + { + "Namibia Standard Time", 60, true, "(UTC+01:00) Windhoek", + "Namibia Standard Time", "Namibia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_42, 2 + }, + { + "Jordan Standard Time", 120, true, "(UTC+02:00) Amman", + "Jordan Standard Time", "Jordan Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_43, 2 + }, + { + "GTB Standard Time", 120, true, "(UTC+02:00) Athens, Bucharest, Istanbul", + "GTB Standard Time", "GTB Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_44, 1 + }, + { + "Middle East Standard Time", 120, true, "(UTC+02:00) Beirut", + "Middle East Standard Time", "Middle East Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_45, 13 + }, + { + "Egypt Standard Time", 120, true, "(UTC+02:00) Cairo", + "Egypt Standard Time", "Egypt Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_46, 6 + }, + { + "Syria Standard Time", 120, true, "(UTC+02:00) Damascus", + "Syria Standard Time", "Syria Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_47, 12 + }, + { + "South Africa Standard Time", 120, false, "(UTC+02:00) Harare, Pretoria", + "South Africa Standard Time", "South Africa Daylight Time", + NULL, 0 + }, + { + "FLE Standard Time", 120, true, "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius", + "FLE Standard Time", "FLE Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_49, 1 + }, + { + "Turkey Standard Time", 120, true, "(UTC+02:00) Istanbul", + "Turkey Standard Time", "Turkey Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_50, 3 + }, + { + "Israel Standard Time", 120, true, "(UTC+02:00) Jerusalem", + "Jerusalem Standard Time", "Jerusalem Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_51, 18 + }, + { + "E. Europe Standard Time", 120, true, "(UTC+02:00) Nicosia", + "E. Europe Standard Time", "E. Europe Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_52, 1 + }, + { + "Arabic Standard Time", 180, true, "(UTC+03:00) Baghdad", + "Arabic Standard Time", "Arabic Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_53, 2 + }, + { + "Kaliningrad Standard Time", 180, true, "(UTC+03:00) Kaliningrad, Minsk", + "Kaliningrad Standard Time", "Kaliningrad Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_54, 1 + }, + { + "Arab Standard Time", 180, false, "(UTC+03:00) Kuwait, Riyadh", + "Arab Standard Time", "Arab Daylight Time", + NULL, 0 + }, + { + "E. Africa Standard Time", 180, false, "(UTC+03:00) Nairobi", + "E. Africa Standard Time", "E. Africa Daylight Time", + NULL, 0 + }, + { + "Iran Standard Time", 210, true, "(UTC+03:30) Tehran", + "Iran Standard Time", "Iran Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_57, 3 + }, + { + "Arabian Standard Time", 240, false, "(UTC+04:00) Abu Dhabi, Muscat", + "Arabian Standard Time", "Arabian Daylight Time", + NULL, 0 + }, + { + "Azerbaijan Standard Time", 240, true, "(UTC+04:00) Baku", + "Azerbaijan Standard Time", "Azerbaijan Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_59, 1 + }, + { + "Russian Standard Time", 240, true, "(UTC+04:00) Moscow, St. Petersburg, Volgograd", + "Russian Standard Time", "Russian Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_60, 1 + }, + { + "Mauritius Standard Time", 240, true, "(UTC+04:00) Port Louis", + "Mauritius Standard Time", "Mauritius Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_61, 2 + }, + { + "Georgian Standard Time", 240, false, "(UTC+04:00) Tbilisi", + "Georgian Standard Time", "Georgian Daylight Time", + NULL, 0 + }, + { + "Caucasus Standard Time", 240, true, "(UTC+04:00) Yerevan", + "Caucasus Standard Time", "Caucasus Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_63, 1 + }, + { + "Afghanistan Standard Time", 270, false, "(UTC+04:30) Kabul", + "Afghanistan Standard Time", "Afghanistan Daylight Time", + NULL, 0 + }, + { + "Pakistan Standard Time", 300, true, "(UTC+05:00) Islamabad, Karachi", + "Pakistan Standard Time", "Pakistan Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_65, 2 + }, + { + "West Asia Standard Time", 300, false, "(UTC+05:00) Tashkent", + "West Asia Standard Time", "West Asia Daylight Time", + NULL, 0 + }, + { + "India Standard Time", 330, false, "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi", + "India Standard Time", "India Daylight Time", + NULL, 0 + }, + { + "Sri Lanka Standard Time", 330, false, "(UTC+05:30) Sri Jayawardenepura", + "Sri Lanka Standard Time", "Sri Lanka Daylight Time", + NULL, 0 + }, + { + "Nepal Standard Time", 345, false, "(UTC+05:45) Kathmandu", + "Nepal Standard Time", "Nepal Daylight Time", + NULL, 0 + }, + { + "Central Asia Standard Time", 360, false, "(UTC+06:00) Astana", + "Central Asia Standard Time", "Central Asia Daylight Time", + NULL, 0 + }, + { + "Bangladesh Standard Time", 360, true, "(UTC+06:00) Dhaka", + "Bangladesh Standard Time", "Bangladesh Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_71, 1 + }, + { + "Ekaterinburg Standard Time", 360, true, "(UTC+06:00) Ekaterinburg", + "Ekaterinburg Standard Time", "Ekaterinburg Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_72, 1 + }, + { + "Myanmar Standard Time", 390, false, "(UTC+06:30) Yangon (Rangoon)", + "Myanmar Standard Time", "Myanmar Daylight Time", + NULL, 0 + }, + { + "SE Asia Standard Time", 420, false, "(UTC+07:00) Bangkok, Hanoi, Jakarta", + "SE Asia Standard Time", "SE Asia Daylight Time", + NULL, 0 + }, + { + "N. Central Asia Standard Time", 420, true, "(UTC+07:00) Novosibirsk", + "N. Central Asia Standard Time", "N. Central Asia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_75, 1 + }, + { + "China Standard Time", 480, false, "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi", + "China Standard Time", "China Daylight Time", + NULL, 0 + }, + { + "North Asia Standard Time", 480, true, "(UTC+08:00) Krasnoyarsk", + "North Asia Standard Time", "North Asia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_77, 1 + }, + { + "Singapore Standard Time", 480, false, "(UTC+08:00) Kuala Lumpur, Singapore", + "Malay Peninsula Standard Time", "Malay Peninsula Daylight Time", + NULL, 0 + }, + { + "W. Australia Standard Time", 480, true, "(UTC+08:00) Perth", + "W. Australia Standard Time", "W. Australia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_79, 4 + }, + { + "Taipei Standard Time", 480, false, "(UTC+08:00) Taipei", + "Taipei Standard Time", "Taipei Daylight Time", + NULL, 0 + }, + { + "Ulaanbaatar Standard Time", 480, false, "(UTC+08:00) Ulaanbaatar", + "Ulaanbaatar Standard Time", "Ulaanbaatar Daylight Time", + NULL, 0 + }, + { + "North Asia East Standard Time", 540, true, "(UTC+09:00) Irkutsk", + "North Asia East Standard Time", "North Asia East Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_82, 1 + }, + { + "Tokyo Standard Time", 540, false, "(UTC+09:00) Osaka, Sapporo, Tokyo", + "Tokyo Standard Time", "Tokyo Daylight Time", + NULL, 0 + }, + { + "Korea Standard Time", 540, false, "(UTC+09:00) Seoul", + "Korea Standard Time", "Korea Daylight Time", + NULL, 0 + }, + { + "Cen. Australia Standard Time", 570, true, "(UTC+09:30) Adelaide", + "Cen. Australia Standard Time", "Cen. Australia Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_85, 2 + }, + { + "AUS Central Standard Time", 570, false, "(UTC+09:30) Darwin", + "AUS Central Standard Time", "AUS Central Daylight Time", + NULL, 0 + }, + { + "E. Australia Standard Time", 600, false, "(UTC+10:00) Brisbane", + "E. Australia Standard Time", "E. Australia Daylight Time", + NULL, 0 + }, + { + "AUS Eastern Standard Time", 600, true, "(UTC+10:00) Canberra, Melbourne, Sydney", + "AUS Eastern Standard Time", "AUS Eastern Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_88, 2 + }, + { + "West Pacific Standard Time", 600, false, "(UTC+10:00) Guam, Port Moresby", + "West Pacific Standard Time", "West Pacific Daylight Time", + NULL, 0 + }, + { + "Tasmania Standard Time", 600, true, "(UTC+10:00) Hobart", + "Tasmania Standard Time", "Tasmania Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_90, 2 + }, + { + "Yakutsk Standard Time", 600, true, "(UTC+10:00) Yakutsk", + "Yakutsk Standard Time", "Yakutsk Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_91, 1 + }, + { + "Central Pacific Standard Time", 660, false, "(UTC+11:00) Solomon Is., New Caledonia", + "Central Pacific Standard Time", "Central Pacific Daylight Time", + NULL, 0 + }, + { + "Vladivostok Standard Time", 660, true, "(UTC+11:00) Vladivostok", + "Vladivostok Standard Time", "Vladivostok Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_93, 1 + }, + { + "New Zealand Standard Time", 720, true, "(UTC+12:00) Auckland, Wellington", + "New Zealand Standard Time", "New Zealand Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_94, 3 + }, + { + "UTC+12", 720, false, "(UTC+12:00) Coordinated Universal Time+12", + "UTC+12", "UTC+12", + NULL, 0 + }, + { + "Fiji Standard Time", 720, true, "(UTC+12:00) Fiji", + "Fiji Standard Time", "Fiji Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_96, 5 + }, + { + "Magadan Standard Time", 720, true, "(UTC+12:00) Magadan", + "Magadan Standard Time", "Magadan Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_97, 1 + }, + { + "Kamchatka Standard Time", 720, true, "(UTC+12:00) Petropavlovsk-Kamchatsky - Old", + "Kamchatka Standard Time", "Kamchatka Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_98, 1 + }, + { + "Tonga Standard Time", 780, false, "(UTC+13:00) Nuku'alofa", + "Tonga Standard Time", "Tonga Daylight Time", + NULL, 0 + }, + { + "Samoa Standard Time", 780, true, "(UTC+13:00) Samoa", + "Samoa Standard Time", "Samoa Daylight Time", + (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_100, 2 + } +}; + +/* Table generated with WindowsZones.cs */ + +struct _WINDOWS_TZID_ENTRY +{ + const char* windows; + const char* tzid; +}; +typedef struct _WINDOWS_TZID_ENTRY WINDOWS_TZID_ENTRY; + +const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[] = +{ + { "Afghanistan Standard Time", "Asia/Kabul" }, + { "Alaskan Standard Time", "America/Anchorage America/Juneau " + "America/Nome America/Sitka America/Yakutat" }, + { "Alaskan Standard Time", "America/Anchorage" }, + { "Arab Standard Time", "Asia/Aden" }, + { "Arab Standard Time", "Asia/Bahrain" }, + { "Arab Standard Time", "Asia/Kuwait" }, + { "Arab Standard Time", "Asia/Qatar" }, + { "Arab Standard Time", "Asia/Riyadh" }, + { "Arabian Standard Time", "Asia/Dubai" }, + { "Arabian Standard Time", "Asia/Muscat" }, + { "Arabian Standard Time", "Etc/GMT-4" }, + { "Arabic Standard Time", "Asia/Baghdad" }, + { "Argentina Standard Time", "America/Buenos_Aires America/Argentina/La_Rioja " + "America/Argentina/Rio_Gallegos America/Argentina/Salta " + "America/Argentina/San_Juan America/Argentina/San_Luis " + "America/Argentina/Tucuman America/Argentina/Ushuaia America/Catamarca " + "America/Cordoba America/Jujuy America/Mendoza" }, + { "Argentina Standard Time", "America/Buenos_Aires" }, + { "Atlantic Standard Time", "America/Halifax America/Glace_Bay " + "America/Goose_Bay America/Moncton" }, + { "Atlantic Standard Time", "America/Halifax" }, + { "Atlantic Standard Time", "America/Thule" }, + { "Atlantic Standard Time", "Atlantic/Bermuda" }, + { "AUS Central Standard Time", "Australia/Darwin" }, + { "AUS Eastern Standard Time", "Australia/Sydney Australia/Melbourne" }, + { "AUS Eastern Standard Time", "Australia/Sydney" }, + { "Azerbaijan Standard Time", "Asia/Baku" }, + { "Azores Standard Time", "America/Scoresbysund" }, + { "Azores Standard Time", "Atlantic/Azores" }, + { "Bahia Standard Time", "America/Bahia" }, + { "Bangladesh Standard Time", "Asia/Dhaka" }, + { "Bangladesh Standard Time", "Asia/Thimphu" }, + { "Canada Central Standard Time", "America/Regina America/Swift_Current" }, + { "Canada Central Standard Time", "America/Regina" }, + { "Cape Verde Standard Time", "Atlantic/Cape_Verde" }, + { "Cape Verde Standard Time", "Etc/GMT+1" }, + { "Caucasus Standard Time", "Asia/Yerevan" }, + { "Cen. Australia Standard Time", "Australia/Adelaide Australia/Broken_Hill" }, + { "Cen. Australia Standard Time", "Australia/Adelaide" }, + { "Central America Standard Time", "America/Belize" }, + { "Central America Standard Time", "America/Costa_Rica" }, + { "Central America Standard Time", "America/El_Salvador" }, + { "Central America Standard Time", "America/Guatemala" }, + { "Central America Standard Time", "America/Managua" }, + { "Central America Standard Time", "America/Tegucigalpa" }, + { "Central America Standard Time", "Etc/GMT+6" }, + { "Central America Standard Time", "Pacific/Galapagos" }, + { "Central Asia Standard Time", "Antarctica/Vostok" }, + { "Central Asia Standard Time", "Asia/Almaty Asia/Qyzylorda" }, + { "Central Asia Standard Time", "Asia/Almaty" }, + { "Central Asia Standard Time", "Asia/Bishkek" }, + { "Central Asia Standard Time", "Etc/GMT-6" }, + { "Central Asia Standard Time", "Indian/Chagos" }, + { "Central Brazilian Standard Time", "America/Cuiaba America/Campo_Grande" }, + { "Central Brazilian Standard Time", "America/Cuiaba" }, + { "Central Europe Standard Time", "Europe/Belgrade" }, + { "Central Europe Standard Time", "Europe/Bratislava" }, + { "Central Europe Standard Time", "Europe/Budapest" }, + { "Central Europe Standard Time", "Europe/Ljubljana" }, + { "Central Europe Standard Time", "Europe/Podgorica" }, + { "Central Europe Standard Time", "Europe/Prague" }, + { "Central Europe Standard Time", "Europe/Tirane" }, + { "Central European Standard Time", "Europe/Sarajevo" }, + { "Central European Standard Time", "Europe/Skopje" }, + { "Central European Standard Time", "Europe/Warsaw" }, + { "Central European Standard Time", "Europe/Zagreb" }, + { "Central Pacific Standard Time", "Antarctica/Macquarie" }, + { "Central Pacific Standard Time", "Etc/GMT-11" }, + { "Central Pacific Standard Time", "Pacific/Efate" }, + { "Central Pacific Standard Time", "Pacific/Guadalcanal" }, + { "Central Pacific Standard Time", "Pacific/Noumea" }, + { "Central Pacific Standard Time", "Pacific/Ponape Pacific/Kosrae" }, + { "Central Standard Time (Mexico)", "America/Mexico_City America/Bahia_Banderas " + "America/Cancun America/Merida America/Monterrey" }, + { "Central Standard Time (Mexico)", "America/Mexico_City" }, + { "Central Standard Time", "America/Chicago America/Indiana/Knox " + "America/Indiana/Tell_City America/Menominee " + "America/North_Dakota/Beulah America/North_Dakota/Center " + "America/North_Dakota/New_Salem" }, + { "Central Standard Time", "America/Chicago" }, + { "Central Standard Time", "America/Matamoros" }, + { "Central Standard Time", "America/Winnipeg America/Rainy_River " + "America/Rankin_Inlet America/Resolute" }, + { "Central Standard Time", "CST6CDT" }, + { "China Standard Time", "Asia/Hong_Kong" }, + { "China Standard Time", "Asia/Macau" }, + { "China Standard Time", "Asia/Shanghai Asia/Chongqing Asia/Harbin Asia/Kashgar Asia/Urumqi" }, + { "China Standard Time", "Asia/Shanghai" }, + { "Dateline Standard Time", "Etc/GMT+12" }, + { "E. Africa Standard Time", "Africa/Addis_Ababa" }, + { "E. Africa Standard Time", "Africa/Asmera" }, + { "E. Africa Standard Time", "Africa/Dar_es_Salaam" }, + { "E. Africa Standard Time", "Africa/Djibouti" }, + { "E. Africa Standard Time", "Africa/Juba" }, + { "E. Africa Standard Time", "Africa/Kampala" }, + { "E. Africa Standard Time", "Africa/Khartoum" }, + { "E. Africa Standard Time", "Africa/Mogadishu" }, + { "E. Africa Standard Time", "Africa/Nairobi" }, + { "E. Africa Standard Time", "Antarctica/Syowa" }, + { "E. Africa Standard Time", "Etc/GMT-3" }, + { "E. Africa Standard Time", "Indian/Antananarivo" }, + { "E. Africa Standard Time", "Indian/Comoro" }, + { "E. Africa Standard Time", "Indian/Mayotte" }, + { "E. Australia Standard Time", "Australia/Brisbane Australia/Lindeman" }, + { "E. Australia Standard Time", "Australia/Brisbane" }, + { "E. Europe Standard Time", "Asia/Nicosia" }, + { "E. South America Standard Time", "America/Sao_Paulo" }, + { "Eastern Standard Time", "America/Grand_Turk" }, + { "Eastern Standard Time", "America/Nassau" }, + { "Eastern Standard Time", "America/New_York America/Detroit " + "America/Indiana/Petersburg America/Indiana/Vincennes " + "America/Indiana/Winamac America/Kentucky/Monticello America/Louisville" }, + { "Eastern Standard Time", "America/New_York" }, + { "Eastern Standard Time", "America/Toronto America/Iqaluit America/Montreal " + "America/Nipigon America/Pangnirtung America/Thunder_Bay" }, + { "Eastern Standard Time", "EST5EDT" }, + { "Egypt Standard Time", "Africa/Cairo" }, + { "Egypt Standard Time", "Asia/Gaza Asia/Hebron" }, + { "Ekaterinburg Standard Time", "Asia/Yekaterinburg" }, + { "Fiji Standard Time", "Pacific/Fiji" }, + { "FLE Standard Time", "Europe/Helsinki" }, + { "FLE Standard Time", "Europe/Kiev Europe/Simferopol Europe/Uzhgorod Europe/Zaporozhye" }, + { "FLE Standard Time", "Europe/Kiev" }, + { "FLE Standard Time", "Europe/Mariehamn" }, + { "FLE Standard Time", "Europe/Riga" }, + { "FLE Standard Time", "Europe/Sofia" }, + { "FLE Standard Time", "Europe/Tallinn" }, + { "FLE Standard Time", "Europe/Vilnius" }, + { "Georgian Standard Time", "Asia/Tbilisi" }, + { "GMT Standard Time", "Atlantic/Canary" }, + { "GMT Standard Time", "Atlantic/Faeroe" }, + { "GMT Standard Time", "Europe/Dublin" }, + { "GMT Standard Time", "Europe/Guernsey" }, + { "GMT Standard Time", "Europe/Isle_of_Man" }, + { "GMT Standard Time", "Europe/Jersey" }, + { "GMT Standard Time", "Europe/Lisbon Atlantic/Madeira" }, + { "GMT Standard Time", "Europe/London" }, + { "Greenland Standard Time", "America/Godthab" }, + { "Greenwich Standard Time", "Africa/Abidjan" }, + { "Greenwich Standard Time", "Africa/Accra" }, + { "Greenwich Standard Time", "Africa/Bamako" }, + { "Greenwich Standard Time", "Africa/Banjul" }, + { "Greenwich Standard Time", "Africa/Bissau" }, + { "Greenwich Standard Time", "Africa/Conakry" }, + { "Greenwich Standard Time", "Africa/Dakar" }, + { "Greenwich Standard Time", "Africa/El_Aaiun" }, + { "Greenwich Standard Time", "Africa/Freetown" }, + { "Greenwich Standard Time", "Africa/Lome" }, + { "Greenwich Standard Time", "Africa/Monrovia" }, + { "Greenwich Standard Time", "Africa/Nouakchott" }, + { "Greenwich Standard Time", "Africa/Ouagadougou" }, + { "Greenwich Standard Time", "Africa/Sao_Tome" }, + { "Greenwich Standard Time", "Atlantic/Reykjavik" }, + { "Greenwich Standard Time", "Atlantic/St_Helena" }, + { "GTB Standard Time", "Europe/Athens" }, + { "GTB Standard Time", "Europe/Bucharest" }, + { "GTB Standard Time", "Europe/Chisinau" }, + { "GTB Standard Time", "Europe/Istanbul" }, + { "Hawaiian Standard Time", "Etc/GMT+10" }, + { "Hawaiian Standard Time", "Pacific/Fakaofo" }, + { "Hawaiian Standard Time", "Pacific/Honolulu" }, + { "Hawaiian Standard Time", "Pacific/Johnston" }, + { "Hawaiian Standard Time", "Pacific/Rarotonga" }, + { "Hawaiian Standard Time", "Pacific/Tahiti" }, + { "India Standard Time", "Asia/Calcutta Asia/Kolkata" }, + { "Iran Standard Time", "Asia/Tehran" }, + { "Israel Standard Time", "Asia/Jerusalem" }, + { "Jordan Standard Time", "Asia/Amman" }, + { "Kaliningrad Standard Time", "Europe/Kaliningrad" }, + { "Kaliningrad Standard Time", "Europe/Minsk" }, + { "Korea Standard Time", "Asia/Pyongyang" }, + { "Korea Standard Time", "Asia/Seoul" }, + { "Magadan Standard Time", "Asia/Magadan Asia/Anadyr Asia/Kamchatka" }, + { "Magadan Standard Time", "Asia/Magadan" }, + { "Mauritius Standard Time", "Indian/Mahe" }, + { "Mauritius Standard Time", "Indian/Mauritius" }, + { "Mauritius Standard Time", "Indian/Reunion" }, + { "Middle East Standard Time", "Asia/Beirut" }, + { "Montevideo Standard Time", "America/Montevideo" }, + { "Morocco Standard Time", "Africa/Casablanca" }, + { "Mountain Standard Time (Mexico)", "America/Chihuahua America/Mazatlan" }, + { "Mountain Standard Time (Mexico)", "America/Chihuahua" }, + { "Mountain Standard Time", "America/Denver America/Boise America/Shiprock" }, + { "Mountain Standard Time", "America/Denver" }, + { "Mountain Standard Time", "America/Edmonton " + "America/Cambridge_Bay America/Inuvik America/Yellowknife" }, + { "Mountain Standard Time", "America/Ojinaga" }, + { "Mountain Standard Time", "MST7MDT" }, + { "Myanmar Standard Time", "Asia/Rangoon" }, + { "Myanmar Standard Time", "Indian/Cocos" }, + { "N. Central Asia Standard Time", "Asia/Novosibirsk Asia/Novokuznetsk Asia/Omsk" }, + { "N. Central Asia Standard Time", "Asia/Novosibirsk" }, + { "Namibia Standard Time", "Africa/Windhoek" }, + { "Nepal Standard Time", "Asia/Katmandu Asia/Kathmandu" }, + { "New Zealand Standard Time", "Antarctica/South_Pole Antarctica/McMurdo" }, + { "New Zealand Standard Time", "Pacific/Auckland" }, + { "Newfoundland Standard Time", "America/St_Johns" }, + { "North Asia East Standard Time", "Asia/Irkutsk" }, + { "North Asia Standard Time", "Asia/Krasnoyarsk" }, + { "Pacific SA Standard Time", "America/Santiago" }, + { "Pacific SA Standard Time", "Antarctica/Palmer" }, + { "Pacific Standard Time (Mexico)", "America/Santa_Isabel" }, + { "Pacific Standard Time", "America/Los_Angeles" }, + { "Pacific Standard Time", "America/Tijuana America/Ensenada" }, + { "Pacific Standard Time", "America/Vancouver America/Dawson America/Whitehorse" }, + { "Pacific Standard Time", "PST8PDT" }, + { "Pakistan Standard Time", "Asia/Karachi" }, + { "Paraguay Standard Time", "America/Asuncion" }, + { "Romance Standard Time", "Europe/Brussels" }, + { "Romance Standard Time", "Europe/Copenhagen" }, + { "Romance Standard Time", "Europe/Madrid Africa/Ceuta" }, + { "Romance Standard Time", "Europe/Paris" }, + { "Russian Standard Time", "Europe/Moscow Europe/Samara Europe/Volgograd" }, + { "Russian Standard Time", "Europe/Moscow" }, + { "SA Eastern Standard Time", "America/Cayenne" }, + { "SA Eastern Standard Time", "America/Fortaleza America/Araguaina " + "America/Belem America/Maceio America/Recife America/Santarem" }, + { "SA Eastern Standard Time", "America/Paramaribo" }, + { "SA Eastern Standard Time", "Antarctica/Rothera" }, + { "SA Eastern Standard Time", "Etc/GMT+3" }, + { "SA Pacific Standard Time", "America/Bogota" }, + { "SA Pacific Standard Time", "America/Cayman" }, + { "SA Pacific Standard Time", "America/Coral_Harbour" }, + { "SA Pacific Standard Time", "America/Guayaquil" }, + { "SA Pacific Standard Time", "America/Jamaica" }, + { "SA Pacific Standard Time", "America/Lima" }, + { "SA Pacific Standard Time", "America/Panama" }, + { "SA Pacific Standard Time", "America/Port-au-Prince" }, + { "SA Pacific Standard Time", "Etc/GMT+5" }, + { "SA Western Standard Time", "America/Anguilla" }, + { "SA Western Standard Time", "America/Antigua" }, + { "SA Western Standard Time", "America/Aruba" }, + { "SA Western Standard Time", "America/Barbados" }, + { "SA Western Standard Time", "America/Blanc-Sablon" }, + { "SA Western Standard Time", "America/Curacao" }, + { "SA Western Standard Time", "America/Dominica" }, + { "SA Western Standard Time", "America/Grenada" }, + { "SA Western Standard Time", "America/Guadeloupe" }, + { "SA Western Standard Time", "America/Guyana" }, + { "SA Western Standard Time", "America/La_Paz" }, + { "SA Western Standard Time", "America/Manaus America/Boa_Vista " + "America/Eirunepe America/Porto_Velho America/Rio_Branco" }, + { "SA Western Standard Time", "America/Marigot" }, + { "SA Western Standard Time", "America/Martinique" }, + { "SA Western Standard Time", "America/Montserrat" }, + { "SA Western Standard Time", "America/Port_of_Spain" }, + { "SA Western Standard Time", "America/Puerto_Rico" }, + { "SA Western Standard Time", "America/Santo_Domingo" }, + { "SA Western Standard Time", "America/St_Barthelemy" }, + { "SA Western Standard Time", "America/St_Kitts" }, + { "SA Western Standard Time", "America/St_Lucia" }, + { "SA Western Standard Time", "America/St_Thomas" }, + { "SA Western Standard Time", "America/St_Vincent" }, + { "SA Western Standard Time", "America/Tortola" }, + { "SA Western Standard Time", "Etc/GMT+4" }, + { "Samoa Standard Time", "Pacific/Apia Pacific/Samoa" }, + { "SE Asia Standard Time", "Antarctica/Davis" }, + { "SE Asia Standard Time", "Asia/Bangkok" }, + { "SE Asia Standard Time", "Asia/Hovd" }, + { "SE Asia Standard Time", "Asia/Jakarta Asia/Pontianak" }, + { "SE Asia Standard Time", "Asia/Phnom_Penh" }, + { "SE Asia Standard Time", "Asia/Saigon Asia/Ho_Chi_Minh" }, + { "SE Asia Standard Time", "Asia/Vientiane" }, + { "SE Asia Standard Time", "Etc/GMT-7" }, + { "SE Asia Standard Time", "Indian/Christmas" }, + { "Singapore Standard Time", "Asia/Brunei" }, + { "Singapore Standard Time", "Asia/Kuala_Lumpur Asia/Kuching" }, + { "Singapore Standard Time", "Asia/Makassar" }, + { "Singapore Standard Time", "Asia/Manila" }, + { "Singapore Standard Time", "Asia/Singapore" }, + { "Singapore Standard Time", "Etc/GMT-8" }, + { "South Africa Standard Time", "Africa/Blantyre" }, + { "South Africa Standard Time", "Africa/Bujumbura" }, + { "South Africa Standard Time", "Africa/Gaborone" }, + { "South Africa Standard Time", "Africa/Harare" }, + { "South Africa Standard Time", "Africa/Johannesburg" }, + { "South Africa Standard Time", "Africa/Kigali" }, + { "South Africa Standard Time", "Africa/Lubumbashi" }, + { "South Africa Standard Time", "Africa/Lusaka" }, + { "South Africa Standard Time", "Africa/Maputo" }, + { "South Africa Standard Time", "Africa/Maseru" }, + { "South Africa Standard Time", "Africa/Mbabane" }, + { "South Africa Standard Time", "Africa/Tripoli" }, + { "South Africa Standard Time", "Etc/GMT-2" }, + { "Sri Lanka Standard Time", "Asia/Colombo" }, + { "Syria Standard Time", "Asia/Damascus" }, + { "Taipei Standard Time", "Asia/Taipei" }, + { "Tasmania Standard Time", "Australia/Hobart Australia/Currie" }, + { "Tasmania Standard Time", "Australia/Hobart" }, + { "Tokyo Standard Time", "Asia/Dili" }, + { "Tokyo Standard Time", "Asia/Jayapura" }, + { "Tokyo Standard Time", "Asia/Tokyo" }, + { "Tokyo Standard Time", "Etc/GMT-9" }, + { "Tokyo Standard Time", "Pacific/Palau" }, + { "Tonga Standard Time", "Etc/GMT-13" }, + { "Tonga Standard Time", "Pacific/Enderbury" }, + { "Tonga Standard Time", "Pacific/Tongatapu" }, + /* { "Turkey Standard Time", "Europe/Istanbul" }, */ + { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar Asia/Choibalsan" }, + { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar" }, + { "US Eastern Standard Time", "America/Indianapolis " + "America/Indiana/Marengo America/Indiana/Vevay" }, + { "US Eastern Standard Time", "America/Indianapolis" }, + { "US Mountain Standard Time", "America/Dawson_Creek" }, + { "US Mountain Standard Time", "America/Hermosillo" }, + { "US Mountain Standard Time", "America/Phoenix" }, + { "US Mountain Standard Time", "Etc/GMT+7" }, + { "UTC", "America/Danmarkshavn" }, + { "UTC", "Etc/GMT" }, + { "UTC+12", "Etc/GMT-12" }, + { "UTC+12", "Pacific/Funafuti" }, + { "UTC+12", "Pacific/Majuro Pacific/Kwajalein" }, + { "UTC+12", "Pacific/Nauru" }, + { "UTC+12", "Pacific/Tarawa" }, + { "UTC+12", "Pacific/Wake" }, + { "UTC+12", "Pacific/Wallis" }, + { "UTC-02", "America/Noronha" }, + { "UTC-02", "Atlantic/South_Georgia" }, + { "UTC-02", "Etc/GMT+2" }, + { "UTC-11", "Etc/GMT+11" }, + { "UTC-11", "Pacific/Midway" }, + { "UTC-11", "Pacific/Niue" }, + { "UTC-11", "Pacific/Pago_Pago" }, + { "Venezuela Standard Time", "America/Caracas" }, + { "Vladivostok Standard Time", "Asia/Vladivostok Asia/Sakhalin" }, + { "Vladivostok Standard Time", "Asia/Vladivostok" }, + { "W. Australia Standard Time", "Antarctica/Casey" }, + { "W. Australia Standard Time", "Australia/Perth" }, + { "W. Central Africa Standard Time", "Africa/Algiers" }, + { "W. Central Africa Standard Time", "Africa/Bangui" }, + { "W. Central Africa Standard Time", "Africa/Brazzaville" }, + { "W. Central Africa Standard Time", "Africa/Douala" }, + { "W. Central Africa Standard Time", "Africa/Kinshasa" }, + { "W. Central Africa Standard Time", "Africa/Lagos" }, + { "W. Central Africa Standard Time", "Africa/Libreville" }, + { "W. Central Africa Standard Time", "Africa/Luanda" }, + { "W. Central Africa Standard Time", "Africa/Malabo" }, + { "W. Central Africa Standard Time", "Africa/Ndjamena" }, + { "W. Central Africa Standard Time", "Africa/Niamey" }, + { "W. Central Africa Standard Time", "Africa/Porto-Novo" }, + { "W. Central Africa Standard Time", "Africa/Tunis" }, + { "W. Central Africa Standard Time", "Etc/GMT-1" }, + { "W. Europe Standard Time", "Arctic/Longyearbyen" }, + { "W. Europe Standard Time", "Europe/Amsterdam" }, + { "W. Europe Standard Time", "Europe/Andorra" }, + { "W. Europe Standard Time", "Europe/Berlin" }, + { "W. Europe Standard Time", "Europe/Gibraltar" }, + { "W. Europe Standard Time", "Europe/Luxembourg" }, + { "W. Europe Standard Time", "Europe/Malta" }, + { "W. Europe Standard Time", "Europe/Monaco" }, + { "W. Europe Standard Time", "Europe/Oslo" }, + { "W. Europe Standard Time", "Europe/Rome" }, + { "W. Europe Standard Time", "Europe/San_Marino" }, + { "W. Europe Standard Time", "Europe/Stockholm" }, + { "W. Europe Standard Time", "Europe/Vaduz" }, + { "W. Europe Standard Time", "Europe/Vatican" }, + { "W. Europe Standard Time", "Europe/Vienna" }, + { "W. Europe Standard Time", "Europe/Zurich" }, + { "West Asia Standard Time", "Antarctica/Mawson" }, + { "West Asia Standard Time", "Asia/Ashgabat" }, + { "West Asia Standard Time", "Asia/Dushanbe" }, + { "West Asia Standard Time", "Asia/Oral Asia/Aqtau Asia/Aqtobe" }, + { "West Asia Standard Time", "Asia/Tashkent Asia/Samarkand" }, + { "West Asia Standard Time", "Asia/Tashkent" }, + { "West Asia Standard Time", "Etc/GMT-5" }, + { "West Asia Standard Time", "Indian/Kerguelen" }, + { "West Asia Standard Time", "Indian/Maldives" }, + { "West Pacific Standard Time", "Antarctica/DumontDUrville" }, + { "West Pacific Standard Time", "Etc/GMT-10" }, + { "West Pacific Standard Time", "Pacific/Guam" }, + { "West Pacific Standard Time", "Pacific/Port_Moresby" }, + { "West Pacific Standard Time", "Pacific/Saipan" }, + { "West Pacific Standard Time", "Pacific/Truk" }, + { "Yakutsk Standard Time", "Asia/Yakutsk" } +}; + +/** + * Read SYSTEM_TIME structure (TS_SYSTEMTIME).\n + * @msdn{cc240478} + * @param s stream + * @param system_time system time structure + */ + +void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time) +{ + stream_read_uint16(s, system_time->wYear); /* wYear, must be set to 0 */ + stream_read_uint16(s, system_time->wMonth); /* wMonth */ + stream_read_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */ + stream_read_uint16(s, system_time->wDay); /* wDay */ + stream_read_uint16(s, system_time->wHour); /* wHour */ + stream_read_uint16(s, system_time->wMinute); /* wMinute */ + stream_read_uint16(s, system_time->wSecond); /* wSecond */ + stream_read_uint16(s, system_time->wMilliseconds); /* wMilliseconds */ +} + +/** + * Write SYSTEM_TIME structure (TS_SYSTEMTIME).\n + * @msdn{cc240478} + * @param s stream + * @param system_time system time structure + */ + +void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time) +{ + stream_write_uint16(s, system_time->wYear); /* wYear, must be set to 0 */ + stream_write_uint16(s, system_time->wMonth); /* wMonth */ + stream_write_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */ + stream_write_uint16(s, system_time->wDay); /* wDay */ + stream_write_uint16(s, system_time->wHour); /* wHour */ + stream_write_uint16(s, system_time->wMinute); /* wMinute */ + stream_write_uint16(s, system_time->wSecond); /* wSecond */ + stream_write_uint16(s, system_time->wMilliseconds); /* wMilliseconds */ + DEBUG_TIMEZONE("Time: y=%d,m=%d,dow=%d,d=%d, %02d:%02d:%02d.%03d", + system_time->wYear, system_time->wMonth, system_time->wDayOfWeek, + system_time->wDay, system_time->wHour, system_time->wMinute, + system_time->wSecond, system_time->wMilliseconds); +} + +char* rdp_get_unix_timezone_identifier() +{ + FILE* fp; + ssize_t len; + char* tz_env; + size_t length; + char* tzid = NULL; + char buf[1024]; + + tz_env = getenv("TZ"); + + if (tz_env != NULL) + { + tzid = xstrdup(tz_env); + return tzid; + } + + fp = fopen("/etc/timezone", "r"); + + if (fp != NULL) + { + fseek(fp, 0, SEEK_END); + length = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if (length < 2) + { + fclose(fp); + return NULL; + } + + tzid = (char*) xmalloc(length + 1); + fread(tzid, length, 1, fp); + tzid[length] = '\0'; + + if (tzid[length - 1] == '\n') + tzid[length - 1] = '\0'; + + fclose(fp); + + return tzid; + } + + /* On linux distros such as Redhat or Archlinux, a symlink at /etc/localtime + * will point to /usr/share/zoneinfo/region/place where region/place could be + * America/Montreal for example. + */ + + if ((len = readlink("/etc/localtime", buf, sizeof(buf)-1)) != -1) + { + int num = 0; + int pos = len; + + buf[len] = '\0'; + + /* find the position of the 2nd to last "/" */ + + while(num < 2) + { + if(pos == 0) + break; + + pos -= 1; + + if(buf[pos] == '/') + num++; + } + + tzid = (char*) xmalloc(len - pos + 1); + strncpy(tzid, buf+pos+1, len - pos); + + return tzid; + } + + printf("Unable to detect time zone\n"); + return tzid; +} + +boolean match_unix_timezone_identifier_with_list(const char* tzid, const char* list) +{ + char* p; + char* list_copy; + + list_copy = xstrdup(list); + + p = strtok(list_copy, " "); + + while (p != NULL) + { + if (strcmp(p, tzid) == 0) + { + xfree(list_copy); + return true; + } + + p = strtok(NULL, " "); + } + + xfree(list_copy); + + return false; +} + +TIME_ZONE_ENTRY* rdp_detect_windows_time_zone(uint32 bias) +{ + int i, j; + char* tzid; + TIME_ZONE_ENTRY* timezone; + + tzid = rdp_get_unix_timezone_identifier(); + + if (tzid == NULL) + return NULL; + + for (i = 0; i < ARRAY_SIZE(TimeZoneTable); i++) + { + for (j = 0; j < ARRAY_SIZE(WindowsTimeZoneIdTable); j++) + { + if (strcmp(TimeZoneTable[i].Id, WindowsTimeZoneIdTable[j].windows) != 0) + continue; + + if (match_unix_timezone_identifier_with_list(tzid, WindowsTimeZoneIdTable[j].tzid)) + { + timezone = (TIME_ZONE_ENTRY*) xmalloc(sizeof(TIME_ZONE_ENTRY)); + memcpy((void*) timezone, (void*) &TimeZoneTable[i], sizeof(TIME_ZONE_ENTRY)); + timezone->Bias = bias; + xfree(tzid); + return timezone; + } + } + } + + printf("Unable to find a match for unix timezone: %s\n", tzid); + xfree(tzid); + return NULL; +} + +TIME_ZONE_RULE_ENTRY* rdp_get_current_time_zone_rule(TIME_ZONE_RULE_ENTRY* rules, uint32 count) +{ + int i; + uint64 windows_time; + + windows_time = rdp_windows_gmtime(); + + for (i = 0; i < (int) count; i++) + { + if ((rules[i].TicksStart >= windows_time) && (windows_time >= rules[i].TicksEnd)) + { + /*printf("Got rule %d from table at %p with count %u\n", i, rules, count);*/ + return &rules[i]; + } + } + + fprintf(stderr, "Unable to get current timezone rule\n"); + return NULL; +} + +/** + * Get client time zone information.\n + * @param s stream + * @param settings settings + */ + +void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings) +{ + time_t t; + TIME_ZONE_ENTRY* tz; + TIME_ZONE_INFO* clientTimeZone; + struct tm* local_time; + + clientTimeZone = settings->client_time_zone; + + clientTimeZone->standardBias = 0; + + time(&t); + local_time = localtime(&t); + +#ifdef HAVE_TM_GMTOFF + clientTimeZone->bias = timezone / 60; + DEBUG_TIMEZONE("tzname[std]: %s, tzname[dst]: %s, timezone: %ld, Daylight: %d", tzname[0], tzname[1], timezone, daylight); +#elif sun + if (local_time->tm_isdst > 0) + clientTimeZone->bias = (uint32) (altzone / 3600); + else + clientTimeZone->bias = (uint32) (timezone / 3600); +#else + clientTimeZone->bias = 0; +#endif + + tz = rdp_detect_windows_time_zone(clientTimeZone->bias); + + if (tz != NULL) + { + DEBUG_TIMEZONE("tz: Id='%s' Bias=%d DST=%d dn='%s' sn='%s' dln='%s'", + tz->Id, tz->Bias, tz->SupportsDST, tz->DisplayName, + tz->StandardName, tz->DaylightName); + + sprintf(clientTimeZone->standardName, "%s", tz->StandardName); + sprintf(clientTimeZone->daylightName, "%s", tz->DaylightName); + + if ((tz->SupportsDST) && (tz->RuleTableCount > 0)) + { + TIME_ZONE_RULE_ENTRY* rule; + rule = rdp_get_current_time_zone_rule(tz->RuleTable, tz->RuleTableCount); + + if (rule != NULL) + { + clientTimeZone->daylightBias = -rule->DaylightDelta; + + clientTimeZone->standardDate.wYear = rule->StandardDate.wYear; + clientTimeZone->standardDate.wMonth = rule->StandardDate.wMonth; + clientTimeZone->standardDate.wDayOfWeek = rule->StandardDate.wDayOfWeek; + clientTimeZone->standardDate.wDay = rule->StandardDate.wDay; + clientTimeZone->standardDate.wHour = rule->StandardDate.wHour; + clientTimeZone->standardDate.wMinute = rule->StandardDate.wMinute; + clientTimeZone->standardDate.wSecond = rule->StandardDate.wSecond; + clientTimeZone->standardDate.wMilliseconds = rule->StandardDate.wMilliseconds; + + clientTimeZone->daylightDate.wYear = rule->DaylightDate.wYear; + clientTimeZone->daylightDate.wMonth = rule->DaylightDate.wMonth; + clientTimeZone->daylightDate.wDayOfWeek = rule->DaylightDate.wDayOfWeek; + clientTimeZone->daylightDate.wDay = rule->DaylightDate.wDay; + clientTimeZone->daylightDate.wHour = rule->DaylightDate.wHour; + clientTimeZone->daylightDate.wMinute = rule->DaylightDate.wMinute; + clientTimeZone->daylightDate.wSecond = rule->DaylightDate.wSecond; + clientTimeZone->daylightDate.wMilliseconds = rule->DaylightDate.wMilliseconds; + } + } + + xfree(tz); + } + else + { + /* could not detect timezone, fallback to using GMT */ + DEBUG_TIMEZONE("tz not found, using GMT."); + sprintf(clientTimeZone->standardName, "%s", "GMT Standard Time"); + sprintf(clientTimeZone->daylightName, "%s", "GMT Daylight Time"); + } +} + +/** + * Read client time zone information (TS_TIME_ZONE_INFORMATION).\n + * @msdn{cc240477} + * @param s stream + * @param settings settings + */ + +boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings) +{ + char* str = NULL; + TIME_ZONE_INFO* clientTimeZone; + + if (stream_get_left(s) < 172) + return false; + + clientTimeZone = settings->client_time_zone; + + stream_read_uint32(s, clientTimeZone->bias); /* Bias */ + + /* standardName (64 bytes) */ + str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64 / 2); + stream_seek(s, 64); + strncpy(clientTimeZone->standardName, str, sizeof(clientTimeZone->standardName)); + xfree(str); + str = NULL; + + rdp_read_system_time(s, &clientTimeZone->standardDate); /* StandardDate */ + stream_read_uint32(s, clientTimeZone->standardBias); /* StandardBias */ + + /* daylightName (64 bytes) */ + str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64 / 2); + stream_seek(s, 64); + strncpy(clientTimeZone->daylightName, str, sizeof(clientTimeZone->daylightName)); + xfree(str); + + rdp_read_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */ + stream_read_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */ + + return true; +} + +/** + * Write client time zone information (TS_TIME_ZONE_INFORMATION).\n + * @msdn{cc240477} + * @param s stream + * @param settings settings + */ + +void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings) +{ + size_t length; + uint8* standardName = NULL; + uint8* daylightName = NULL; + size_t standardNameLength; + size_t daylightNameLength; + TIME_ZONE_INFO* clientTimeZone; + + // TODO: CHECK order! + //rdp_get_client_time_zone(s, settings); + //clientTimeZone = settings->client_time_zone; + + clientTimeZone = settings->client_time_zone; + rdp_get_client_time_zone(s, settings); + + standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length); + standardNameLength = length * 2; + + daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length); + daylightNameLength = length * 2; + + if (standardNameLength > 62) + standardNameLength = 62; + + if (daylightNameLength > 62) + daylightNameLength = 62; + + /* Bias */ + stream_write_uint32(s, clientTimeZone->bias); + + /* standardName (64 bytes) */ + stream_write(s, standardName, standardNameLength); + stream_write_zero(s, 64 - standardNameLength); + + /* StandardDate */ + rdp_write_system_time(s, &clientTimeZone->standardDate); + + DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", clientTimeZone->bias, clientTimeZone->standardName, clientTimeZone->daylightName); + + /* Note that StandardBias is ignored if no valid standardDate is provided. */ + + /* StandardBias */ + stream_write_uint32(s, clientTimeZone->standardBias); + DEBUG_TIMEZONE("StandardBias=%d", clientTimeZone->standardBias); + + /* daylightName (64 bytes) */ + stream_write(s, daylightName, daylightNameLength); + stream_write_zero(s, 64 - daylightNameLength); + + /* DaylightDate */ + rdp_write_system_time(s, &clientTimeZone->daylightDate); + + /* Note that DaylightBias is ignored if no valid daylightDate is provided. */ + + /* DaylightBias */ + stream_write_uint32(s, clientTimeZone->daylightBias); + DEBUG_TIMEZONE("DaylightBias=%d", clientTimeZone->daylightBias); + + xfree(standardName); + xfree(daylightName); +} diff --git a/libfreerdp-core/timezone.h b/libfreerdp-core/timezone.h new file mode 100644 index 000000000..4ddeed0fa --- /dev/null +++ b/libfreerdp-core/timezone.h @@ -0,0 +1,42 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Time Zone Redirection + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIMEZONE_H +#define __TIMEZONE_H + +#include "rdp.h" +#include "config.h" + +#include +#include +#include + +void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time); +void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time); +void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings); +boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings); +void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings); + +#ifdef WITH_DEBUG_TIMEZONE +#define DEBUG_TIMEZONE(fmt, ...) DEBUG_CLASS(TIMEZONE, fmt, ## __VA_ARGS__) +#else +#define DEBUG_TIMEZONE(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) +#endif + +#endif /* __TIMEZONE_H */ diff --git a/libfreerdp-utils/CMakeLists.txt b/libfreerdp-utils/CMakeLists.txt index 6757afcd8..3ecb70ff6 100644 --- a/libfreerdp-utils/CMakeLists.txt +++ b/libfreerdp-utils/CMakeLists.txt @@ -46,6 +46,7 @@ set(FREERDP_UTILS_SRCS string.c svc_plugin.c thread.c + time.c unicode.c wait_obj.c) diff --git a/libfreerdp-utils/time.c b/libfreerdp-utils/time.c new file mode 100644 index 000000000..0a6052308 --- /dev/null +++ b/libfreerdp-utils/time.c @@ -0,0 +1,45 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Time Utils + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +uint64 rdp_windows_gmtime() +{ + time_t unix_time; + uint64 windows_time; + + time(&unix_time); + windows_time = rdp_get_windows_time_from_unix_time(unix_time); + + return windows_time; +} + +uint64 rdp_get_windows_time_from_unix_time(time_t unix_time) +{ + uint64 windows_time; + windows_time = ((uint64)unix_time * 10000000) + 621355968000000000ULL; + return windows_time; +} + +time_t rdp_get_unix_time_from_windows_time(uint64 windows_time) +{ + time_t unix_time; + unix_time = (windows_time - 621355968000000000ULL) / 10000000; + return unix_time; +} diff --git a/scripts/TimeZones.cs b/scripts/TimeZones.cs new file mode 100644 index 000000000..0d56032fa --- /dev/null +++ b/scripts/TimeZones.cs @@ -0,0 +1,247 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Time Zone Redirection Table Generator + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.IO; +using System.Globalization; +using System.Collections.ObjectModel; + +namespace TimeZones +{ + struct SYSTEM_TIME_ENTRY + { + public UInt16 wYear; + public UInt16 wMonth; + public UInt16 wDayOfWeek; + public UInt16 wDay; + public UInt16 wHour; + public UInt16 wMinute; + public UInt16 wSecond; + public UInt16 wMilliseconds; + }; + + struct TIME_ZONE_RULE_ENTRY + { + public long TicksStart; + public long TicksEnd; + public Int32 DaylightDelta; + public SYSTEM_TIME_ENTRY StandardDate; + public SYSTEM_TIME_ENTRY DaylightDate; + }; + + struct TIME_ZONE_ENTRY + { + public string Id; + public UInt32 Bias; + public bool SupportsDST; + public string DisplayName; + public string StandardName; + public string DaylightName; + public string RuleTable; + public UInt32 RuleTableCount; + }; + + class TimeZones + { + static void Main(string[] args) + { + int i; + UInt32 index; + const string file = @"TimeZones.txt"; + TimeZoneInfo.AdjustmentRule[] rules; + StreamWriter stream = new StreamWriter(file, false); + ReadOnlyCollection timeZones = TimeZoneInfo.GetSystemTimeZones(); + + stream.WriteLine(); + + stream.WriteLine("struct _SYSTEM_TIME_ENTRY"); + stream.WriteLine("{"); + stream.WriteLine("\tuint16 wYear;"); + stream.WriteLine("\tuint16 wMonth;"); + stream.WriteLine("\tuint16 wDayOfWeek;"); + stream.WriteLine("\tuint16 wDay;"); + stream.WriteLine("\tuint16 wHour;"); + stream.WriteLine("\tuint16 wMinute;"); + stream.WriteLine("\tuint16 wSecond;"); + stream.WriteLine("\tuint16 wMilliseconds;"); + stream.WriteLine("};"); + stream.WriteLine("typedef struct _SYSTEM_TIME_ENTRY SYSTEM_TIME_ENTRY;"); + stream.WriteLine(); + + stream.WriteLine("struct _TIME_ZONE_RULE_ENTRY"); + stream.WriteLine("{"); + stream.WriteLine("\tuint64 TicksStart;"); + stream.WriteLine("\tuint64 TicksEnd;"); + stream.WriteLine("\tsint32 DaylightDelta;"); + stream.WriteLine("\tSYSTEM_TIME_ENTRY StandardDate;"); + stream.WriteLine("\tSYSTEM_TIME_ENTRY DaylightDate;"); + stream.WriteLine("};"); + stream.WriteLine("typedef struct _TIME_ZONE_RULE_ENTRY TIME_ZONE_RULE_ENTRY;"); + stream.WriteLine(); + + stream.WriteLine("struct _TIME_ZONE_ENTRY"); + stream.WriteLine("{"); + stream.WriteLine("\tconst char* Id;"); + stream.WriteLine("\tuint32 Bias;"); + stream.WriteLine("\tboolean SupportsDST;"); + stream.WriteLine("\tconst char* DisplayName;"); + stream.WriteLine("\tconst char* StandardName;"); + stream.WriteLine("\tconst char* DaylightName;"); + stream.WriteLine("\tTIME_ZONE_RULE_ENTRY* RuleTable;"); + stream.WriteLine("\tuint32 RuleTableCount;"); + stream.WriteLine("};"); + stream.WriteLine("typedef struct _TIME_ZONE_ENTRY TIME_ZONE_ENTRY;"); + stream.WriteLine(); + + index = 0; + + foreach (TimeZoneInfo timeZone in timeZones) + { + rules = timeZone.GetAdjustmentRules(); + + if ((!timeZone.SupportsDaylightSavingTime) || (rules.Length < 1)) + { + index++; + continue; + } + + stream.WriteLine("static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_{0}[] =", index); + stream.WriteLine("{"); + + i = 0; + foreach (TimeZoneInfo.AdjustmentRule rule in rules) + { + DateTime time; + TIME_ZONE_RULE_ENTRY tzr; + TimeZoneInfo.TransitionTime transition; + + tzr.TicksStart = rule.DateEnd.ToUniversalTime().Ticks; + tzr.TicksEnd = rule.DateStart.ToUniversalTime().Ticks; + tzr.DaylightDelta = (Int32)rule.DaylightDelta.TotalMinutes; + + transition = rule.DaylightTransitionEnd; + time = transition.TimeOfDay; + + tzr.StandardDate.wYear = (UInt16)0; + tzr.StandardDate.wMonth = (UInt16)transition.Month; + tzr.StandardDate.wDayOfWeek = (UInt16)transition.DayOfWeek; + tzr.StandardDate.wDay = (UInt16)transition.Day; + tzr.StandardDate.wHour = (UInt16)time.Hour; + tzr.StandardDate.wMinute = (UInt16)time.Minute; + tzr.StandardDate.wSecond = (UInt16)time.Second; + tzr.StandardDate.wMilliseconds = (UInt16)time.Millisecond; + + transition = rule.DaylightTransitionStart; + time = transition.TimeOfDay; + + tzr.DaylightDate.wYear = (UInt16)0; + tzr.DaylightDate.wMonth = (UInt16)transition.Month; + tzr.DaylightDate.wDayOfWeek = (UInt16)transition.DayOfWeek; + tzr.DaylightDate.wDay = (UInt16)transition.Day; + tzr.DaylightDate.wHour = (UInt16)time.Hour; + tzr.DaylightDate.wMinute = (UInt16)time.Minute; + tzr.DaylightDate.wSecond = (UInt16)time.Second; + tzr.DaylightDate.wMilliseconds = (UInt16)time.Millisecond; + + stream.Write("\t{"); + stream.Write(" {0}, {1}, {2},", tzr.TicksStart, tzr.TicksEnd, tzr.DaylightDelta); + + stream.Write(" { "); + stream.Write("{0}, {1}, {2}, {3}, {4}, {5}", + tzr.StandardDate.wYear, tzr.StandardDate.wMonth, tzr.StandardDate.wDayOfWeek, + tzr.StandardDate.wDay, tzr.StandardDate.wHour, tzr.StandardDate.wMinute, + tzr.StandardDate.wSecond, tzr.StandardDate.wMilliseconds); + stream.Write(" }, "); + + stream.Write("{ "); + stream.Write("{0}, {1}, {2}, {3}, {4}, {5}", + tzr.DaylightDate.wYear, tzr.DaylightDate.wMonth, tzr.DaylightDate.wDayOfWeek, + tzr.DaylightDate.wDay, tzr.DaylightDate.wHour, tzr.DaylightDate.wMinute, + tzr.DaylightDate.wSecond, tzr.DaylightDate.wMilliseconds); + stream.Write(" },"); + + if (++i < rules.Length) + stream.WriteLine(" },"); + else + stream.WriteLine(" }"); + } + + stream.WriteLine("};"); + stream.WriteLine(); + index++; + } + + index = 0; + stream.WriteLine("static const TIME_ZONE_ENTRY TimeZoneTable[] ="); + stream.WriteLine("{"); + + foreach (TimeZoneInfo timeZone in timeZones) + { + TIME_ZONE_ENTRY tz; + TimeSpan offset = timeZone.BaseUtcOffset; + + rules = timeZone.GetAdjustmentRules(); + + tz.Id = timeZone.Id; + + if (offset.Hours >= 0) + tz.Bias = (UInt32)((offset.Hours * 60) + offset.Minutes); + else + tz.Bias = (UInt32)(((-1 * offset.Hours) * 60) + offset.Minutes + 720); + + tz.SupportsDST = timeZone.SupportsDaylightSavingTime; + + tz.DisplayName = timeZone.DisplayName; + tz.StandardName = timeZone.StandardName; + tz.DaylightName = timeZone.DaylightName; + + if ((!tz.SupportsDST) || (rules.Length < 1)) + { + tz.RuleTableCount = 0; + tz.RuleTable = "NULL"; + } + else + { + tz.RuleTableCount = (UInt32)rules.Length; + tz.RuleTable = "&TimeZoneRuleTable_" + index; + tz.RuleTable = "(TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_" + index; + } + + stream.WriteLine("\t{"); + + stream.WriteLine("\t\t\"{0}\", {1}, {2}, \"{0}\",", + tz.Id, tz.Bias, tz.SupportsDST ? "true" : "false", tz.DisplayName); + + stream.WriteLine("\t\t\"{0}\", \"{0}\",", tz.StandardName, tz.DaylightName); + stream.WriteLine("\t\t{0}, {1}", tz.RuleTable, tz.RuleTableCount); + + index++; + + if ((int) index < timeZones.Count) + stream.WriteLine("\t},"); + else + stream.WriteLine("\t}"); + } + stream.WriteLine("};"); + stream.WriteLine(); + + stream.Close(); + } + } +} diff --git a/scripts/WindowsZones.cs b/scripts/WindowsZones.cs new file mode 100644 index 000000000..d9c2464bd --- /dev/null +++ b/scripts/WindowsZones.cs @@ -0,0 +1,90 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * TZID to Windows TimeZone Identifier Table Generator + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.IO; +using System.Xml; +using System.Text; +using System.Collections; +using System.Collections.Generic; + +/* + * this script uses windowsZones.xml which can be obtained at: + * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html + */ + +namespace WindowsZones +{ + class MainClass + { + public static void Main(string[] args) + { + string tzid, windows; + const string file = @"WindowsZones.txt"; + List list = new List(); + StreamWriter stream = new StreamWriter(file, false); + XmlTextReader reader = new XmlTextReader(@"windowsZones.xml"); + + stream.WriteLine("struct _WINDOWS_TZID_ENTRY"); + stream.WriteLine("{"); + stream.WriteLine("\tconst char* windows;"); + stream.WriteLine("\tconst char* tzid;"); + stream.WriteLine("};"); + stream.WriteLine("typedef struct _WINDOWS_TZID_ENTRY WINDOWS_TZID_ENTRY;"); + stream.WriteLine(); + + while (reader.Read()) + { + switch (reader.NodeType) + { + case XmlNodeType.Element: + + if (reader.Name.Equals("mapZone")) + { + tzid = reader.GetAttribute("type"); + windows = reader.GetAttribute("other"); + + string entry = String.Format("\"{0}\", \"{1}\"", windows, tzid); + + if (!list.Contains(entry)) + list.Add(entry); + } + + break; + } + } + + list.Sort(); + + stream.WriteLine("const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[] ="); + stream.WriteLine("{"); + + foreach (string entry in list) + { + stream.Write("\t{ "); + stream.Write(entry); + stream.WriteLine(" },"); + } + + stream.WriteLine("};"); + + stream.Close(); + } + } +}