diff options
Diffstat (limited to 'luni/src/main/native/libcore_icu_TimeZoneNames.cpp')
-rw-r--r-- | luni/src/main/native/libcore_icu_TimeZoneNames.cpp | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/luni/src/main/native/libcore_icu_TimeZoneNames.cpp b/luni/src/main/native/libcore_icu_TimeZoneNames.cpp index 8c8682a..a7c9098 100644 --- a/luni/src/main/native/libcore_icu_TimeZoneNames.cpp +++ b/luni/src/main/native/libcore_icu_TimeZoneNames.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "JniConstants.h" #include "JniException.h" +#include "ScopedIcuLocale.h" #include "ScopedJavaUnicodeString.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" @@ -43,7 +44,7 @@ static bool isUtc(const UnicodeString& id) { id == kUct || id == kUtc || id == kUniversal || id == kZulu; } -static void setStringArrayElement(JNIEnv* env, jobjectArray array, int i, const UnicodeString& s) { +static bool setStringArrayElement(JNIEnv* env, jobjectArray array, int i, const UnicodeString& s) { // Fill in whatever we got. We don't use the display names if they're "GMT[+-]xx:xx" // because icu4c doesn't use the up-to-date time zone transition data, so it gets these // wrong. TimeZone.getDisplayName creates accurate names on demand. @@ -51,15 +52,22 @@ static void setStringArrayElement(JNIEnv* env, jobjectArray array, int i, const static const UnicodeString kGmt("GMT", 3, US_INV); if (!s.isBogus() && !s.startsWith(kGmt)) { ScopedLocalRef<jstring> javaString(env, env->NewString(s.getBuffer(), s.length())); + if (javaString.get() == NULL) { + return false; + } env->SetObjectArrayElement(array, i, javaString.get()); } + return true; } -static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring localeName, jobjectArray result) { - Locale locale = getLocale(env, localeName); +static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring javaLocaleName, jobjectArray result) { + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return; + } UErrorCode status = U_ZERO_ERROR; - UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(locale, status)); + UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(icuLocale.locale(), status)); if (maybeThrowIcuException(env, "TimeZoneNames::createInstance", status)) { return; } @@ -67,7 +75,6 @@ static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring localeNam const UDate now(Calendar::getNow()); static const UnicodeString kUtc("UTC", 3, US_INV); - static const UnicodeString pacific_apia("Pacific/Apia", 12, US_INV); size_t id_count = env->GetArrayLength(result); for (size_t i = 0; i < id_count; ++i) { @@ -96,22 +103,45 @@ static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring localeNam // every language). // TODO: check CLDR doesn't actually have this somewhere. long_std = short_std = long_dst = short_dst = kUtc; - } else if (zone_id.unicodeString() == pacific_apia) { - // icu4c 50 doesn't know Samoa has DST yet. http://b/7955614 - if (long_dst.isBogus()) { - long_dst = "Samoa Daylight Time"; - } } - setStringArrayElement(env, java_row.get(), 1, long_std); - setStringArrayElement(env, java_row.get(), 2, short_std); - setStringArrayElement(env, java_row.get(), 3, long_dst); - setStringArrayElement(env, java_row.get(), 4, short_dst); + bool okay = + setStringArrayElement(env, java_row.get(), 1, long_std) && + setStringArrayElement(env, java_row.get(), 2, short_std) && + setStringArrayElement(env, java_row.get(), 3, long_dst) && + setStringArrayElement(env, java_row.get(), 4, short_dst); + if (!okay) { + return; + } + } +} + +static jstring TimeZoneNames_getExemplarLocation(JNIEnv* env, jclass, jstring javaLocaleName, jstring javaTz) { + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return NULL; } + + UErrorCode status = U_ZERO_ERROR; + UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(icuLocale.locale(), status)); + if (maybeThrowIcuException(env, "TimeZoneNames::createInstance", status)) { + return NULL; + } + + ScopedJavaUnicodeString tz(env, javaTz); + if (!tz.valid()) { + return NULL; + } + + UnicodeString s; + const UDate now(Calendar::getNow()); + names->getDisplayName(tz.unicodeString(), UTZNM_EXEMPLAR_LOCATION, now, s); + return env->NewString(s.getBuffer(), s.length()); } static JNINativeMethod gMethods[] = { NATIVE_METHOD(TimeZoneNames, fillZoneStrings, "(Ljava/lang/String;[[Ljava/lang/String;)V"), + NATIVE_METHOD(TimeZoneNames, getExemplarLocation, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"), }; void register_libcore_icu_TimeZoneNames(JNIEnv* env) { jniRegisterNativeMethods(env, "libcore/icu/TimeZoneNames", gMethods, NELEM(gMethods)); |