| /* |
| * Copyright 2017 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "cros-camera/timezone.h" |
| |
| #include <stddef.h> |
| #include <string.h> |
| |
| #include <map> |
| |
| #include <base/files/file_util.h> |
| #include <base/macros.h> |
| #include <base/stl_util.h> |
| #include <base/strings/string16.h> |
| #include <base/strings/utf_string_conversions.h> |
| |
| #include "cros-camera/common.h" |
| |
| namespace cros { |
| |
| namespace { |
| |
| const char kTimeZoneFilePath[] = "/etc/localtime"; |
| const char kZoneInfoFilePath[] = "/usr/share/zoneinfo/"; |
| |
| class TimezoneMap { |
| public: |
| TimezoneMap(const TimezoneMap&) = delete; |
| TimezoneMap& operator=(const TimezoneMap&) = delete; |
| static TimezoneMap* GetInstance() { |
| // TODO(shik): change to base::NoDestructor after libchrome uprev. |
| static TimezoneMap* instance = new TimezoneMap(); |
| return instance; |
| } |
| |
| std::string CountryCodeForTimezone(const std::string& olson_code) { |
| std::map<const char*, const char*, CompareCStrings>::iterator iter = |
| map_.find(olson_code.c_str()); |
| if (iter != map_.end()) |
| return iter->second; |
| |
| return std::string(); |
| } |
| |
| private: |
| TimezoneMap() { |
| // These mappings are adapted from zone.tab, which is available at |
| // <http://www.ietf.org/timezones/data/zone.tab> and is a part of public |
| // domain. |
| struct OlsonCodeData { |
| const char* country_code; |
| const char* olson_code; |
| }; |
| static const OlsonCodeData olson_code_data[] = { |
| {"AD", "Europe/Andorra"}, |
| {"AE", "Asia/Dubai"}, |
| {"AF", "Asia/Kabul"}, |
| {"AG", "America/Antigua"}, |
| {"AI", "America/Anguilla"}, |
| {"AL", "Europe/Tirane"}, |
| {"AM", "Asia/Yerevan"}, |
| {"AO", "Africa/Luanda"}, |
| {"AQ", "Antarctica/McMurdo"}, |
| {"AQ", "Antarctica/Rothera"}, |
| {"AQ", "Antarctica/Palmer"}, |
| {"AQ", "Antarctica/Mawson"}, |
| {"AQ", "Antarctica/Davis"}, |
| {"AQ", "Antarctica/Casey"}, |
| {"AQ", "Antarctica/Vostok"}, |
| {"AQ", "Antarctica/DumontDUrville"}, |
| {"AQ", "Antarctica/Syowa"}, |
| {"AR", "America/Argentina/Buenos_Aires"}, |
| {"AR", "America/Argentina/Cordoba"}, |
| {"AR", "America/Argentina/Salta"}, |
| {"AR", "America/Argentina/Jujuy"}, |
| {"AR", "America/Argentina/Tucuman"}, |
| {"AR", "America/Argentina/Catamarca"}, |
| {"AR", "America/Argentina/La_Rioja"}, |
| {"AR", "America/Argentina/San_Juan"}, |
| {"AR", "America/Argentina/Mendoza"}, |
| {"AR", "America/Argentina/San_Luis"}, |
| {"AR", "America/Argentina/Rio_Gallegos"}, |
| {"AR", "America/Argentina/Ushuaia"}, |
| {"AS", "Pacific/Pago_Pago"}, |
| {"AT", "Europe/Vienna"}, |
| {"AU", "Australia/Lord_Howe"}, |
| {"AU", "Antarctica/Macquarie"}, |
| {"AU", "Australia/Hobart"}, |
| {"AU", "Australia/Currie"}, |
| {"AU", "Australia/Melbourne"}, |
| {"AU", "Australia/Sydney"}, |
| {"AU", "Australia/Broken_Hill"}, |
| {"AU", "Australia/Brisbane"}, |
| {"AU", "Australia/Lindeman"}, |
| {"AU", "Australia/Adelaide"}, |
| {"AU", "Australia/Darwin"}, |
| {"AU", "Australia/Perth"}, |
| {"AU", "Australia/Eucla"}, |
| {"AW", "America/Aruba"}, |
| {"AX", "Europe/Mariehamn"}, |
| {"AZ", "Asia/Baku"}, |
| {"BA", "Europe/Sarajevo"}, |
| {"BB", "America/Barbados"}, |
| {"BD", "Asia/Dhaka"}, |
| {"BE", "Europe/Brussels"}, |
| {"BF", "Africa/Ouagadougou"}, |
| {"BG", "Europe/Sofia"}, |
| {"BH", "Asia/Bahrain"}, |
| {"BI", "Africa/Bujumbura"}, |
| {"BJ", "Africa/Porto-Novo"}, |
| {"BL", "America/St_Barthelemy"}, |
| {"BM", "Atlantic/Bermuda"}, |
| {"BN", "Asia/Brunei"}, |
| {"BO", "America/La_Paz"}, |
| {"BQ", "America/Kralendijk"}, |
| {"BR", "America/Noronha"}, |
| {"BR", "America/Belem"}, |
| {"BR", "America/Fortaleza"}, |
| {"BR", "America/Recife"}, |
| {"BR", "America/Araguaina"}, |
| {"BR", "America/Maceio"}, |
| {"BR", "America/Bahia"}, |
| {"BR", "America/Sao_Paulo"}, |
| {"BR", "America/Campo_Grande"}, |
| {"BR", "America/Cuiaba"}, |
| {"BR", "America/Santarem"}, |
| {"BR", "America/Porto_Velho"}, |
| {"BR", "America/Boa_Vista"}, |
| {"BR", "America/Manaus"}, |
| {"BR", "America/Eirunepe"}, |
| {"BR", "America/Rio_Branco"}, |
| {"BS", "America/Nassau"}, |
| {"BT", "Asia/Thimphu"}, |
| {"BW", "Africa/Gaborone"}, |
| {"BY", "Europe/Minsk"}, |
| {"BZ", "America/Belize"}, |
| {"CA", "America/St_Johns"}, |
| {"CA", "America/Halifax"}, |
| {"CA", "America/Glace_Bay"}, |
| {"CA", "America/Moncton"}, |
| {"CA", "America/Goose_Bay"}, |
| {"CA", "America/Blanc-Sablon"}, |
| {"CA", "America/Toronto"}, |
| {"CA", "America/Nipigon"}, |
| {"CA", "America/Thunder_Bay"}, |
| {"CA", "America/Iqaluit"}, |
| {"CA", "America/Pangnirtung"}, |
| {"CA", "America/Resolute"}, |
| {"CA", "America/Atikokan"}, |
| {"CA", "America/Rankin_Inlet"}, |
| {"CA", "America/Winnipeg"}, |
| {"CA", "America/Rainy_River"}, |
| {"CA", "America/Regina"}, |
| {"CA", "America/Swift_Current"}, |
| {"CA", "America/Edmonton"}, |
| {"CA", "America/Cambridge_Bay"}, |
| {"CA", "America/Yellowknife"}, |
| {"CA", "America/Inuvik"}, |
| {"CA", "America/Creston"}, |
| {"CA", "America/Dawson_Creek"}, |
| {"CA", "America/Vancouver"}, |
| {"CA", "America/Whitehorse"}, |
| {"CA", "America/Dawson"}, |
| {"CC", "Indian/Cocos"}, |
| {"CD", "Africa/Kinshasa"}, |
| {"CD", "Africa/Lubumbashi"}, |
| {"CF", "Africa/Bangui"}, |
| {"CG", "Africa/Brazzaville"}, |
| {"CH", "Europe/Zurich"}, |
| {"CI", "Africa/Abidjan"}, |
| {"CK", "Pacific/Rarotonga"}, |
| {"CL", "America/Santiago"}, |
| {"CL", "Pacific/Easter"}, |
| {"CM", "Africa/Douala"}, |
| {"CN", "Asia/Shanghai"}, |
| {"CN", "Asia/Harbin"}, |
| {"CN", "Asia/Chongqing"}, |
| {"CN", "Asia/Urumqi"}, |
| {"CN", "Asia/Kashgar"}, |
| {"CO", "America/Bogota"}, |
| {"CR", "America/Costa_Rica"}, |
| {"CU", "America/Havana"}, |
| {"CV", "Atlantic/Cape_Verde"}, |
| {"CW", "America/Curacao"}, |
| {"CX", "Indian/Christmas"}, |
| {"CY", "Asia/Nicosia"}, |
| {"CZ", "Europe/Prague"}, |
| {"DE", "Europe/Berlin"}, |
| {"DE", "Europe/Busingen"}, |
| {"DJ", "Africa/Djibouti"}, |
| {"DK", "Europe/Copenhagen"}, |
| {"DM", "America/Dominica"}, |
| {"DO", "America/Santo_Domingo"}, |
| {"DZ", "Africa/Algiers"}, |
| {"EC", "America/Guayaquil"}, |
| {"EC", "Pacific/Galapagos"}, |
| {"EE", "Europe/Tallinn"}, |
| {"EG", "Africa/Cairo"}, |
| {"EH", "Africa/El_Aaiun"}, |
| {"ER", "Africa/Asmara"}, |
| {"ES", "Europe/Madrid"}, |
| {"ES", "Africa/Ceuta"}, |
| {"ES", "Atlantic/Canary"}, |
| {"ET", "Africa/Addis_Ababa"}, |
| {"FI", "Europe/Helsinki"}, |
| {"FJ", "Pacific/Fiji"}, |
| {"FK", "Atlantic/Stanley"}, |
| {"FM", "Pacific/Chuuk"}, |
| {"FM", "Pacific/Pohnpei"}, |
| {"FM", "Pacific/Kosrae"}, |
| {"FO", "Atlantic/Faroe"}, |
| {"FR", "Europe/Paris"}, |
| {"GA", "Africa/Libreville"}, |
| {"GB", "Europe/London"}, |
| {"GD", "America/Grenada"}, |
| {"GE", "Asia/Tbilisi"}, |
| {"GF", "America/Cayenne"}, |
| {"GG", "Europe/Guernsey"}, |
| {"GH", "Africa/Accra"}, |
| {"GI", "Europe/Gibraltar"}, |
| {"GL", "America/Godthab"}, |
| {"GL", "America/Danmarkshavn"}, |
| {"GL", "America/Scoresbysund"}, |
| {"GL", "America/Thule"}, |
| {"GM", "Africa/Banjul"}, |
| {"GN", "Africa/Conakry"}, |
| {"GP", "America/Guadeloupe"}, |
| {"GQ", "Africa/Malabo"}, |
| {"GR", "Europe/Athens"}, |
| {"GS", "Atlantic/South_Georgia"}, |
| {"GT", "America/Guatemala"}, |
| {"GU", "Pacific/Guam"}, |
| {"GW", "Africa/Bissau"}, |
| {"GY", "America/Guyana"}, |
| {"HK", "Asia/Hong_Kong"}, |
| {"HN", "America/Tegucigalpa"}, |
| {"HR", "Europe/Zagreb"}, |
| {"HT", "America/Port-au-Prince"}, |
| {"HU", "Europe/Budapest"}, |
| {"ID", "Asia/Jakarta"}, |
| {"ID", "Asia/Pontianak"}, |
| {"ID", "Asia/Makassar"}, |
| {"ID", "Asia/Jayapura"}, |
| {"IE", "Europe/Dublin"}, |
| {"IL", "Asia/Jerusalem"}, |
| {"IM", "Europe/Isle_of_Man"}, |
| {"IN", "Asia/Kolkata"}, |
| {"IO", "Indian/Chagos"}, |
| {"IQ", "Asia/Baghdad"}, |
| {"IR", "Asia/Tehran"}, |
| {"IS", "Atlantic/Reykjavik"}, |
| {"IT", "Europe/Rome"}, |
| {"JE", "Europe/Jersey"}, |
| {"JM", "America/Jamaica"}, |
| {"JO", "Asia/Amman"}, |
| {"JP", "Asia/Tokyo"}, |
| {"KE", "Africa/Nairobi"}, |
| {"KG", "Asia/Bishkek"}, |
| {"KH", "Asia/Phnom_Penh"}, |
| {"KI", "Pacific/Tarawa"}, |
| {"KI", "Pacific/Enderbury"}, |
| {"KI", "Pacific/Kiritimati"}, |
| {"KM", "Indian/Comoro"}, |
| {"KN", "America/St_Kitts"}, |
| {"KP", "Asia/Pyongyang"}, |
| {"KR", "Asia/Seoul"}, |
| {"KW", "Asia/Kuwait"}, |
| {"KY", "America/Cayman"}, |
| {"KZ", "Asia/Almaty"}, |
| {"KZ", "Asia/Qyzylorda"}, |
| {"KZ", "Asia/Aqtobe"}, |
| {"KZ", "Asia/Aqtau"}, |
| {"KZ", "Asia/Oral"}, |
| {"LA", "Asia/Vientiane"}, |
| {"LB", "Asia/Beirut"}, |
| {"LC", "America/St_Lucia"}, |
| {"LI", "Europe/Vaduz"}, |
| {"LK", "Asia/Colombo"}, |
| {"LR", "Africa/Monrovia"}, |
| {"LS", "Africa/Maseru"}, |
| {"LT", "Europe/Vilnius"}, |
| {"LU", "Europe/Luxembourg"}, |
| {"LV", "Europe/Riga"}, |
| {"LY", "Africa/Tripoli"}, |
| {"MA", "Africa/Casablanca"}, |
| {"MC", "Europe/Monaco"}, |
| {"MD", "Europe/Chisinau"}, |
| {"ME", "Europe/Podgorica"}, |
| {"MF", "America/Marigot"}, |
| {"MG", "Indian/Antananarivo"}, |
| {"MH", "Pacific/Majuro"}, |
| {"MH", "Pacific/Kwajalein"}, |
| {"MK", "Europe/Skopje"}, |
| {"ML", "Africa/Bamako"}, |
| {"MM", "Asia/Rangoon"}, |
| {"MN", "Asia/Ulaanbaatar"}, |
| {"MN", "Asia/Hovd"}, |
| {"MN", "Asia/Choibalsan"}, |
| {"MO", "Asia/Macau"}, |
| {"MP", "Pacific/Saipan"}, |
| {"MQ", "America/Martinique"}, |
| {"MR", "Africa/Nouakchott"}, |
| {"MS", "America/Montserrat"}, |
| {"MT", "Europe/Malta"}, |
| {"MU", "Indian/Mauritius"}, |
| {"MV", "Indian/Maldives"}, |
| {"MW", "Africa/Blantyre"}, |
| {"MX", "America/Mexico_City"}, |
| {"MX", "America/Cancun"}, |
| {"MX", "America/Merida"}, |
| {"MX", "America/Monterrey"}, |
| {"MX", "America/Matamoros"}, |
| {"MX", "America/Mazatlan"}, |
| {"MX", "America/Chihuahua"}, |
| {"MX", "America/Ojinaga"}, |
| {"MX", "America/Hermosillo"}, |
| {"MX", "America/Tijuana"}, |
| {"MX", "America/Santa_Isabel"}, |
| {"MX", "America/Bahia_Banderas"}, |
| {"MY", "Asia/Kuala_Lumpur"}, |
| {"MY", "Asia/Kuching"}, |
| {"MZ", "Africa/Maputo"}, |
| {"NA", "Africa/Windhoek"}, |
| {"NC", "Pacific/Noumea"}, |
| {"NE", "Africa/Niamey"}, |
| {"NF", "Pacific/Norfolk"}, |
| {"NG", "Africa/Lagos"}, |
| {"NI", "America/Managua"}, |
| {"NL", "Europe/Amsterdam"}, |
| {"NO", "Europe/Oslo"}, |
| {"NP", "Asia/Kathmandu"}, |
| {"NR", "Pacific/Nauru"}, |
| {"NU", "Pacific/Niue"}, |
| {"NZ", "Pacific/Auckland"}, |
| {"NZ", "Pacific/Chatham"}, |
| {"OM", "Asia/Muscat"}, |
| {"PA", "America/Panama"}, |
| {"PE", "America/Lima"}, |
| {"PF", "Pacific/Tahiti"}, |
| {"PF", "Pacific/Marquesas"}, |
| {"PF", "Pacific/Gambier"}, |
| {"PG", "Pacific/Port_Moresby"}, |
| {"PH", "Asia/Manila"}, |
| {"PK", "Asia/Karachi"}, |
| {"PL", "Europe/Warsaw"}, |
| {"PM", "America/Miquelon"}, |
| {"PN", "Pacific/Pitcairn"}, |
| {"PR", "America/Puerto_Rico"}, |
| {"PS", "Asia/Gaza"}, |
| {"PS", "Asia/Hebron"}, |
| {"PT", "Europe/Lisbon"}, |
| {"PT", "Atlantic/Madeira"}, |
| {"PT", "Atlantic/Azores"}, |
| {"PW", "Pacific/Palau"}, |
| {"PY", "America/Asuncion"}, |
| {"QA", "Asia/Qatar"}, |
| {"RE", "Indian/Reunion"}, |
| {"RO", "Europe/Bucharest"}, |
| {"RS", "Europe/Belgrade"}, |
| {"RU", "Europe/Kaliningrad"}, |
| {"RU", "Europe/Moscow"}, |
| {"RU", "Europe/Volgograd"}, |
| {"RU", "Europe/Samara"}, |
| {"RU", "Asia/Yekaterinburg"}, |
| {"RU", "Asia/Omsk"}, |
| {"RU", "Asia/Novosibirsk"}, |
| {"RU", "Asia/Novokuznetsk"}, |
| {"RU", "Asia/Krasnoyarsk"}, |
| {"RU", "Asia/Irkutsk"}, |
| {"RU", "Asia/Yakutsk"}, |
| {"RU", "Asia/Khandyga"}, |
| {"RU", "Asia/Vladivostok"}, |
| {"RU", "Asia/Sakhalin"}, |
| {"RU", "Asia/Ust-Nera"}, |
| {"RU", "Asia/Magadan"}, |
| {"RU", "Asia/Kamchatka"}, |
| {"RU", "Asia/Anadyr"}, |
| {"RW", "Africa/Kigali"}, |
| {"SA", "Asia/Riyadh"}, |
| {"SB", "Pacific/Guadalcanal"}, |
| {"SC", "Indian/Mahe"}, |
| {"SD", "Africa/Khartoum"}, |
| {"SE", "Europe/Stockholm"}, |
| {"SG", "Asia/Singapore"}, |
| {"SH", "Atlantic/St_Helena"}, |
| {"SI", "Europe/Ljubljana"}, |
| {"SJ", "Arctic/Longyearbyen"}, |
| {"SK", "Europe/Bratislava"}, |
| {"SL", "Africa/Freetown"}, |
| {"SM", "Europe/San_Marino"}, |
| {"SN", "Africa/Dakar"}, |
| {"SO", "Africa/Mogadishu"}, |
| {"SR", "America/Paramaribo"}, |
| {"SS", "Africa/Juba"}, |
| {"ST", "Africa/Sao_Tome"}, |
| {"SV", "America/El_Salvador"}, |
| {"SX", "America/Lower_Princes"}, |
| {"SY", "Asia/Damascus"}, |
| {"SZ", "Africa/Mbabane"}, |
| {"TC", "America/Grand_Turk"}, |
| {"TD", "Africa/Ndjamena"}, |
| {"TF", "Indian/Kerguelen"}, |
| {"TG", "Africa/Lome"}, |
| {"TH", "Asia/Bangkok"}, |
| {"TJ", "Asia/Dushanbe"}, |
| {"TK", "Pacific/Fakaofo"}, |
| {"TL", "Asia/Dili"}, |
| {"TM", "Asia/Ashgabat"}, |
| {"TN", "Africa/Tunis"}, |
| {"TO", "Pacific/Tongatapu"}, |
| {"TR", "Europe/Istanbul"}, |
| {"TT", "America/Port_of_Spain"}, |
| {"TV", "Pacific/Funafuti"}, |
| {"TW", "Asia/Taipei"}, |
| {"TZ", "Africa/Dar_es_Salaam"}, |
| {"UA", "Europe/Kiev"}, |
| {"UA", "Europe/Uzhgorod"}, |
| {"UA", "Europe/Zaporozhye"}, |
| {"UA", "Europe/Simferopol"}, |
| {"UG", "Africa/Kampala"}, |
| {"UM", "Pacific/Johnston"}, |
| {"UM", "Pacific/Midway"}, |
| {"UM", "Pacific/Wake"}, |
| {"US", "America/New_York"}, |
| {"US", "America/Detroit"}, |
| {"US", "America/Kentucky/Louisville"}, |
| {"US", "America/Kentucky/Monticello"}, |
| {"US", "America/Indiana/Indianapolis"}, |
| {"US", "America/Indiana/Vincennes"}, |
| {"US", "America/Indiana/Winamac"}, |
| {"US", "America/Indiana/Marengo"}, |
| {"US", "America/Indiana/Petersburg"}, |
| {"US", "America/Indiana/Vevay"}, |
| {"US", "America/Chicago"}, |
| {"US", "America/Indiana/Tell_City"}, |
| {"US", "America/Indiana/Knox"}, |
| {"US", "America/Menominee"}, |
| {"US", "America/North_Dakota/Center"}, |
| {"US", "America/North_Dakota/New_Salem"}, |
| {"US", "America/North_Dakota/Beulah"}, |
| {"US", "America/Denver"}, |
| {"US", "America/Boise"}, |
| {"US", "America/Phoenix"}, |
| {"US", "America/Los_Angeles"}, |
| {"US", "America/Anchorage"}, |
| {"US", "America/Juneau"}, |
| {"US", "America/Sitka"}, |
| {"US", "America/Yakutat"}, |
| {"US", "America/Nome"}, |
| {"US", "America/Adak"}, |
| {"US", "America/Metlakatla"}, |
| {"US", "Pacific/Honolulu"}, |
| {"UY", "America/Montevideo"}, |
| {"UZ", "Asia/Samarkand"}, |
| {"UZ", "Asia/Tashkent"}, |
| {"VA", "Europe/Vatican"}, |
| {"VC", "America/St_Vincent"}, |
| {"VE", "America/Caracas"}, |
| {"VG", "America/Tortola"}, |
| {"VI", "America/St_Thomas"}, |
| {"VN", "Asia/Ho_Chi_Minh"}, |
| {"VU", "Pacific/Efate"}, |
| {"WF", "Pacific/Wallis"}, |
| {"WS", "Pacific/Apia"}, |
| {"YE", "Asia/Aden"}, |
| {"YT", "Indian/Mayotte"}, |
| {"ZA", "Africa/Johannesburg"}, |
| {"ZM", "Africa/Lusaka"}, |
| {"ZW", "Africa/Harare"}, |
| // The mappings below are custom additions to zone.tab. |
| {"GB", "Etc/GMT"}, |
| {"GB", "Etc/UTC"}, |
| {"GB", "Etc/UCT"}, |
| }; |
| |
| for (size_t i = 0; i < base::size(olson_code_data); ++i) |
| map_[olson_code_data[i].olson_code] = olson_code_data[i].country_code; |
| |
| // These are mapping from old codenames to new codenames. They are also |
| // part of public domain, and available at |
| // <http://www.ietf.org/timezones/data/backward>. |
| struct LinkData { |
| const char* old_code; |
| const char* new_code; |
| }; |
| static const LinkData link_data[] = { |
| {"Africa/Asmera", "Africa/Asmara"}, |
| {"Africa/Timbuktu", "Africa/Bamako"}, |
| {"America/Argentina/ComodRivadavia", "America/Argentina/Catamarca"}, |
| {"America/Atka", "America/Adak"}, |
| {"America/Buenos_Aires", "America/Argentina/Buenos_Aires"}, |
| {"America/Catamarca", "America/Argentina/Catamarca"}, |
| {"America/Coral_Harbour", "America/Atikokan"}, |
| {"America/Cordoba", "America/Argentina/Cordoba"}, |
| {"America/Ensenada", "America/Tijuana"}, |
| {"America/Fort_Wayne", "America/Indiana/Indianapolis"}, |
| {"America/Indianapolis", "America/Indiana/Indianapolis"}, |
| {"America/Jujuy", "America/Argentina/Jujuy"}, |
| {"America/Knox_IN", "America/Indiana/Knox"}, |
| {"America/Louisville", "America/Kentucky/Louisville"}, |
| {"America/Mendoza", "America/Argentina/Mendoza"}, |
| {"America/Porto_Acre", "America/Rio_Branco"}, |
| {"America/Rosario", "America/Argentina/Cordoba"}, |
| {"America/Virgin", "America/St_Thomas"}, |
| {"Asia/Ashkhabad", "Asia/Ashgabat"}, |
| {"Asia/Chungking", "Asia/Chongqing"}, |
| {"Asia/Dacca", "Asia/Dhaka"}, |
| {"Asia/Katmandu", "Asia/Kathmandu"}, |
| {"Asia/Calcutta", "Asia/Kolkata"}, |
| {"Asia/Macao", "Asia/Macau"}, |
| {"Asia/Tel_Aviv", "Asia/Jerusalem"}, |
| {"Asia/Saigon", "Asia/Ho_Chi_Minh"}, |
| {"Asia/Thimbu", "Asia/Thimphu"}, |
| {"Asia/Ujung_Pandang", "Asia/Makassar"}, |
| {"Asia/Ulan_Bator", "Asia/Ulaanbaatar"}, |
| {"Atlantic/Faeroe", "Atlantic/Faroe"}, |
| {"Atlantic/Jan_Mayen", "Europe/Oslo"}, |
| {"Australia/ACT", "Australia/Sydney"}, |
| {"Australia/Canberra", "Australia/Sydney"}, |
| {"Australia/LHI", "Australia/Lord_Howe"}, |
| {"Australia/NSW", "Australia/Sydney"}, |
| {"Australia/North", "Australia/Darwin"}, |
| {"Australia/Queensland", "Australia/Brisbane"}, |
| {"Australia/South", "Australia/Adelaide"}, |
| {"Australia/Tasmania", "Australia/Hobart"}, |
| {"Australia/Victoria", "Australia/Melbourne"}, |
| {"Australia/West", "Australia/Perth"}, |
| {"Australia/Yancowinna", "Australia/Broken_Hill"}, |
| {"Brazil/Acre", "America/Rio_Branco"}, |
| {"Brazil/DeNoronha", "America/Noronha"}, |
| {"Brazil/East", "America/Sao_Paulo"}, |
| {"Brazil/West", "America/Manaus"}, |
| {"Canada/Atlantic", "America/Halifax"}, |
| {"Canada/Central", "America/Winnipeg"}, |
| {"Canada/East-Saskatchewan", "America/Regina"}, |
| {"Canada/Eastern", "America/Toronto"}, |
| {"Canada/Mountain", "America/Edmonton"}, |
| {"Canada/Newfoundland", "America/St_Johns"}, |
| {"Canada/Pacific", "America/Vancouver"}, |
| {"Canada/Saskatchewan", "America/Regina"}, |
| {"Canada/Yukon", "America/Whitehorse"}, |
| {"Chile/Continental", "America/Santiago"}, |
| {"Chile/EasterIsland", "Pacific/Easter"}, |
| {"Cuba", "America/Havana"}, |
| {"Egypt", "Africa/Cairo"}, |
| {"Eire", "Europe/Dublin"}, |
| {"Europe/Belfast", "Europe/London"}, |
| {"Europe/Tiraspol", "Europe/Chisinau"}, |
| {"GB", "Europe/London"}, |
| {"GB-Eire", "Europe/London"}, |
| {"GMT+0", "Etc/GMT"}, |
| {"GMT-0", "Etc/GMT"}, |
| {"GMT0", "Etc/GMT"}, |
| {"Greenwich", "Etc/GMT"}, |
| {"Hongkong", "Asia/Hong_Kong"}, |
| {"Iceland", "Atlantic/Reykjavik"}, |
| {"Iran", "Asia/Tehran"}, |
| {"Israel", "Asia/Jerusalem"}, |
| {"Jamaica", "America/Jamaica"}, |
| {"Japan", "Asia/Tokyo"}, |
| {"Kwajalein", "Pacific/Kwajalein"}, |
| {"Libya", "Africa/Tripoli"}, |
| {"Mexico/BajaNorte", "America/Tijuana"}, |
| {"Mexico/BajaSur", "America/Mazatlan"}, |
| {"Mexico/General", "America/Mexico_City"}, |
| {"NZ", "Pacific/Auckland"}, |
| {"NZ-CHAT", "Pacific/Chatham"}, |
| {"Navajo", "America/Denver"}, |
| {"PRC", "Asia/Shanghai"}, |
| {"Pacific/Samoa", "Pacific/Pago_Pago"}, |
| {"Pacific/Yap", "Pacific/Chuuk"}, |
| {"Pacific/Truk", "Pacific/Chuuk"}, |
| {"Pacific/Ponape", "Pacific/Pohnpei"}, |
| {"Poland", "Europe/Warsaw"}, |
| {"Portugal", "Europe/Lisbon"}, |
| {"ROC", "Asia/Taipei"}, |
| {"ROK", "Asia/Seoul"}, |
| {"Singapore", "Asia/Singapore"}, |
| {"Turkey", "Europe/Istanbul"}, |
| {"UCT", "Etc/UCT"}, |
| {"US/Alaska", "America/Anchorage"}, |
| {"US/Aleutian", "America/Adak"}, |
| {"US/Arizona", "America/Phoenix"}, |
| {"US/Central", "America/Chicago"}, |
| {"US/East-Indiana", "America/Indiana/Indianapolis"}, |
| {"US/Eastern", "America/New_York"}, |
| {"US/Hawaii", "Pacific/Honolulu"}, |
| {"US/Indiana-Starke", "America/Indiana/Knox"}, |
| {"US/Michigan", "America/Detroit"}, |
| {"US/Mountain", "America/Denver"}, |
| {"US/Pacific", "America/Los_Angeles"}, |
| {"US/Samoa", "Pacific/Pago_Pago"}, |
| {"UTC", "Etc/UTC"}, |
| {"Universal", "Etc/UTC"}, |
| {"W-SU", "Europe/Moscow"}, |
| {"Zulu", "Etc/UTC"}, |
| }; |
| |
| for (size_t i = 0; i < base::size(link_data); ++i) |
| map_[link_data[i].old_code] = map_[link_data[i].new_code]; |
| } |
| |
| struct CompareCStrings { |
| bool operator()(const char* str1, const char* str2) const { |
| return strcmp(str1, str2) < 0; |
| } |
| }; |
| std::map<const char*, const char*, CompareCStrings> map_; |
| }; |
| |
| } // namespace |
| |
| std::string CountryCodeForCurrentTimezone() { |
| base::FilePath target; |
| base::FilePath timezone_path(kTimeZoneFilePath); |
| while (base::ReadSymbolicLink(timezone_path, &target)) { |
| timezone_path = base::FilePath(target); |
| } |
| if (timezone_path.value().compare(0, strlen(kZoneInfoFilePath), |
| kZoneInfoFilePath)) { |
| LOGF(WARNING) << "Timezone is unknown. Anti banding may be broken."; |
| return std::string(); |
| } |
| std::string olson_code = timezone_path.value(); |
| olson_code.replace(0, strlen(kZoneInfoFilePath), ""); |
| LOGF(INFO) << "Timezone: " << olson_code; |
| return TimezoneMap::GetInstance()->CountryCodeForTimezone(olson_code); |
| } |
| |
| PowerLineFrequency GetPowerLineFrequencyForLocation() { |
| const std::string current_country = CountryCodeForCurrentTimezone(); |
| if (current_country.empty()) |
| return PowerLineFrequency::FREQ_DEFAULT; |
| LOGF(INFO) << "Country: " << current_country; |
| // Sorted out list of countries with 60Hz power line frequency, from |
| // http://en.wikipedia.org/wiki/Mains_electricity_by_country |
| const char* countries_using_60Hz[] = { |
| "AI", "AO", "AS", "AW", "AZ", "BM", "BR", "BS", "BZ", "CA", "CO", |
| "CR", "CU", "DO", "EC", "FM", "GT", "GU", "GY", "HN", "HT", "JP", |
| "KN", "KR", "KY", "MS", "MX", "NI", "PA", "PE", "PF", "PH", "PR", |
| "PW", "SA", "SR", "SV", "TT", "TW", "UM", "US", "VG", "VI", "VE"}; |
| const char** countries_using_60Hz_end = |
| countries_using_60Hz + base::size(countries_using_60Hz); |
| if (std::find(countries_using_60Hz, countries_using_60Hz_end, |
| current_country) == countries_using_60Hz_end) { |
| return PowerLineFrequency::FREQ_50HZ; |
| } |
| return PowerLineFrequency::FREQ_60HZ; |
| } |
| |
| } // namespace cros |