libcore_icu_ICU.cpp revision b7e820b92c7345cdc0cd4fea50954289ae66eb67
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes#define LOG_TAG "Resources" 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "JNIHelp.h" 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "AndroidSystemNatives.h" 209de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes#include "ScopedUtfChars.h" 21f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes#include "cutils/log.h" 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/numfmt.h" 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/locid.h" 24f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes#include "unicode/ubrk.h" 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/ucal.h" 26f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes#include "unicode/ucol.h" 27f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes#include "unicode/udat.h" 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/gregocal.h" 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/ucurr.h" 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/calendar.h" 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/datefmt.h" 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/dtfmtsym.h" 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/decimfmt.h" 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/dcfmtsym.h" 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/uclean.h" 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/smpdtfmt.h" 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/strenum.h" 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/ustring.h" 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "unicode/timezone.h" 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "ErrorCode.h" 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <stdlib.h> 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <string.h> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <time.h> 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <sys/time.h> 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4670fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jclass string_class; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4870fa193185427473999f1cda823c1ec408acd2baElliott Hughesclass ScopedResourceBundle { 4970fa193185427473999f1cda823c1ec408acd2baElliott Hughespublic: 5070fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle(UResourceBundle* bundle) : mBundle(bundle) { 5170fa193185427473999f1cda823c1ec408acd2baElliott Hughes } 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5370fa193185427473999f1cda823c1ec408acd2baElliott Hughes ~ScopedResourceBundle() { 5470fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (mBundle != NULL) { 5570fa193185427473999f1cda823c1ec408acd2baElliott Hughes ures_close(mBundle); 5670fa193185427473999f1cda823c1ec408acd2baElliott Hughes } 5770fa193185427473999f1cda823c1ec408acd2baElliott Hughes } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5970fa193185427473999f1cda823c1ec408acd2baElliott Hughes UResourceBundle* get() { 6070fa193185427473999f1cda823c1ec408acd2baElliott Hughes return mBundle; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6270fa193185427473999f1cda823c1ec408acd2baElliott Hughes 6370fa193185427473999f1cda823c1ec408acd2baElliott Hughesprivate: 6470fa193185427473999f1cda823c1ec408acd2baElliott Hughes UResourceBundle* mBundle; 657ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes 667ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes // Disallow copy and assignment. 677ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes ScopedResourceBundle(const ScopedResourceBundle&); 687ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes void operator=(const ScopedResourceBundle&); 6970fa193185427473999f1cda823c1ec408acd2baElliott Hughes}; 7070fa193185427473999f1cda823c1ec408acd2baElliott Hughes 719de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughesstatic Locale getLocale(JNIEnv* env, jstring localeName) { 729de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes return Locale::createFromName(ScopedUtfChars(env, localeName).data()); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 752e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughesstatic jint getCurrencyFractionDigitsNative(JNIEnv* env, jclass clazz, jstring currencyCode) { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 7870fa193185427473999f1cda823c1ec408acd2baElliott Hughes NumberFormat* fmt = NumberFormat::createCurrencyInstance(status); 7970fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 8370fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* cCode = env->GetStringChars(currencyCode, NULL); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fmt->setCurrency(cCode, status); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->ReleaseStringChars(currencyCode, cCode); 8670fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // for CurrencyFormats the minimum and maximum fraction digits are the same. 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result = fmt->getMinimumFractionDigits(); 9270fa193185427473999f1cda823c1ec408acd2baElliott Hughes delete fmt; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 9670fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jstring getCurrencyCodeNative(JNIEnv* env, jclass clazz, jstring key) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 9870fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle supplData(ures_openDirect(NULL, "supplementalData", &status)); 9970fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 10370fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle currencyMap(ures_getByKey(supplData.get(), "CurrencyMap", NULL, &status)); 10470fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 10870fa193185427473999f1cda823c1ec408acd2baElliott Hughes const char* keyChars = env->GetStringUTFChars(key, NULL); 10970fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), keyChars, NULL, &status)); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->ReleaseStringUTFChars(key, keyChars); 11170fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 11570fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle currencyElem(ures_getByIndex(currency.get(), 0, NULL, &status)); 11670fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return env->NewStringUTF("None"); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 12067081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // check if there is a 'to' date. If there is, the currency isn't used anymore. 12167081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes ScopedResourceBundle currencyTo(ures_getByKey(currencyElem.get(), "to", NULL, &status)); 12267081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes if (!U_FAILURE(status)) { 12367081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // return and let the caller throw an exception 12467081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes return NULL; 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 12667081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // We need to reset 'status'. It works like errno in that ICU doesn't set it 12767081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // to U_ZERO_ERROR on success: it only touches it on error, and the test 12867081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // above means it now holds a failure code. 12967081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes status = U_ZERO_ERROR; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13170fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle currencyId(ures_getByKey(currencyElem.get(), "id", NULL, &status)); 13270fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // No id defined for this country 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return env->NewStringUTF("None"); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length; 13870fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* id = ures_getString(currencyId.get(), &length, &status); 13970fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status) || length == 0) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return env->NewStringUTF("None"); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return env->NewString(id, length); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getCurrencySymbolNative(JNIEnv* env, jclass clazz, 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jstring locale, jstring currencyCode) { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // LOGI("ENTER getCurrencySymbolNative"); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 14970fa193185427473999f1cda823c1ec408acd2baElliott Hughes const char* locName = env->GetStringUTFChars(locale, NULL); 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 15170fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle root(ures_open(NULL, locName, &status)); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->ReleaseStringUTFChars(locale, locName); 15370fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle currencies(ures_getByKey(root.get(), "Currencies", NULL, &status)); 15870fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16270fa193185427473999f1cda823c1ec408acd2baElliott Hughes const char* currName = env->GetStringUTFChars(currencyCode, NULL); 16333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle currencyElems(ures_getByKey(currencies.get(), currName, NULL, &status)); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->ReleaseStringUTFChars(currencyCode, currName); 16570fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int currSymbL; 17070fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* currSymbU = ures_getStringByIndex(currencyElems.get(), 0, &currSymbL, &status); 17170fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17570fa193185427473999f1cda823c1ec408acd2baElliott Hughes return (currSymbL == 0) ? NULL : env->NewString(currSymbU, currSymbL); 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getDisplayCountryNative(JNIEnv* env, jclass clazz, 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jstring targetLocale, jstring locale) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale targetLoc = getLocale(env, targetLocale); 1832e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes 18470fa193185427473999f1cda823c1ec408acd2baElliott Hughes UnicodeString str; 18570fa193185427473999f1cda823c1ec408acd2baElliott Hughes targetLoc.getDisplayCountry(loc, str); 18670fa193185427473999f1cda823c1ec408acd2baElliott Hughes return env->NewString(str.getBuffer(), str.length()); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getDisplayLanguageNative(JNIEnv* env, jclass clazz, 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jstring targetLocale, jstring locale) { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale targetLoc = getLocale(env, targetLocale); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19570fa193185427473999f1cda823c1ec408acd2baElliott Hughes UnicodeString str; 19670fa193185427473999f1cda823c1ec408acd2baElliott Hughes targetLoc.getDisplayLanguage(loc, str); 19770fa193185427473999f1cda823c1ec408acd2baElliott Hughes return env->NewString(str.getBuffer(), str.length()); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getDisplayVariantNative(JNIEnv* env, jclass clazz, 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jstring targetLocale, jstring locale) { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale targetLoc = getLocale(env, targetLocale); 2052e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes 20670fa193185427473999f1cda823c1ec408acd2baElliott Hughes UnicodeString str; 20770fa193185427473999f1cda823c1ec408acd2baElliott Hughes targetLoc.getDisplayVariant(loc, str); 20870fa193185427473999f1cda823c1ec408acd2baElliott Hughes return env->NewString(str.getBuffer(), str.length()); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getISO3CountryNative(JNIEnv* env, jclass clazz, jstring locale) { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 2132e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes return env->NewStringUTF(loc.getISO3Country()); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getISO3LanguageNative(JNIEnv* env, jclass clazz, jstring locale) { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 2182e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes return env->NewStringUTF(loc.getISO3Language()); 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2212e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughesstatic jobjectArray toStringArray(JNIEnv* env, const char* const* strings) { 2222e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes size_t count = 0; 2232e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes while (strings[count] != NULL) { 2242e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes ++count; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jobjectArray result = env->NewObjectArray(count, string_class, NULL); 2272e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes for (size_t i = 0; i < count; ++i) { 2282e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes jstring s = env->NewStringUTF(strings[i]); 2292e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes env->SetObjectArrayElement(result, i, s); 2302e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes env->DeleteLocalRef(s); 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2352e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughesstatic jobjectArray getISOCountriesNative(JNIEnv* env, jclass clazz) { 2362e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes return toStringArray(env, Locale::getISOCountries()); 2372e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes} 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2392e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughesstatic jobjectArray getISOLanguagesNative(JNIEnv* env, jclass clazz) { 2402e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes return toStringArray(env, Locale::getISOLanguages()); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughestemplate <typename Counter, typename Getter> 244f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableLocales(JNIEnv* env, Counter* counter, Getter* getter) { 245f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes size_t count = (*counter)(); 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jobjectArray result = env->NewObjectArray(count, string_class, NULL); 2472e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes for (size_t i = 0; i < count; ++i) { 248f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes jstring s = env->NewStringUTF((*getter)(i)); 2492e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes env->SetObjectArrayElement(result, i, s); 2502e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes env->DeleteLocalRef(s); 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableLocalesNative(JNIEnv* env, jclass) { 256f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, uloc_countAvailable, uloc_getAvailable); 257f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 258f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 259f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableBreakIteratorLocalesNative(JNIEnv* env, jclass) { 260f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, ubrk_countAvailable, ubrk_getAvailable); 261f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 262f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 263f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableCalendarLocalesNative(JNIEnv* env, jclass) { 264f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, ucal_countAvailable, ucal_getAvailable); 265f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 266f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 267f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableCollatorLocalesNative(JNIEnv* env, jclass) { 268f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, ucol_countAvailable, ucol_getAvailable); 269f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 270f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 271f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableDateFormatLocalesNative(JNIEnv* env, jclass) { 272f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, udat_countAvailable, udat_getAvailable); 273f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 274f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 275f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughesstatic jobjectArray getAvailableNumberFormatLocalesNative(JNIEnv* env, jclass) { 276f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes return getAvailableLocales(env, unum_countAvailable, unum_getAvailable); 277f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes} 278f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes 27967081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughesstatic TimeZone* timeZoneFromId(JNIEnv* env, jstring id) { 28067081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes const jchar* chars = env->GetStringChars(id, NULL); 28167081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes const UnicodeString zoneID(reinterpret_cast<const UChar*>(chars), env->GetStringLength(id)); 28267081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes env->ReleaseStringChars(id, chars); 28367081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes return TimeZone::createTimeZone(zoneID); 28467081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes} 28567081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes 286e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughesstatic jstring formatDate(JNIEnv* env, const SimpleDateFormat& fmt, const UDate& when) { 287e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes UnicodeString str; 288e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes fmt.format(when, str); 289e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes return env->NewString(str.getBuffer(), str.length()); 290e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes} 291e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void getTimeZonesNative(JNIEnv* env, jclass clazz, 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jobjectArray outerArray, jstring locale) { 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29567081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes // get all timezone objects 29667081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jobjectArray zoneIdArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 0); 29767081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes int count = env->GetArrayLength(zoneIdArray); 29867081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes TimeZone* zones[count]; 29967081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes for(int i = 0; i < count; i++) { 30067081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jstring id = (jstring) env->GetObjectArrayElement(zoneIdArray, i); 30167081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes zones[i] = timeZoneFromId(env, id); 30267081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes env->DeleteLocalRef(id); 30367081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes } 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Locale loc = getLocale(env, locale); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30767081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes UErrorCode status = U_ZERO_ERROR; 30867081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes UnicodeString longPattern("zzzz",""); 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SimpleDateFormat longFormat(longPattern, loc, status); 31067081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes UnicodeString shortPattern("z",""); 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SimpleDateFormat shortFormat(shortPattern, loc, status); 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31367081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jobjectArray longStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 1); 31467081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jobjectArray shortStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 2); 31567081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jobjectArray longDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 3); 31667081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jobjectArray shortDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 4); 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 15th January 2008 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UDate date1 = 1203105600000.0; 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 15th July 2008 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UDate date2 = 1218826800000.0; 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32370fa193185427473999f1cda823c1ec408acd2baElliott Hughes for (int i = 0; i < count; ++i) { 32470fa193185427473999f1cda823c1ec408acd2baElliott Hughes TimeZone* tz = zones[i]; 32570fa193185427473999f1cda823c1ec408acd2baElliott Hughes longFormat.setTimeZone(*tz); 32670fa193185427473999f1cda823c1ec408acd2baElliott Hughes shortFormat.setTimeZone(*tz); 32770fa193185427473999f1cda823c1ec408acd2baElliott Hughes 32870fa193185427473999f1cda823c1ec408acd2baElliott Hughes int32_t daylightOffset; 32970fa193185427473999f1cda823c1ec408acd2baElliott Hughes int32_t rawOffset; 33070fa193185427473999f1cda823c1ec408acd2baElliott Hughes tz->getOffset(date1, false, rawOffset, daylightOffset, status); 33170fa193185427473999f1cda823c1ec408acd2baElliott Hughes UDate standardDate; 33270fa193185427473999f1cda823c1ec408acd2baElliott Hughes UDate daylightSavingDate; 33370fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (daylightOffset != 0) { 33470fa193185427473999f1cda823c1ec408acd2baElliott Hughes // The Timezone is reporting that we are in daylight time 33570fa193185427473999f1cda823c1ec408acd2baElliott Hughes // for the winter date. The dates are for the wrong hemisphere, 33670fa193185427473999f1cda823c1ec408acd2baElliott Hughes // swap them. 33770fa193185427473999f1cda823c1ec408acd2baElliott Hughes standardDate = date2; 33870fa193185427473999f1cda823c1ec408acd2baElliott Hughes daylightSavingDate = date1; 33970fa193185427473999f1cda823c1ec408acd2baElliott Hughes } else { 34070fa193185427473999f1cda823c1ec408acd2baElliott Hughes standardDate = date1; 34170fa193185427473999f1cda823c1ec408acd2baElliott Hughes daylightSavingDate = date2; 34270fa193185427473999f1cda823c1ec408acd2baElliott Hughes } 34370fa193185427473999f1cda823c1ec408acd2baElliott Hughes 344e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes jstring content = formatDate(env, shortFormat, daylightSavingDate); 34570fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->SetObjectArrayElement(shortDlTimeArray, i, content); 34670fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->DeleteLocalRef(content); 34770fa193185427473999f1cda823c1ec408acd2baElliott Hughes 348e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes content = formatDate(env, shortFormat, standardDate); 34970fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->SetObjectArrayElement(shortStdTimeArray, i, content); 35070fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->DeleteLocalRef(content); 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 352e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes content = formatDate(env, longFormat, daylightSavingDate); 35370fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->SetObjectArrayElement(longDlTimeArray, i, content); 35470fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->DeleteLocalRef(content); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 356e1e5e8e60af12f145c4dd0395e30069665f97529Elliott Hughes content = formatDate(env, longFormat, standardDate); 35770fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->SetObjectArrayElement(longStdTimeArray, i, content); 35870fa193185427473999f1cda823c1ec408acd2baElliott Hughes env->DeleteLocalRef(content); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36070fa193185427473999f1cda823c1ec408acd2baElliott Hughes delete tz; 36170fa193185427473999f1cda823c1ec408acd2baElliott Hughes } 36270fa193185427473999f1cda823c1ec408acd2baElliott Hughes} 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jstring getDisplayTimeZoneNative(JNIEnv* env, jclass clazz, 36567081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes jstring zoneId, jboolean isDST, jint style, jstring localeId) { 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36767081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes TimeZone* zone = timeZoneFromId(env, zoneId); 36867081ff5bcb8a2b3f7db2940f6e0cb3e459ab4b4Elliott Hughes Locale locale = getLocale(env, localeId); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Try to get the display name of the TimeZone according to the Locale 37170fa193185427473999f1cda823c1ec408acd2baElliott Hughes UnicodeString displayName; 37270fa193185427473999f1cda823c1ec408acd2baElliott Hughes zone->getDisplayName((UBool)isDST, (style == 0 ? TimeZone::SHORT : TimeZone::LONG), locale, displayName); 37370fa193185427473999f1cda823c1ec408acd2baElliott Hughes jstring result = env->NewString(displayName.getBuffer(), displayName.length()); 37470fa193185427473999f1cda823c1ec408acd2baElliott Hughes delete zone; 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic bool getDayIntVector(JNIEnv* env, UResourceBundle* gregorian, int* values) { 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // get the First day of week and the minimal days in first week numbers 3802e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes UErrorCode status = U_ZERO_ERROR; 38170fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "DateTimeElements", NULL, &status)); 3822e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes if (U_FAILURE(status)) { 38333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return false; 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int intVectSize; 38770fa193185427473999f1cda823c1ec408acd2baElliott Hughes const int* result = ures_getIntVector(gregorianElems.get(), &intVectSize, &status); 38870fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status) || intVectSize != 2) { 38933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return false; 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 39133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes 39270fa193185427473999f1cda823c1ec408acd2baElliott Hughes values[0] = result[0]; 39370fa193185427473999f1cda823c1ec408acd2baElliott Hughes values[1] = result[1]; 39433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return true; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39770fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getAmPmMarkers(JNIEnv* env, UResourceBundle* gregorian) { 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 39970fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "AmPmMarkers", NULL, &status)); 4002e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes if (U_FAILURE(status)) { 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40470fa193185427473999f1cda823c1ec408acd2baElliott Hughes ures_resetIterator(gregorianElems.get()); 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4062e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes int lengthAm, lengthPm; 40770fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* am = ures_getStringByIndex(gregorianElems.get(), 0, &lengthAm, &status); 40870fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* pm = ures_getStringByIndex(gregorianElems.get(), 1, &lengthPm, &status); 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4102e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes if (U_FAILURE(status)) { 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4142e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes jobjectArray amPmMarkers = env->NewObjectArray(2, string_class, NULL); 4152e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes jstring amU = env->NewString(am, lengthAm); 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(amPmMarkers, 0, amU); 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(amU); 4182e3a41defb42a97b463194d859d2d4088a600fd8Elliott Hughes jstring pmU = env->NewString(pm, lengthPm); 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(amPmMarkers, 1, pmU); 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(pmU); 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return amPmMarkers; 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42570fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getEras(JNIEnv* env, UResourceBundle* gregorian) { 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 42770fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "eras", NULL, &status)); 42870fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43270fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle eraElems(ures_getByKey(gregorianElems.get(), "abbreviated", NULL, &status)); 43370fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43770fa193185427473999f1cda823c1ec408acd2baElliott Hughes int eraCount = ures_getSize(eraElems.get()); 43870fa193185427473999f1cda823c1ec408acd2baElliott Hughes jobjectArray eras = env->NewObjectArray(eraCount, string_class, NULL); 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44070fa193185427473999f1cda823c1ec408acd2baElliott Hughes ures_resetIterator(eraElems.get()); 44170fa193185427473999f1cda823c1ec408acd2baElliott Hughes for (int i = 0; i < eraCount; ++i) { 44270fa193185427473999f1cda823c1ec408acd2baElliott Hughes int eraLength; 44370fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* era = ures_getStringByIndex(eraElems.get(), i, &eraLength, &status); 44470fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 44770fa193185427473999f1cda823c1ec408acd2baElliott Hughes jstring eraU = env->NewString(era, eraLength); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(eras, i, eraU); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(eraU); 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return eras; 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45470fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getMonthNames(JNIEnv* env, UResourceBundle* gregorian, bool longNames) { 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 45670fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "monthNames", NULL, &status)); 45770fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46070fa193185427473999f1cda823c1ec408acd2baElliott Hughes 46170fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle monthNameElems(ures_getByKey(gregorianElems.get(), "format", NULL, &status)); 46270fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46570fa193185427473999f1cda823c1ec408acd2baElliott Hughes 46670fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle monthNameElemsFormat(ures_getByKey(monthNameElems.get(), longNames ? "wide" : "abbreviated", NULL, &status)); 46770fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 47070fa193185427473999f1cda823c1ec408acd2baElliott Hughes 47170fa193185427473999f1cda823c1ec408acd2baElliott Hughes ures_resetIterator(monthNameElemsFormat.get()); 47270fa193185427473999f1cda823c1ec408acd2baElliott Hughes int monthCount = ures_getSize(monthNameElemsFormat.get()); 47370fa193185427473999f1cda823c1ec408acd2baElliott Hughes // the array length is +1 because the harmony locales had an empty string at the end of their month name array 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jobjectArray months = env->NewObjectArray(monthCount + 1, string_class, NULL); 47570fa193185427473999f1cda823c1ec408acd2baElliott Hughes for (int i = 0; i < monthCount; ++i) { 47670fa193185427473999f1cda823c1ec408acd2baElliott Hughes int monthNameLength; 47770fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* month = ures_getStringByIndex(monthNameElemsFormat.get(), i, &monthNameLength, &status); 47870fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48170fa193185427473999f1cda823c1ec408acd2baElliott Hughes jstring monthU = env->NewString(month, monthNameLength); 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(months, i, monthU); 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(monthU); 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48570fa193185427473999f1cda823c1ec408acd2baElliott Hughes 48670fa193185427473999f1cda823c1ec408acd2baElliott Hughes jstring monthU = env->NewStringUTF(""); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(months, monthCount, monthU); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(monthU); 48970fa193185427473999f1cda823c1ec408acd2baElliott Hughes 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return months; 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49370fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getLongMonthNames(JNIEnv* env, UResourceBundle* gregorian) { 49470fa193185427473999f1cda823c1ec408acd2baElliott Hughes return getMonthNames(env, gregorian, true); 49570fa193185427473999f1cda823c1ec408acd2baElliott Hughes} 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49770fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getShortMonthNames(JNIEnv* env, UResourceBundle* gregorian) { 49870fa193185427473999f1cda823c1ec408acd2baElliott Hughes return getMonthNames(env, gregorian, false); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50170fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getWeekdayNames(JNIEnv* env, UResourceBundle* gregorian, bool longNames) { 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UErrorCode status = U_ZERO_ERROR; 50370fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "dayNames", NULL, &status)); 50470fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50870fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle dayNameElems(ures_getByKey(gregorianElems.get(), "format", NULL, &status)); 50970fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51370fa193185427473999f1cda823c1ec408acd2baElliott Hughes ScopedResourceBundle dayNameElemsFormat(ures_getByKey(dayNameElems.get(), longNames ? "wide" : "abbreviated", NULL, &status)); 51470fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (U_FAILURE(status)) { 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51870fa193185427473999f1cda823c1ec408acd2baElliott Hughes ures_resetIterator(dayNameElemsFormat.get()); 51970fa193185427473999f1cda823c1ec408acd2baElliott Hughes int dayCount = ures_getSize(dayNameElemsFormat.get()); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jobjectArray weekdays = env->NewObjectArray(dayCount + 1, string_class, NULL); 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // first entry in the weekdays array is an empty string 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(weekdays, 0, env->NewStringUTF("")); 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for(int i = 0; i < dayCount; i++) { 52470fa193185427473999f1cda823c1ec408acd2baElliott Hughes int dayNameLength; 52570fa193185427473999f1cda823c1ec408acd2baElliott Hughes const jchar* day = ures_getStringByIndex(dayNameElemsFormat.get(), i, &dayNameLength, &status); 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(U_FAILURE(status)) { 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 52970fa193185427473999f1cda823c1ec408acd2baElliott Hughes jstring dayU = env->NewString(day, dayNameLength); 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->SetObjectArrayElement(weekdays, i + 1, dayU); 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project env->DeleteLocalRef(dayU); 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return weekdays; 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53670fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getLongWeekdayNames(JNIEnv* env, UResourceBundle* gregorian) { 53770fa193185427473999f1cda823c1ec408acd2baElliott Hughes return getWeekdayNames(env, gregorian, true); 53870fa193185427473999f1cda823c1ec408acd2baElliott Hughes} 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54070fa193185427473999f1cda823c1ec408acd2baElliott Hughesstatic jobjectArray getShortWeekdayNames(JNIEnv* env, UResourceBundle* gregorian) { 54170fa193185427473999f1cda823c1ec408acd2baElliott Hughes return getWeekdayNames(env, gregorian, false); 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic jstring getIntCurrencyCode(JNIEnv* env, jstring locale) { 545b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes ScopedUtfChars localeChars(env, locale); 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes // Extract the 2-character country name. 548b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes if (strlen(localeChars.data()) < 5) { 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 551b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes if (localeChars[3] < 'A' || localeChars[3] > 'Z' || localeChars[4] < 'A' || localeChars[4] > 'Z') { 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NULL; 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes 555b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes char country[3] = { localeChars[3], localeChars[4], 0 }; 55633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return getCurrencyCodeNative(env, NULL, env->NewStringUTF(country)); 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic void setIntegerField(JNIEnv* env, jobject obj, const char* fieldName, int value) { 56033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes // Convert our int to a java.lang.Integer. 56133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes // TODO: switch to Integer.valueOf, add error checking. 56233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jclass integerClass = env->FindClass("java/lang/Integer"); 56333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jmethodID constructor = env->GetMethodID(integerClass, "<init>", "(I)V"); 56433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jobject integerValue = env->NewObject(integerClass, constructor, value); 56533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes // Set the field. 56633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData"); 56733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "Ljava/lang/Integer;"); 56833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes env->SetObjectField(obj, fid, integerValue); 56933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes} 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic void setStringField(JNIEnv* env, jobject obj, const char* fieldName, jstring value) { 57233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData"); 57333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "Ljava/lang/String;"); 57433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes env->SetObjectField(obj, fid, value); 57533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes} 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic void setStringArrayField(JNIEnv* env, jobject obj, const char* fieldName, jobjectArray value) { 57833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData"); 57933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "[Ljava/lang/String;"); 58033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes env->SetObjectField(obj, fid, value); 58133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes} 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic void setStringField(JNIEnv* env, jobject obj, const char* fieldName, UResourceBundle* bundle, int index) { 58433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes UErrorCode status = U_ZERO_ERROR; 58533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes int charCount; 58633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes const UChar* chars = ures_getStringByIndex(bundle, index, &charCount, &status); 58733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_SUCCESS(status)) { 58833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, obj, fieldName, env->NewString(chars, charCount)); 58990aa512eb7b126deb8d752b7474c30d3f73507b2Elliott Hughes } else { 590b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes LOGE("Error setting String field %s from ICU resource: %s", fieldName, u_errorName(status)); 591b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes } 592b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes} 593b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes 594b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughesstatic void setCharField(JNIEnv* env, jobject obj, const char* fieldName, UResourceBundle* bundle, int index) { 595b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes UErrorCode status = U_ZERO_ERROR; 596b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes int charCount; 597b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes const UChar* chars = ures_getStringByIndex(bundle, index, &charCount, &status); 598b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes if (U_SUCCESS(status)) { 599b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData"); 600b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "C"); 601b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes env->SetCharField(obj, fid, chars[0]); 602b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes } else { 603b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes LOGE("Error setting char field %s from ICU resource: %s", fieldName, u_errorName(status)); 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes} 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesstatic jboolean initLocaleDataImpl(JNIEnv* env, jclass clazz, jstring locale, jobject localeData) { 60833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes const char* loc = env->GetStringUTFChars(locale, NULL); 60933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes UErrorCode status = U_ZERO_ERROR; 61033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle root(ures_openU(NULL, loc, &status)); 61133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes env->ReleaseStringUTFChars(locale, loc); 61233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_FAILURE(status)) { 61333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes LOGE("Error getting ICU resource bundle: %s", u_errorName(status)); 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project status = U_ZERO_ERROR; 61533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return JNI_FALSE; 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); 61933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_FAILURE(status)) { 6204722f161d49b5c483aa7aec0daad7bfee18578bbElliott Hughes LOGE("Error getting ICU calendar resource bundle: %s", u_errorName(status)); 62133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return JNI_FALSE; 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); 62533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_FAILURE(status)) { 6264722f161d49b5c483aa7aec0daad7bfee18578bbElliott Hughes LOGE("Error getting ICU gregorian resource bundle: %s", u_errorName(status)); 62733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return JNI_FALSE; 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes int firstDayVals[2]; 63133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (getDayIntVector(env, gregorian.get(), firstDayVals)) { 63233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setIntegerField(env, localeData, "firstDayOfWeek", firstDayVals[0]); 63333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setIntegerField(env, localeData, "minimalDaysInFirstWeek", firstDayVals[1]); 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "amPm", getAmPmMarkers(env, gregorian.get())); 63733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "eras", getEras(env, gregorian.get())); 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "longMonthNames", getLongMonthNames(env, gregorian.get())); 64033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "shortMonthNames", getShortMonthNames(env, gregorian.get())); 64133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "longWeekdayNames", getLongWeekdayNames(env, gregorian.get())); 64233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringArrayField(env, localeData, "shortWeekdayNames", getShortWeekdayNames(env, gregorian.get())); 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle gregorianElems(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); 64533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_SUCCESS(status)) { 64633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "fullTimeFormat", gregorianElems.get(), 0); 64733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "longTimeFormat", gregorianElems.get(), 1); 64833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "mediumTimeFormat", gregorianElems.get(), 2); 64933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "shortTimeFormat", gregorianElems.get(), 3); 65033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "fullDateFormat", gregorianElems.get(), 4); 65133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "longDateFormat", gregorianElems.get(), 5); 65233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "mediumDateFormat", gregorianElems.get(), 6); 65333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "shortDateFormat", gregorianElems.get(), 7); 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes status = U_ZERO_ERROR; 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle numberElements(ures_getByKey(root.get(), "NumberElements", NULL, &status)); 65833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_SUCCESS(status) && ures_getSize(numberElements.get()) >= 11) { 659b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "zeroDigit", numberElements.get(), 4); 660b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "digit", numberElements.get(), 5); 661b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "decimalSeparator", numberElements.get(), 0); 662b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "groupingSeparator", numberElements.get(), 1); 663b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "patternSeparator", numberElements.get(), 2); 664b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "percent", numberElements.get(), 3); 665b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "perMill", numberElements.get(), 8); 666b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "monetarySeparator", numberElements.get(), 0); 667b7e820b92c7345cdc0cd4fea50954289ae66eb67Elliott Hughes setCharField(env, localeData, "minusSign", numberElements.get(), 6); 66890aa512eb7b126deb8d752b7474c30d3f73507b2Elliott Hughes setStringField(env, localeData, "exponentSeparator", numberElements.get(), 7); 66933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "infinity", numberElements.get(), 9); 67033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "NaN", numberElements.get(), 10); 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes status = U_ZERO_ERROR; 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67433aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jstring internationalCurrencySymbol = getIntCurrencyCode(env, locale); 67533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes jstring currencySymbol = NULL; 67633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (internationalCurrencySymbol != NULL) { 67733aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes currencySymbol = getCurrencySymbolNative(env, clazz, locale, internationalCurrencySymbol); 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 67933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes internationalCurrencySymbol = env->NewStringUTF("XXX"); 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (currencySymbol == NULL) { 68233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). 683ad884a7b8cae7a1c3d973c8032d4f78ef7c96b80Hao Feng currencySymbol = env->NewStringUTF("\xc2\xa4"); 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "currencySymbol", currencySymbol); 68633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes ScopedResourceBundle numberPatterns(ures_getByKey(root.get(), "NumberPatterns", NULL, &status)); 68933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes if (U_SUCCESS(status) && ures_getSize(numberPatterns.get()) >= 3) { 69033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "numberPattern", numberPatterns.get(), 0); 69133aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "currencyPattern", numberPatterns.get(), 1); 69233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes setStringField(env, localeData, "percentPattern", numberPatterns.get(), 2); 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes return JNI_TRUE; 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic JNINativeMethod gMethods[] = { 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* name, signature, funcPtr */ 700f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableBreakIteratorLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableBreakIteratorLocalesNative}, 701f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableCalendarLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableCalendarLocalesNative}, 702f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableCollatorLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableCollatorLocalesNative}, 703f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableDateFormatLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableDateFormatLocalesNative}, 704f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableLocalesNative}, 705f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getAvailableNumberFormatLocalesNative", "()[Ljava/lang/String;", (void*) getAvailableNumberFormatLocalesNative}, 706f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getCurrencyCodeNative", "(Ljava/lang/String;)Ljava/lang/String;", (void*) getCurrencyCodeNative}, 707f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getCurrencyFractionDigitsNative", "(Ljava/lang/String;)I", (void*) getCurrencyFractionDigitsNative}, 708f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getCurrencySymbolNative", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) getCurrencySymbolNative}, 709f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getDisplayCountryNative", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) getDisplayCountryNative}, 710f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getDisplayLanguageNative", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) getDisplayLanguageNative}, 711f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getDisplayTimeZoneNative", "(Ljava/lang/String;ZILjava/lang/String;)Ljava/lang/String;", (void*) getDisplayTimeZoneNative}, 712f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getDisplayVariantNative", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) getDisplayVariantNative}, 713f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getISO3CountryNative", "(Ljava/lang/String;)Ljava/lang/String;", (void*) getISO3CountryNative}, 714f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getISO3LanguageNative", "(Ljava/lang/String;)Ljava/lang/String;", (void*) getISO3LanguageNative}, 715f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getISOCountriesNative", "()[Ljava/lang/String;", (void*) getISOCountriesNative}, 716f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getISOLanguagesNative", "()[Ljava/lang/String;", (void*) getISOLanguagesNative}, 717f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"getTimeZonesNative", "([[Ljava/lang/String;Ljava/lang/String;)V", (void*) getTimeZonesNative}, 718f9157eaea53923d3dbe6a521b29427819052f176Elliott Hughes {"initLocaleDataImpl", "(Ljava/lang/String;Lcom/ibm/icu4jni/util/LocaleData;)Z", (void*) initLocaleDataImpl}, 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}; 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectint register_com_ibm_icu4jni_util_Resources(JNIEnv* env) { 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jclass stringclass = env->FindClass("java/lang/String"); 72370fa193185427473999f1cda823c1ec408acd2baElliott Hughes if (stringclass == NULL) { 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project string_class = (jclass) env->NewGlobalRef(stringclass); 72770fa193185427473999f1cda823c1ec408acd2baElliott Hughes 72870fa193185427473999f1cda823c1ec408acd2baElliott Hughes return jniRegisterNativeMethods(env, "com/ibm/icu4jni/util/Resources", 72970fa193185427473999f1cda823c1ec408acd2baElliott Hughes gMethods, NELEM(gMethods)); 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 731