16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1997-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File TIMEZONE.CPP 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 12/05/96 clhuang Creation. 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 04/21/97 aliu General clean-up and bug fixing. 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/08/97 aliu Fixed Hashtable code per code review. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/09/97 helena Changed createInstance to createDefault. 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/29/97 aliu Updated with all-new list of 96 UNIX-derived 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* TimeZones. Changed mechanism to load from static 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* array rather than resource bundle. 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/07/1998 srl Bugfixes from the Java side: UTC GMT CAT NST 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Added getDisplayName API 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* going to add custom parsing. 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* ISSUES: 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* - should getDisplayName cache something? 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* - should custom time zones be cached? [probably] 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 08/10/98 stephen Brought getDisplayName() API in-line w/ conventions 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 08/19/98 stephen Changed createTimeZone() to never return 0 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 09/02/98 stephen Added getOffset(monthLen) and hasSameRules() 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 09/15/98 stephen Added getStaticClassID() 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 02/22/99 stephen Removed character literals for EBCDIC safety 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/04/99 stephen Changed initDefault() for Mutex issues 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/12/99 helena HPUX 11 CC Port. 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 12/03/99 aliu Moved data out of static table into icudata.dll. 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Substantial rewrite of zone lookup, default zone, and 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* available IDs code. Misc. cleanup. 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*********************************************************************************/ 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "utypeinfo.h" // for 'typeid' to work 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h" 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustr_imp.h" 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_TZ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include <stdio.h> 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include "uresimp.h" // for debugging 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void debug_tz_loc(const char *f, int32_t l) 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stderr, "%s:%d: ", f, l); 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void debug_tz_msg(const char *pat, ...) 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org va_list ap; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org va_start(ap, pat); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vfprintf(stderr, pat, ap); 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(stderr); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char gStrBuf[256]; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_DEBUG_TZ_STR(x) u_austrncpy(gStrBuf,x,sizeof(gStrBuf)-1) 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// must use double parens, i.e.: U_DEBUG_TZ_MSG(("four is: %d",4)); 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_DEBUG_TZ_MSG(x) {debug_tz_loc(__FILE__,__LINE__);debug_tz_msg x;} 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_DEBUG_TZ_MSG(x) 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/simpletz.h" 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h" 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gregocal.h" 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h" 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/tzfmt.h" 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numfmt.h" 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "gregoimp.h" 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h" // struct UResourceBundle 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "olsontz.h" 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "mutex.h" 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h" 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_in.h" 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/strenum.h" 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h" 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "zonemeta.h" 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kZONEINFO "zoneinfo64" 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kREGIONS "Regions" 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kZONES "Zones" 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kRULES "Rules" 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kNAMES "Names" 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kTZVERSION "TZVersion" 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kLINKS "links" 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kMAX_CUSTOM_HOUR 23 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kMAX_CUSTOM_MIN 59 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kMAX_CUSTOM_SEC 59 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MINUS 0x002D 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PLUS 0x002B 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ZERO_DIGIT 0x0030 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define COLON 0x003A 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Static data and constants 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar WORLD[] = {0x30, 0x30, 0x31, 0x00}; /* "001" */ 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar GMT_ID[] = {0x47, 0x4D, 0x54, 0x00}; /* "GMT" */ 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar UNKNOWN_ZONE_ID[] = {0x45, 0x74, 0x63, 0x2F, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x00}; /* "Etc/Unknown" */ 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t GMT_ID_LENGTH = 3; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t UNKNOWN_ZONE_ID_LENGTH = 11; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::TimeZone* DEFAULT_ZONE = NULL; 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gDefaultZoneInitOnce = U_INITONCE_INITIALIZER; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::TimeZone* _GMT = NULL; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::TimeZone* _UNKNOWN_ZONE = NULL; 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gStaticZonesInitOnce = U_INITONCE_INITIALIZER; 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char TZDATA_VERSION[16]; 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gTZDataVersionInitOnce = U_INITONCE_INITIALIZER; 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t* MAP_SYSTEM_ZONES = NULL; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t* MAP_CANONICAL_SYSTEM_ZONES = NULL; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t* MAP_CANONICAL_SYSTEM_LOCATION_ZONES = NULL; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t LEN_SYSTEM_ZONES = 0; 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t LEN_CANONICAL_SYSTEM_ZONES = 0; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t LEN_CANONICAL_SYSTEM_LOCATION_ZONES = 0; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gSystemZonesInitOnce = U_INITONCE_INITIALIZER; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gCanonicalZonesInitOnce = U_INITONCE_INITIALIZER; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gCanonicalLocationZonesInitOnce = U_INITONCE_INITIALIZER; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV timeZone_cleanup(void) 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_NAMESPACE_USE 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete DEFAULT_ZONE; 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEFAULT_ZONE = NULL; 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gDefaultZoneInitOnce.reset(); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete _GMT; 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _GMT = NULL; 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete _UNKNOWN_ZONE; 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _UNKNOWN_ZONE = NULL; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gStaticZonesInitOnce.reset(); 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(TZDATA_VERSION, 0, sizeof(TZDATA_VERSION)); 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gTZDataVersionInitOnce.reset(); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_SYSTEM_ZONES = 0; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(MAP_SYSTEM_ZONES); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_SYSTEM_ZONES = 0; 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gSystemZonesInitOnce.reset(); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_CANONICAL_SYSTEM_ZONES = 0; 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(MAP_CANONICAL_SYSTEM_ZONES); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_CANONICAL_SYSTEM_ZONES = 0; 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gCanonicalZonesInitOnce.reset(); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_CANONICAL_SYSTEM_LOCATION_ZONES = 0; 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(MAP_CANONICAL_SYSTEM_LOCATION_ZONES); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_CANONICAL_SYSTEM_LOCATION_ZONES = 0; 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gCanonicalLocationZonesInitOnce.reset(); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t findInStringArray(UResourceBundle* array, const UnicodeString& id, UErrorCode &status) 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString copy; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *u; 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t start = 0; 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t limit = ures_getSize(array); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t mid; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lastMid = INT32_MAX; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status) || (limit < 1)) { 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("fisa: Looking for %s, between %d and %d\n", U_DEBUG_TZ_STR(UnicodeString(id).getTerminatedBuffer()), start, limit)); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mid = (int32_t)((start + limit) / 2); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lastMid == mid) { /* Have we moved? */ 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; /* We haven't moved, and it wasn't found. */ 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lastMid = mid; 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u = ures_getStringByIndex(array, mid, &len, &status); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("tz: compare to %s, %d .. [%d] .. %d\n", U_DEBUG_TZ_STR(u), start, mid, limit)); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org copy.setTo(TRUE, u, len); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int r = id.compare(copy); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(r==0) { 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("fisa: found at %d\n", mid)); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return mid; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(r<0) { 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org limit = mid; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start = mid; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("fisa: not found\n")); 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Fetch a specific zone by name. Replaces the getByKey call. 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param top Top timezone resource 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id Time zone ID 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param oldbundle Bundle for reuse (or NULL). see 'ures_open()' 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the zone's bundle if found, or undefined if error. Reuses oldbundle. 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UResourceBundle* getZoneByName(const UResourceBundle* top, const UnicodeString& id, UResourceBundle *oldbundle, UErrorCode& status) { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // load the Rules object 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *tmp = ures_getByKey(top, kNAMES, NULL, &status); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // search for the string 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idx = findInStringArray(tmp, id, status); 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((idx == -1) && U_SUCCESS(status)) { 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // not found 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MISSING_RESOURCE_ERROR; 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //ures_close(oldbundle); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //oldbundle = NULL; 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("gzbn: oldbundle= size %d, type %d, %s\n", ures_getSize(tmp), ures_getType(tmp), u_errorName(status))); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tmp = ures_getByKey(top, kZONES, tmp, &status); // get Zones object from top 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("gzbn: loaded ZONES, size %d, type %d, path %s %s\n", ures_getSize(tmp), ures_getType(tmp), ures_getPath(tmp), u_errorName(status))); 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldbundle = ures_getByIndex(tmp, idx, oldbundle, &status); // get nth Zone object 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("gzbn: loaded z#%d, size %d, type %d, path %s, %s\n", idx, ures_getSize(oldbundle), ures_getType(oldbundle), ures_getPath(oldbundle), u_errorName(status))); 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(tmp); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //ures_close(oldbundle); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return oldbundle; 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUResourceBundle* TimeZone::loadRule(const UResourceBundle* top, const UnicodeString& ruleid, UResourceBundle* oldbundle, UErrorCode& status) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char key[64]; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ruleid.extract(0, sizeof(key)-1, key, (int32_t)sizeof(key)-1, US_INV); 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("loadRule(%s)\n", key)); 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *r = ures_getByKey(top, kRULES, oldbundle, &status); 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("loadRule(%s) -> kRULES [%s]\n", key, u_errorName(status))); 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org r = ures_getByKey(r, key, r, &status); 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("loadRule(%s) -> item [%s]\n", key, u_errorName(status))); 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return r; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Given an ID, open the appropriate resource for the given time zone. 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Dereference aliases if necessary. 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id zone id 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param res resource, which must be ready for use (initialized but not open) 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param ec input-output error code 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return top-level resource bundle 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UResourceBundle* openOlsonResource(const UnicodeString& id, 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle& res, 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& ec) 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG_TZ 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buf[128]; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("pre: res sz=%d\n", ures_getSize(&res))); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* &res = */ getZoneByName(top, id, &res, ec); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Dereference if this is an alias. Docs say result should be 1 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // but it is 0 in 2.8 (?). 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("Loading zone '%s' (%s, size %d) - %s\n", buf, ures_getKey((UResourceBundle*)&res), ures_getSize(&res), u_errorName(ec))); 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ures_getType(&res) == URES_INT) { 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t deref = ures_getInt(&res, &ec) + 0; 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("getInt: %s - type is %d\n", u_errorName(ec), ures_getType(&res))); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *ares = ures_getByKey(top, kZONES, NULL, &ec); // dereference Zones section 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByIndex(ares, deref, &res, &ec); 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(ares); 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("alias to #%d (%s) - %s\n", deref, "??", u_errorName(ec))); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("not an alias - size %d\n", ures_getSize(&res))); 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("%s - final status is %s\n", buf, u_errorName(ec))); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return top; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace { 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid U_CALLCONV initStaticTimeZones() { 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Initialize _GMT independently of other static data; it should 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // be valid even if we can't load the time zone UDataMemory. 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _UNKNOWN_ZONE = new SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)); 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _GMT = new SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH)); 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} // anonymous namespace 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst TimeZone& U_EXPORT2 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getUnknown() 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return *_UNKNOWN_ZONE; 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst TimeZone* U_EXPORT2 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getGMT(void) 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return _GMT; 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ***************************************************************************** 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class TimeZone 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ***************************************************************************** 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(TimeZone) 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::TimeZone() 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : UObject(), fID() 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::TimeZone(const UnicodeString &id) 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : UObject(), fID(id) 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::~TimeZone() 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::TimeZone(const TimeZone &source) 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : UObject(source), fID(source.fID) 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone & 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::operator=(const TimeZone &right) 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (this != &right) fID = right.fID; 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return *this; 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::operator==(const TimeZone& that) const 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return typeid(*this) == typeid(that) && 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fID == that.fID; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace { 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone* 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcreateSystemTimeZone(const UnicodeString& id, UErrorCode& ec) { 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone* z = 0; 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle res; 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&res); 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec))); 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *top = openOlsonResource(id, res, ec); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec))); 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z = new OlsonTimeZone(top, &res, id, ec); 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (z == NULL) { 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&res); 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(top); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec))); 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z; 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z = 0; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return z; 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Lookup the given name in our system zone table. If found, 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * instantiate a new zone of that name and return it. If not 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * found, return 0. 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone* 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcreateSystemTimeZone(const UnicodeString& id) { 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return createSystemTimeZone(id, ec); 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone* U_EXPORT2 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createTimeZone(const UnicodeString& ID) 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We first try to lookup the zone ID in our system list. If this 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * fails, we try to parse it as a custom string GMT[+-]hh:mm. If 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * all else fails, we return GMT, which is probably not what the 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * user wants, but at least is a functioning TimeZone object. 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We cannot return NULL, because that would break compatibility 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with the JDK. 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone* result = createSystemTimeZone(ID); 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("failed to load system time zone with id - falling to custom")); 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = createCustomTimeZone(ID); 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unknown(GMT)")); 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = getUnknown().clone(); 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Initialize DEFAULT_ZONE from the system default time zone. 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Upon return, DEFAULT_ZONE will not be NULL, unless operator new() 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * returns NULL. 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initDefault() 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // If setDefault() has already been called we can skip getting the 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // default zone information from the system. 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (DEFAULT_ZONE != NULL) { 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We access system timezone data through TPlatformUtilities, 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // including tzset(), timezone, and tzname[]. 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rawOffset = 0; 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *hostID; 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // First, try to create a system timezone, based 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // on the string ID in tzname[0]. 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NOTE: this code is safely single threaded, being only 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // run via umtx_initOnce(). 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Some of the locale/timezone OS functions may not be thread safe, 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The operating system might actually use ICU to implement timezones. 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // So we may have ICU calling ICU here, like on AIX. 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // There shouldn't be a problem with this; initOnce does not hold a mutex 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // while the init function is being run. 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_tzset(); // Initialize tz... system data 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Get the timezone ID from the host. This function should do 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // any required host-specific remapping; e.g., on Windows this 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // function maps the Date and Time control panel setting to an 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ICU timezone ID. 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hostID = uprv_tzname(0); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Invert sign because UNIX semantics are backwards 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND; 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone* default_zone = NULL; 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */ 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString hostStrID(hostID, -1, US_INV); 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hostStrID.append((UChar)0); 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hostStrID.truncate(hostStrID.length()-1); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default_zone = createSystemTimeZone(hostStrID); 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // hostID points to a heap-allocated location on Windows. 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(const_cast<char *>(hostID)); 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t hostIDLen = hostStrID.length(); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (default_zone != NULL && rawOffset != default_zone->getRawOffset() 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org && (3 <= hostIDLen && hostIDLen <= 4)) 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Uh oh. This probably wasn't a good id. 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It was probably an ambiguous abbreviation 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete default_zone; 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default_zone = NULL; 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct a fixed standard zone with the host's ID 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // and raw offset. 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (default_zone == NULL) { 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default_zone = new SimpleTimeZone(rawOffset, hostStrID); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // If we _still_ don't have a time zone, use GMT. 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (default_zone == NULL) { 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const TimeZone* temptz = TimeZone::getGMT(); 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // If we can't use GMT, get out. 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (temptz == NULL) { 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default_zone = temptz->clone(); 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The only way for DEFAULT_ZONE to be non-null at this point is if the user 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // made a thread-unsafe call to setDefault() or adoptDefault() in another 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // thread while this thread was doing something that required getting the default. 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(DEFAULT_ZONE == NULL); 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEFAULT_ZONE = default_zone; 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone* U_EXPORT2 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createDefault() 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gDefaultZoneInitOnce, initDefault); 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (DEFAULT_ZONE != NULL) ? DEFAULT_ZONE->clone() : NULL; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid U_EXPORT2 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::adoptDefault(TimeZone* zone) 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (zone != NULL) 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *old = DEFAULT_ZONE; 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEFAULT_ZONE = zone; 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete old; 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid U_EXPORT2 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::setDefault(const TimeZone& zone) 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org adoptDefault(zone.clone()); 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//---------------------------------------------------------------------- 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initMap(USystemTimeZoneType type, UErrorCode& ec) { 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *res = ures_openDirect(0, kZONEINFO, &ec); 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res = ures_getByKey(res, kNAMES, res, &ec); // dereference Zones section 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size = ures_getSize(res); 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *m = (int32_t *)uprv_malloc(size * sizeof(int32_t)); 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (m == NULL) { 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_MEMORY_ALLOCATION_ERROR; 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numEntries = 0; 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < size; i++) { 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString id = ures_getUnicodeStringByIndex(res, i, &ec); 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 == id.compare(UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)) { 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // exclude Etc/Unknown 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (type == UCAL_ZONE_TYPE_CANONICAL || type == UCAL_ZONE_TYPE_CANONICAL_LOCATION) { 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString canonicalID; 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ZoneMeta::getCanonicalCLDRID(id, canonicalID, ec); 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (canonicalID != id) { 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // exclude aliases 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (type == UCAL_ZONE_TYPE_CANONICAL_LOCATION) { 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *region = TimeZone::getRegion(id, ec); 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_strcmp(region, WORLD) == 0) { 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // exclude non-location ("001") 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m[numEntries++] = i; 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *tmp = m; 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = (int32_t *)uprv_realloc(tmp, numEntries * sizeof(int32_t)); 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (m == NULL) { 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // realloc failed.. use the original one even it has unused 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // area at the end 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = tmp; 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch(type) { 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_ANY: 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(MAP_SYSTEM_ZONES == NULL); 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_SYSTEM_ZONES = m; 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_SYSTEM_ZONES = numEntries; 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_CANONICAL: 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(MAP_CANONICAL_SYSTEM_ZONES == NULL); 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_CANONICAL_SYSTEM_ZONES = m; 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_CANONICAL_SYSTEM_ZONES = numEntries; 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_CANONICAL_LOCATION: 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(MAP_CANONICAL_SYSTEM_LOCATION_ZONES == NULL); 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MAP_CANONICAL_SYSTEM_LOCATION_ZONES = m; 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEN_CANONICAL_SYSTEM_LOCATION_ZONES = numEntries; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(res); 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is the default implementation for subclasses that do not 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * override this method. This implementation calls through to the 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8-argument getOffset() method after suitable computations, and 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * correctly adjusts GMT millis to local millis when necessary. 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset, 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t& dstOffset, UErrorCode& ec) const { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rawOffset = getRawOffset(); 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!local) { 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org date += rawOffset; // now in local standard millis 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // When local == TRUE, date might not be in local standard 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // millis. getOffset taking 7 parameters used here assume 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the given time in day is local standard time. 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // At STD->DST transition, there is a range of time which 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // does not exist. When 'date' is in this time range 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (and local == TRUE), this method interprets the specified 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // local time as DST. At DST->STD transition, there is a 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // range of time which occurs twice. In this case, this 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // method interprets the specified local time as STD. 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // To support the behavior above, we need to call getOffset 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (with 7 args) twice when local == true and DST is 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // detected in the initial call. 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t pass=0; ; ++pass) { 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t year, month, dom, dow; 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double day = uprv_floor(date / U_MILLIS_PER_DAY); 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t millis = (int32_t) (date - day * U_MILLIS_PER_DAY); 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Grego::dayToFields(day, year, month, dom, dow); 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dstOffset = getOffset(GregorianCalendar::AD, year, month, dom, 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (uint8_t) dow, millis, 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Grego::monthLength(year, month), 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec) - rawOffset; 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Recompute if local==TRUE, dstOffset!=0. 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pass!=0 || !local || dstOffset == 0) { 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // adjust to local standard millis 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org date -= dstOffset; 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// New available IDs API as of ICU 2.4. Uses StringEnumeration API. 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TZEnumeration : public StringEnumeration { 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Map into to zones. Our results are zone[map[i]] for 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // i=0..len-1, where zone[i] is the i-th Olson zone. If map==NULL 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // then our results are zone[i] for i=0..len-1. Len will be zero 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // if the zone data could not be loaded. 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* map; 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* localMap; 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len; 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t pos; 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TZEnumeration(int32_t* mapData, int32_t mapLen, UBool adoptMapData) : pos(0) { 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org map = mapData; 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localMap = adoptMapData ? mapData : NULL; 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = mapLen; 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool getID(int32_t i) { 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idLen = 0; 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* id = NULL; 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org top = ures_getByKey(top, kNAMES, top, &ec); // dereference Zones section 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id = ures_getStringByIndex(top, i, &idLen, &ec); 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)) { 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org unistr.truncate(0); 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org unistr.fastCopyFrom(UnicodeString(TRUE, id, idLen)); 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(top); 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return U_SUCCESS(ec); 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int32_t* getMap(USystemTimeZoneType type, int32_t& len, UErrorCode& ec) { 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = 0; 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* m = NULL; 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) { 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_ANY: 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gSystemZonesInitOnce, &initMap, type, ec); 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = MAP_SYSTEM_ZONES; 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = LEN_SYSTEM_ZONES; 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_CANONICAL: 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gCanonicalZonesInitOnce, &initMap, type, ec); 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = MAP_CANONICAL_SYSTEM_ZONES; 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = LEN_CANONICAL_SYSTEM_ZONES; 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UCAL_ZONE_TYPE_CANONICAL_LOCATION: 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gCanonicalLocationZonesInitOnce, &initMap, type, ec); 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = MAP_CANONICAL_SYSTEM_LOCATION_ZONES; 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = LEN_CANONICAL_SYSTEM_LOCATION_ZONES; 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ILLEGAL_ARGUMENT_ERROR; 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org m = NULL; 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = 0; 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return m; 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DEFAULT_FILTERED_MAP_SIZE 8 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAP_INCREMENT_SIZE 8 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static TZEnumeration* create(USystemTimeZoneType type, const char* region, const int32_t* rawOffset, UErrorCode& ec) { 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t baseLen; 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *baseMap = getMap(type, baseLen, ec); 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // If any additional conditions are available, 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // create instance local map filtered by the conditions. 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *filteredMap = NULL; 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numEntries = 0; 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (region != NULL || rawOffset != NULL) { 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t filteredMapSize = DEFAULT_FILTERED_MAP_SIZE; 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMap = (int32_t *)uprv_malloc(filteredMapSize * sizeof(int32_t)); 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (filteredMap == NULL) { 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_MEMORY_ALLOCATION_ERROR; 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Walk through the base map 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *res = ures_openDirect(0, kZONEINFO, &ec); 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res = ures_getByKey(res, kNAMES, res, &ec); // dereference Zones section 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < baseLen; i++) { 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t zidx = baseMap[i]; 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString id = ures_getUnicodeStringByIndex(res, zidx, &ec); 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (region != NULL) { 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Filter by region 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char tzregion[4]; // max 3 letters + null term 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone::getRegion(id, tzregion, sizeof(tzregion), ec); 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_stricmp(tzregion, region) != 0) { 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // region does not match 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rawOffset != NULL) { 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Filter by raw offset 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Note: This is VERY inefficient 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *z = createSystemTimeZone(id, ec); 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t tzoffset = z->getRawOffset(); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z; 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tzoffset != *rawOffset) { 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (filteredMapSize <= numEntries) { 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMapSize += MAP_INCREMENT_SIZE; 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *tmp = (int32_t *)uprv_realloc(filteredMap, filteredMapSize * sizeof(int32_t)); 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tmp == NULL) { 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_MEMORY_ALLOCATION_ERROR; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMap = tmp; 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMap[numEntries++] = zidx; 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(filteredMap); 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMap = NULL; 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(res); 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TZEnumeration *result = NULL; 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Finally, create a new enumeration instance 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (filteredMap == NULL) { 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = new TZEnumeration(baseMap, baseLen, FALSE); 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = new TZEnumeration(filteredMap, numEntries, TRUE); 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filteredMap = NULL; 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == NULL) { 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_MEMORY_ALLOCATION_ERROR; 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (filteredMap != NULL) { 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(filteredMap); 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TZEnumeration(const TZEnumeration &other) : StringEnumeration(), map(NULL), localMap(NULL), len(0), pos(0) { 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (other.localMap != NULL) { 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localMap = (int32_t *)uprv_malloc(other.len * sizeof(int32_t)); 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (localMap != NULL) { 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = other.len; 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(localMap, other.localMap, len * sizeof(int32_t)); 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos = other.pos; 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org map = localMap; 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = 0; 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos = 0; 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org map = NULL; 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org map = other.map; 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localMap = NULL; 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = other.len; 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos = other.pos; 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~TZEnumeration(); 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual StringEnumeration *clone() const { 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new TZEnumeration(*this); 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual int32_t count(UErrorCode& status) const { 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return U_FAILURE(status) ? 0 : len; 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const UnicodeString* snext(UErrorCode& status) { 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) && map != NULL && pos < len) { 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getID(map[pos]); 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++pos; 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return &unistr; 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void reset(UErrorCode& /*status*/) { 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos = 0; 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(void); 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID(void) const; 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTZEnumeration::~TZEnumeration() { 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (localMap != NULL) { 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(localMap); 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(TZEnumeration) 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createTimeZoneIDEnumeration( 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org USystemTimeZoneType zoneType, 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* region, 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t* rawOffset, 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& ec) { 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TZEnumeration::create(zoneType, region, rawOffset, ec); 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createEnumeration() { 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TZEnumeration::create(UCAL_ZONE_TYPE_ANY, NULL, NULL, ec); 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createEnumeration(int32_t rawOffset) { 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TZEnumeration::create(UCAL_ZONE_TYPE_ANY, NULL, &rawOffset, ec); 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createEnumeration(const char* country) { 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TZEnumeration::create(UCAL_ZONE_TYPE_ANY, country, NULL, ec); 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// --------------------------------------- 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t U_EXPORT2 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::countEquivalentIDs(const UnicodeString& id) { 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t result = 0; 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle res; 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&res); 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("countEquivalentIDs..\n")); 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *top = openOlsonResource(id, res, ec); 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle r; 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&r); 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(&res, kLINKS, &r, &ec); 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getIntVector(&r, &result, &ec); 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&r); 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&res); 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(top); 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// --------------------------------------- 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UnicodeString U_EXPORT2 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getEquivalentID(const UnicodeString& id, int32_t index) { 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("gEI(%d)\n", index)); 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString result; 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle res; 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&res); 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *top = openOlsonResource(id, res, ec); 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t zone = -1; 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle r; 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&r); 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size; 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(&res, kLINKS, &r, &ec); 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t* v = ures_getIntVector(&r, &size, &ec); 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (index >= 0 && index < size) { 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = v[index]; 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&r); 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&res); 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (zone >= 0) { 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *ares = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Zones section 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idLen = 0; 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* id = ures_getStringByIndex(ares, zone, &idLen, &ec); 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.fastCopyFrom(UnicodeString(TRUE, id, idLen)); 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("gei(%d) -> %d, len%d, %s\n", index, zone, result.length(), u_errorName(ec))); 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(ares); 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(top); 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(U_DEBUG_TZ) 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result.length() ==0) { 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_DEBUG_TZ_MSG(("equiv [__, #%d] -> 0 (%s)\n", index, u_errorName(ec))); 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// --------------------------------------- 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// These methods are used by ZoneMeta class only. 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar* 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::findID(const UnicodeString& id) { 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *result = NULL; 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *rb = ures_openDirect(NULL, kZONEINFO, &ec); 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // resolve zone index by name 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *names = ures_getByKey(rb, kNAMES, NULL, &ec); 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idx = findInStringArray(names, id, ec); 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ures_getStringByIndex(names, idx, NULL, &ec); 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = NULL; 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(names); 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(rb); 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar* 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::dereferOlsonLink(const UnicodeString& id) { 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *result = NULL; 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *rb = ures_openDirect(NULL, kZONEINFO, &ec); 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // resolve zone index by name 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *names = ures_getByKey(rb, kNAMES, NULL, &ec); 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idx = findInStringArray(names, id, ec); 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ures_getStringByIndex(names, idx, NULL, &ec); 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // open the zone bundle by index 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(rb, kZONES, rb, &ec); 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByIndex(rb, idx, rb, &ec); 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ures_getType(rb) == URES_INT) { 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // this is a link - dereference the link 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t deref = ures_getInt(rb, &ec); 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* tmp = ures_getStringByIndex(names, deref, NULL, &ec); 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(ec)) { 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = tmp; 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(names); 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(rb); 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar* 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getRegion(const UnicodeString& id) { 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getRegion(id, status); 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar* 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getRegion(const UnicodeString& id, UErrorCode& status) { 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *result = NULL; 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *rb = ures_openDirect(NULL, kZONEINFO, &status); 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // resolve zone index by name 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *res = ures_getByKey(rb, kNAMES, NULL, &status); 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t idx = findInStringArray(res, id, status); 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // get region mapping 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(rb, kREGIONS, res, &status); 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *tmp = ures_getStringByIndex(res, idx, NULL, &status); 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = tmp; 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(res); 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(rb); 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// --------------------------------------- 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getRegion(const UnicodeString& id, char *region, int32_t capacity, UErrorCode& status) 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t resultLen = 0; 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *region = 0; 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *uregion = NULL; 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // "Etc/Unknown" is not a system zone ID, 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // but in the zone data 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (id.compare(UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH) != 0) { 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uregion = getRegion(id); 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uregion == NULL) { 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org resultLen = u_strlen(uregion); 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // A region code is represented by invariant characters 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(uregion, region, uprv_min(resultLen, capacity)); 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (capacity < resultLen) { 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_BUFFER_OVERFLOW_ERROR; 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return resultLen; 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return u_terminateChars(region, capacity, resultLen, &status); 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// --------------------------------------- 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getDisplayName(UnicodeString& result) const 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getDisplayName(FALSE,LONG,Locale::getDefault(), result); 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getDisplayName(const Locale& locale, UnicodeString& result) const 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getDisplayName(FALSE, LONG, locale, result); 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getDisplayName(daylight,style, Locale::getDefault(), result); 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------- 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getDSTSavings()const { 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (useDaylightTime()) { 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 3600000; 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------- 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate date = Calendar::getNow(); 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTimeZoneFormatTimeType timeType; 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset; 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (style == GENERIC_LOCATION || style == LONG_GENERIC || style == SHORT_GENERIC) { 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<TimeZoneFormat> tzfmt(TimeZoneFormat::createInstance(locale, status)); 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.remove(); 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Generic format 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (style) { 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case GENERIC_LOCATION: 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->format(UTZFMT_STYLE_GENERIC_LOCATION, *this, date, result, &timeType); 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case LONG_GENERIC: 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->format(UTZFMT_STYLE_GENERIC_LONG, *this, date, result, &timeType); 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case SHORT_GENERIC: 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->format(UTZFMT_STYLE_GENERIC_SHORT, *this, date, result, &timeType); 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(FALSE); 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Generic format many use Localized GMT as the final fallback. 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // When Localized GMT format is used, the result might not be 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // appropriate for the requested daylight value. 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((daylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!daylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) { 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = daylight ? getRawOffset() + getDSTSavings() : getRawOffset(); 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (style == SHORT_GENERIC) { 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetShortLocalizedGMT(offset, result, status); 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetLocalizedGMT(offset, result, status); 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (style == LONG_GMT || style == SHORT_GMT) { 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<TimeZoneFormat> tzfmt(TimeZoneFormat::createInstance(locale, status)); 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.remove(); 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (style) { 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case LONG_GMT: 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetLocalizedGMT(offset, result, status); 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case SHORT_GMT: 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetISO8601Basic(offset, FALSE, FALSE, FALSE, result, status); 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(FALSE); 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(style == LONG || style == SHORT || style == SHORT_COMMONLY_USED); 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTimeZoneNameType nameType = UTZNM_UNKNOWN; 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (style) { 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case LONG: 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nameType = daylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD; 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case SHORT: 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case SHORT_COMMONLY_USED: 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nameType = daylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD; 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(FALSE); 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<TimeZoneNames> tznames(TimeZoneNames::createInstance(locale, status)); 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.remove(); 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString canonicalID(ZoneMeta::getCanonicalCLDRID(*this)); 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tznames->getDisplayName(canonicalID, nameType, date, result); 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result.isEmpty()) { 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Fallback to localized GMT 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<TimeZoneFormat> tzfmt(TimeZoneFormat::createInstance(locale, status)); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (style == LONG) { 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetLocalizedGMT(offset, result, status); 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzfmt->formatOffsetShortLocalizedGMT(offset, result, status); 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.remove(); 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parse a custom time zone identifier and return a corresponding zone. 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id a string of the form GMT[+-]hh:mm, GMT[+-]hhmm, or 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * GMT[+-]hh. 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a newly created SimpleTimeZone with the given offset and 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * no Daylight Savings Time, or null if the id cannot be parsed. 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone* 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::createCustomTimeZone(const UnicodeString& id) 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sign, hour, min, sec; 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (parseCustomID(id, sign, hour, min, sec)) { 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString customID; 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatCustomID(hour, min, sec, (sign < 0), customID); 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset = sign * ((hour * 60 + min) * 60 + sec) * 1000; 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new SimpleTimeZone(offset, customID); 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getCustomID(const UnicodeString& id, UnicodeString& normalized, UErrorCode& status) { 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org normalized.remove(); 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return normalized; 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sign, hour, min, sec; 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (parseCustomID(id, sign, hour, min, sec)) { 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatCustomID(hour, min, sec, (sign < 0), normalized); 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return normalized; 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::parseCustomID(const UnicodeString& id, int32_t& sign, 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t& hour, int32_t& min, int32_t& sec) { 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t kParseFailed = -99999; 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NumberFormat* numberFormat = 0; 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString idUppercase = id; 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idUppercase.toUpper(""); 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (id.length() > GMT_ID_LENGTH && 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idUppercase.startsWith(GMT_ID, GMT_ID_LENGTH)) 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ParsePosition pos(GMT_ID_LENGTH); 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sign = 1; 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hour = 0; 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min = 0; 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sec = 0; 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (id[pos.getIndex()] == MINUS /*'-'*/) { 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sign = -1; 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (id[pos.getIndex()] != PLUS /*'+'*/) { 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos.setIndex(pos.getIndex() + 1); 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode success = U_ZERO_ERROR; 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberFormat = NumberFormat::createInstance(success); 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(success)){ 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberFormat->setParseIntegerOnly(TRUE); 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //numberFormat->setLenient(TRUE); // TODO: May need to set this, depends on latest timezone parsing 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Look for either hh:mm, hhmm, or hh 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t start = pos.getIndex(); 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable n(kParseFailed); 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberFormat->parse(id, n, pos); 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pos.getIndex() == start) { 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hour = n.getLong(); 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pos.getIndex() < id.length()) { 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pos.getIndex() - start > 2 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || id[pos.getIndex()] != COLON) { 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // hh:mm 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos.setIndex(pos.getIndex() + 1); 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t oldPos = pos.getIndex(); 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org n.setLong(kParseFailed); 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberFormat->parse(id, n, pos); 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((pos.getIndex() - oldPos) != 2) { 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // must be 2 digits 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min = n.getLong(); 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pos.getIndex() < id.length()) { 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (id[pos.getIndex()] != COLON) { 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // [:ss] 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos.setIndex(pos.getIndex() + 1); 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldPos = pos.getIndex(); 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org n.setLong(kParseFailed); 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberFormat->parse(id, n, pos); 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pos.getIndex() != id.length() 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || (pos.getIndex() - oldPos) != 2) { 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sec = n.getLong(); 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Supported formats are below - 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // HHmmss 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Hmmss 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // HHmm 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Hmm 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // HH 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // H 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length = pos.getIndex() - start; 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (length <= 0 || 6 < length) { 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // invalid length 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (length) { 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // already set to hour 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 4: 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min = hour % 100; 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hour /= 100; 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 5: 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 6: 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sec = hour % 100; 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min = (hour/100) % 100; 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hour /= 10000; 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete numberFormat; 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hour > kMAX_CUSTOM_HOUR || min > kMAX_CUSTOM_MIN || sec > kMAX_CUSTOM_SEC) { 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::formatCustomID(int32_t hour, int32_t min, int32_t sec, 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool negative, UnicodeString& id) { 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Create time zone ID - GMT[+|-]hhmm[ss] 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.setTo(GMT_ID, GMT_ID_LENGTH); 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hour | min | sec) { 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (negative) { 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)MINUS; 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)PLUS; 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hour < 10) { 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)ZERO_DIGIT; 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + hour/10); 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + hour%10); 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)COLON; 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (min < 10) { 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)ZERO_DIGIT; 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + min/10); 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + min%10); 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sec) { 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)COLON; 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sec < 10) { 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)ZERO_DIGIT; 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + sec/10); 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id += (UChar)(ZERO_DIGIT + sec%10); 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::hasSameRules(const TimeZone& other) const 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (getRawOffset() == other.getRawOffset() && 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org useDaylightTime() == other.useDaylightTime()); 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initTZDataVersion(UErrorCode &status) { 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = 0; 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *bundle = ures_openDirect(NULL, kZONEINFO, &status); 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *tzver = ures_getStringByKey(bundle, kTZVERSION, &len, &status); 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (len >= (int32_t)sizeof(TZDATA_VERSION)) { 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Ensure that there is always space for a trailing nul in TZDATA_VERSION 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = sizeof(TZDATA_VERSION) - 1; 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(tzver, TZDATA_VERSION, len); 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(bundle); 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char* 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getTZDataVersion(UErrorCode& status) 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gTZDataVersionInitOnce, &initTZDataVersion, status); 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (const char*)TZDATA_VERSION; 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getCanonicalID(const UnicodeString& id, UnicodeString& canonicalID, UErrorCode& status) 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isSystemID = FALSE; 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getCanonicalID(id, canonicalID, isSystemID, status); 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getCanonicalID(const UnicodeString& id, UnicodeString& canonicalID, UBool& isSystemID, 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org canonicalID.remove(); 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isSystemID = FALSE; 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return canonicalID; 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (id.compare(UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH) == 0) { 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // special case - Etc/Unknown is a canonical ID, but not system ID 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org canonicalID.fastCopyFrom(id); 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isSystemID = FALSE; 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ZoneMeta::getCanonicalCLDRID(id, canonicalID, status); 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isSystemID = TRUE; 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Not a system ID 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getCustomID(id, canonicalID, status); 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return canonicalID; 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DRAFT_API 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getWindowsID(const UnicodeString& id, UnicodeString& winid, UErrorCode& status) { 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org winid.remove(); 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return winid; 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // canonicalize the input ID 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString canonicalID; 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isSystemID = FALSE; 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getCanonicalID(id, canonicalID, isSystemID, status); 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || !isSystemID) { 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // mapping data is only applicable to tz database IDs 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return winid; 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *mapTimezones = ures_openDirect(NULL, "windowsZones", &status); 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(mapTimezones, "mapTimezones", mapTimezones, &status); 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return winid; 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *winzone = NULL; 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool found = FALSE; 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ures_hasNext(mapTimezones) && !found) { 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org winzone = ures_getNextResource(mapTimezones, winzone, &status); 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ures_getType(winzone) != URES_TABLE) { 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *regionalData = NULL; 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ures_hasNext(winzone) && !found) { 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org regionalData = ures_getNextResource(winzone, regionalData, &status); 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ures_getType(regionalData) != URES_STRING) { 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len; 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *tzids = ures_getString(regionalData, &len, &status); 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *start = tzids; 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasNext = TRUE; 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (hasNext) { 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *end = u_strchr(start, (UChar)0x20); 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (end == NULL) { 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org end = tzids + len; 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hasNext = FALSE; 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (canonicalID.compare(start, end - start) == 0) { 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org winid = UnicodeString(ures_getKey(winzone), -1 , US_INV); 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org found = TRUE; 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start = end + 1; 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(regionalData); 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(winzone); 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(mapTimezones); 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return winid; 15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_WINDOWS_ID_SIZE 128 16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZone::getIDForWindowsID(const UnicodeString& winid, const char* region, UnicodeString& id, UErrorCode& status) { 16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.remove(); 16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *zones = ures_openDirect(NULL, "windowsZones", &status); 16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(zones, "mapTimezones", zones, &status); 16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(zones); 16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode tmperr = U_ZERO_ERROR; 16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char winidKey[MAX_WINDOWS_ID_SIZE]; 16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t winKeyLen = winid.extract(0, winid.length(), winidKey, sizeof(winidKey) - 1, US_INV); 16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (winKeyLen == 0 || winKeyLen >= (int32_t)sizeof(winidKey)) { 16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(zones); 16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org winidKey[winKeyLen] = 0; 16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(zones, winidKey, zones, &tmperr); // use tmperr, because windows mapping might not 16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // be avaiable by design 16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(tmperr)) { 16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(zones); 16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *tzid = NULL; 16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = 0; 16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool gotID = FALSE; 16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (region) { 16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *tzids = ures_getStringByKey(zones, region, &len, &tmperr); // use tmperr, because 16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // regional mapping is optional 16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(tmperr)) { 16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // first ID delimited by space is the defasult one 16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *end = u_strchr(tzids, (UChar)0x20); 16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (end == NULL) { 16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.setTo(tzids, -1); 16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.setTo(tzids, end - tzids); 16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotID = TRUE; 16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!gotID) { 16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzid = ures_getStringByKey(zones, "001", &len, &status); // using status, because "001" must be 16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // available at this point 16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org id.setTo(tzid, len); 16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(zones); 16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return id; 16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_HIDE_DRAFT_API */ 16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof 1670