summaryrefslogtreecommitdiffstats
path: root/luni/src/main/native/libcore_icu_TimeZoneNames.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'luni/src/main/native/libcore_icu_TimeZoneNames.cpp')
-rw-r--r--luni/src/main/native/libcore_icu_TimeZoneNames.cpp58
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));