static jstring getCurrencyCodeNative(JNIEnv* env, jclass clazz, jstring key) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle supplData(ures_openDirect(NULL, "supplementalData", &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle currencyMap(ures_getByKey(supplData.get(), "CurrencyMap", NULL, &status)); if (U_FAILURE(status)) { return NULL; } const char* keyChars = env->GetStringUTFChars(key, NULL); ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), keyChars, NULL, &status)); env->ReleaseStringUTFChars(key, keyChars); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle currencyElem(ures_getByIndex(currency.get(), 0, NULL, &status)); if (U_FAILURE(status)) { return env->NewStringUTF("None"); } // check if there is a 'to' date. If there is, the currency isn't used anymore. ScopedResourceBundle currencyTo(ures_getByKey(currencyElem.get(), "to", NULL, &status)); if (!U_FAILURE(status)) { // return and let the caller throw an exception return NULL; } // We need to reset 'status'. It works like errno in that ICU doesn't set it // to U_ZERO_ERROR on success: it only touches it on error, and the test // above means it now holds a failure code. status = U_ZERO_ERROR; ScopedResourceBundle currencyId(ures_getByKey(currencyElem.get(), "id", NULL, &status)); if (U_FAILURE(status)) { // No id defined for this country return env->NewStringUTF("None"); } int length; const jchar* id = ures_getString(currencyId.get(), &length, &status); if (U_FAILURE(status) || length == 0) { return env->NewStringUTF("None"); } return env->NewString(id, length); }
// TODO: rewrite this with int32_t ucurr_forLocale(const char* locale, UChar* buff, int32_t buffCapacity, UErrorCode* ec)... static jstring ICU_getCurrencyCode(JNIEnv* env, jclass, jstring javaCountryCode) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle supplData(ures_openDirect(U_ICUDATA_CURR, "supplementalData", &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle currencyMap(ures_getByKey(supplData.get(), "CurrencyMap", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedUtfChars countryCode(env, javaCountryCode); ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), countryCode.c_str(), NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle currencyElem(ures_getByIndex(currency.get(), 0, NULL, &status)); if (U_FAILURE(status)) { return env->NewStringUTF("XXX"); } // Check if there's a 'to' date. If there is, the currency isn't used anymore. ScopedResourceBundle currencyTo(ures_getByKey(currencyElem.get(), "to", NULL, &status)); if (!U_FAILURE(status)) { return NULL; } // Ignore the failure to find a 'to' date. status = U_ZERO_ERROR; ScopedResourceBundle currencyId(ures_getByKey(currencyElem.get(), "id", NULL, &status)); if (U_FAILURE(status)) { // No id defined for this country return env->NewStringUTF("XXX"); } int32_t charCount; const jchar* chars = ures_getString(currencyId.get(), &charCount, &status); return (charCount == 0) ? env->NewStringUTF("XXX") : env->NewString(chars, charCount); }