ICU-5561 Added another version of getCanonicalID which tells you if the given ID is a system timezon in C++. Updated ucal_getCanonicalTimeZone to support the feature as well.
X-SVN-Rev: 23354
This commit is contained in:
parent
88193c9aaf
commit
ba7bd65b8f
@ -334,16 +334,16 @@ static UBool loadOlsonIDs() {
|
||||
ids = new UnicodeString[(count > 0) ? count : 1];
|
||||
// Null pointer check
|
||||
if (ids != NULL) {
|
||||
for (int32_t i=0; i<count; ++i) {
|
||||
int32_t idLen = 0;
|
||||
const UChar* id = ures_getStringByIndex(nres, i, &idLen, &ec);
|
||||
ids[i].fastCopyFrom(UnicodeString(TRUE, id, idLen));
|
||||
if (U_FAILURE(ec)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int32_t i=0; i<count; ++i) {
|
||||
int32_t idLen = 0;
|
||||
const UChar* id = ures_getStringByIndex(nres, i, &idLen, &ec);
|
||||
ids[i].fastCopyFrom(UnicodeString(TRUE, id, idLen));
|
||||
if (U_FAILURE(ec)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ec = U_MEMORY_ALLOCATION_ERROR;
|
||||
ec = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
}
|
||||
ures_close(nres);
|
||||
@ -465,9 +465,9 @@ TimeZone::createTimeZone(const UnicodeString& ID)
|
||||
U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to GMT"));
|
||||
const TimeZone* temptz = getGMT();
|
||||
if (temptz == NULL) {
|
||||
result = NULL;
|
||||
result = NULL;
|
||||
} else {
|
||||
result = temptz->clone();
|
||||
result = temptz->clone();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -624,11 +624,11 @@ TimeZone::initDefault()
|
||||
|
||||
// If we _still_ don't have a time zone, use GMT.
|
||||
if (default_zone == NULL) {
|
||||
const TimeZone* temptz = getGMT();
|
||||
// If we can't use GMT, get out.
|
||||
if (temptz == NULL) {
|
||||
return;
|
||||
}
|
||||
const TimeZone* temptz = getGMT();
|
||||
// If we can't use GMT, get out.
|
||||
if (temptz == NULL) {
|
||||
return;
|
||||
}
|
||||
default_zone = temptz->clone();
|
||||
}
|
||||
|
||||
@ -1443,13 +1443,24 @@ TimeZone::getTZDataVersion(UErrorCode& status)
|
||||
|
||||
UnicodeString&
|
||||
TimeZone::getCanonicalID(const UnicodeString& id, UnicodeString& canonicalID, UErrorCode& status)
|
||||
{
|
||||
UBool isSystemID = FALSE;
|
||||
return getCanonicalID(id, canonicalID, isSystemID, status);
|
||||
}
|
||||
|
||||
UnicodeString&
|
||||
TimeZone::getCanonicalID(const UnicodeString& id, UnicodeString& canonicalID, UBool& isSystemID,
|
||||
UErrorCode& status)
|
||||
{
|
||||
canonicalID.remove();
|
||||
isSystemID = FALSE;
|
||||
if (U_FAILURE(status)) {
|
||||
return canonicalID;
|
||||
}
|
||||
ZoneMeta::getCanonicalSystemID(id, canonicalID, status);
|
||||
if (U_FAILURE(status)) {
|
||||
if (U_SUCCESS(status)) {
|
||||
isSystemID = TRUE;
|
||||
} else {
|
||||
// Not a system ID
|
||||
status = U_ZERO_ERROR;
|
||||
getCustomID(id, canonicalID, status);
|
||||
|
@ -471,18 +471,25 @@ ucal_getTZDataVersion(UErrorCode* status)
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len,
|
||||
UChar* result, int32_t resultCapacity, UErrorCode* status) {
|
||||
UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status) {
|
||||
if(status == 0 || U_FAILURE(*status)) {
|
||||
return 0;
|
||||
}
|
||||
if (isSystemID) {
|
||||
*isSystemID = FALSE;
|
||||
}
|
||||
if (id == 0 || len == 0 || result == 0 || resultCapacity <= 0) {
|
||||
*status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
int32_t reslen = 0;
|
||||
UnicodeString canonical;
|
||||
TimeZone::getCanonicalID(UnicodeString(id, len), canonical, *status);
|
||||
UBool systemID = FALSE;
|
||||
TimeZone::getCanonicalID(UnicodeString(id, len), canonical, systemID, *status);
|
||||
if (U_SUCCESS(*status)) {
|
||||
if (isSystemID) {
|
||||
*isSystemID = systemID;
|
||||
}
|
||||
reslen = canonical.extract(result, resultCapacity, *status);
|
||||
}
|
||||
return reslen;
|
||||
|
@ -349,6 +349,24 @@ public:
|
||||
static UnicodeString& U_EXPORT2 getCanonicalID(const UnicodeString& id,
|
||||
UnicodeString& canonicalID, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Returns the canonical system timezone ID or the normalized
|
||||
* custom time zone ID for the given time zone ID.
|
||||
* @param id The input timezone ID to be canonicalized.
|
||||
* @param canonicalID Receives the canonical system timezone ID
|
||||
* or the custom timezone ID in normalized format.
|
||||
* @param isSystemID Receives if the given ID is a known system
|
||||
* timezone ID.
|
||||
* @param status Recevies the status. When the given timezone ID
|
||||
* is neither a known system time zone ID nor a
|
||||
* valid custom timezone ID, U_ILLEGAL_ARGUMENT_ERROR
|
||||
* is set.
|
||||
* @return A reference to the result.
|
||||
* @draft ICU 4.0
|
||||
*/
|
||||
static UnicodeString& U_EXPORT2 getCanonicalID(const UnicodeString& id,
|
||||
UnicodeString& canonicalID, UBool& isSystemID, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Returns true if the two TimeZones are equal. (The TimeZone version only compares
|
||||
* IDs, but subclasses are expected to also compare the fields they add.)
|
||||
|
@ -1098,6 +1098,8 @@ ucal_getTZDataVersion(UErrorCode* status);
|
||||
* @param result The buffer receives the canonical system timezone ID
|
||||
* or the custom timezone ID in normalized format.
|
||||
* @param resultCapacity The capacity of the result buffer.
|
||||
* @param isSystemID Receives if the given ID is a known system
|
||||
* timezone ID.
|
||||
* @param status Recevies the status. When the given timezone ID
|
||||
* is neither a known system time zone ID nor a
|
||||
* valid custom timezone ID, U_ILLEGAL_ARGUMENT_ERROR
|
||||
@ -1108,7 +1110,7 @@ ucal_getTZDataVersion(UErrorCode* status);
|
||||
*/
|
||||
U_DRAFT int32_t U_EXPORT2
|
||||
ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len,
|
||||
UChar* result, int32_t resultCapacity, UErrorCode* status);
|
||||
UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status);
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
||||
|
||||
#endif
|
||||
|
@ -72,6 +72,7 @@ static void TestCalendar()
|
||||
UChar zone1[32], zone2[32];
|
||||
const char *tzver = 0;
|
||||
UChar canonicalID[64];
|
||||
UBool isSystemID = FALSE;
|
||||
|
||||
#ifdef U_USE_UCAL_OBSOLETE_2_8
|
||||
/*Testing countAvailableTimeZones*/
|
||||
@ -197,12 +198,18 @@ static void TestCalendar()
|
||||
/*Testing ucal_getCanonicalTimeZoneID*/
|
||||
status = U_ZERO_ERROR;
|
||||
resultlength = ucal_getCanonicalTimeZoneID(PST, -1,
|
||||
canonicalID, sizeof(canonicalID)/sizeof(UChar), &status);
|
||||
canonicalID, sizeof(canonicalID)/sizeof(UChar), &isSystemID, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_err("FAIL: error in ucal_getCanonicalTimeZoneID : %s\n", u_errorName(status));
|
||||
} else if (u_strcmp(AMERICA_LOS_ANGELES, canonicalID) != 0) {
|
||||
log_err("FAIL: ucal_getCanonicalTimeZoneID(%s) returned %s : expected - %s\n",
|
||||
PST, canonicalID, AMERICA_LOS_ANGELES);
|
||||
} else {
|
||||
if (u_strcmp(AMERICA_LOS_ANGELES, canonicalID) != 0) {
|
||||
log_err("FAIL: ucal_getCanonicalTimeZoneID(%s) returned %s : expected - %s\n",
|
||||
PST, canonicalID, AMERICA_LOS_ANGELES);
|
||||
}
|
||||
if (!isSystemID) {
|
||||
log_err("FAIL: ucal_getCanonicalTimeZoneID(%s) set %d to isSystemID\n",
|
||||
PST, isSystemID);
|
||||
}
|
||||
}
|
||||
|
||||
/*Testing the ucal_open() function*/
|
||||
|
@ -1766,22 +1766,24 @@ void TimeZoneTest::TestCanonicalID() {
|
||||
struct {
|
||||
const char *id;
|
||||
const char *expected;
|
||||
const UBool isSystem;
|
||||
} data[] = {
|
||||
{"GMT-03", "GMT-0300"},
|
||||
{"GMT+4", "GMT+0400"},
|
||||
{"GMT-055", "GMT-0055"},
|
||||
{"GMT+430", "GMT+0430"},
|
||||
{"GMT-12:15", "GMT-1215"},
|
||||
{"GMT-091015", "GMT-091015"},
|
||||
{"GMT+1:90", 0},
|
||||
{"America/Argentina/Buenos_Aires", "America/Buenos_Aires"},
|
||||
{"bogus", 0},
|
||||
{"", 0},
|
||||
{0, 0}
|
||||
{"GMT-03", "GMT-0300", FALSE},
|
||||
{"GMT+4", "GMT+0400", FALSE},
|
||||
{"GMT-055", "GMT-0055", FALSE},
|
||||
{"GMT+430", "GMT+0430", FALSE},
|
||||
{"GMT-12:15", "GMT-1215", FALSE},
|
||||
{"GMT-091015", "GMT-091015", FALSE},
|
||||
{"GMT+1:90", 0, FALSE},
|
||||
{"America/Argentina/Buenos_Aires", "America/Buenos_Aires", TRUE},
|
||||
{"bogus", 0, FALSE},
|
||||
{"", 0, FALSE},
|
||||
{0, 0, FALSE}
|
||||
};
|
||||
|
||||
UBool isSystemID;
|
||||
for (i = 0; data[i].id != 0; i++) {
|
||||
TimeZone::getCanonicalID(UnicodeString(data[i].id), canonicalID, ec);
|
||||
TimeZone::getCanonicalID(UnicodeString(data[i].id), canonicalID, isSystemID, ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
if (ec != U_ILLEGAL_ARGUMENT_ERROR || data[i].expected != 0) {
|
||||
errln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
|
||||
@ -1794,6 +1796,10 @@ void TimeZoneTest::TestCanonicalID() {
|
||||
errln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
|
||||
+ "\") returned " + canonicalID + " - expected: " + data[i].expected);
|
||||
}
|
||||
if (isSystemID != data[i].isSystem) {
|
||||
errln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
|
||||
+ "\") set " + isSystemID + " to isSystemID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user