static jobject createScanResult(JNIEnv *env, wifi_scan_result *result) { // ALOGD("creating scan result"); jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); if (scanResult == NULL) { ALOGE("Error in creating scan result"); return NULL; } // ALOGD("setting SSID to %s", result.ssid); setStringField(env, scanResult, "SSID", result->ssid); char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], result->bssid[2], result->bssid[3], result->bssid[4], result->bssid[5]); setStringField(env, scanResult, "BSSID", bssid); setIntField(env, scanResult, "level", result->rssi); setIntField(env, scanResult, "frequency", result->channel); setLongField(env, scanResult, "timestamp", result->ts); return scanResult; }
static bool getYesterdayTodayAndTomorrow(JNIEnv* env, jobject localeData, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle fields(ures_getByKey(root.get(), "fields", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle day(ures_getByKey(fields.get(), "day", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle relative(ures_getByKey(day.get(), "relative", NULL, &status)); if (U_FAILURE(status)) { return false; } // bn_BD only has a "-2" entry. if (relative.hasKey("-1") && relative.hasKey("0") && relative.hasKey("1")) { setStringField(env, localeData, "yesterday", relative.get(), "-1"); setStringField(env, localeData, "today", relative.get(), "0"); setStringField(env, localeData, "tomorrow", relative.get(), "1"); return true; } return false; }
static bool getYesterdayTodayAndTomorrow(JNIEnv* env, jobject localeData, const Locale& locale, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); ScopedResourceBundle fields(ures_getByKey(root.get(), "fields", NULL, &status)); ScopedResourceBundle day(ures_getByKey(fields.get(), "day", NULL, &status)); ScopedResourceBundle relative(ures_getByKey(day.get(), "relative", NULL, &status)); if (U_FAILURE(status)) { return false; } UnicodeString yesterday(ures_getUnicodeStringByKey(relative.get(), "-1", &status)); UnicodeString today(ures_getUnicodeStringByKey(relative.get(), "0", &status)); UnicodeString tomorrow(ures_getUnicodeStringByKey(relative.get(), "1", &status)); if (U_FAILURE(status)) { ALOGE("Error getting yesterday/today/tomorrow for %s: %s", locale_name, u_errorName(status)); return false; } // We title-case the strings so they have consistent capitalization (http://b/14493853). UniquePtr<BreakIterator> brk(BreakIterator::createSentenceInstance(locale, status)); if (U_FAILURE(status)) { ALOGE("Error getting yesterday/today/tomorrow break iterator for %s: %s", locale_name, u_errorName(status)); return false; } yesterday.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); today.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); tomorrow.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); setStringField(env, localeData, "yesterday", yesterday); setStringField(env, localeData, "today", today); setStringField(env, localeData, "tomorrow", tomorrow); return true; }
static jobject android_net_wifi_getScanResults( JNIEnv *env, jclass cls, jint iface, jboolean flush) { wifi_scan_result results[256]; int num_results = 256; wifi_interface_handle handle = getIfaceHandle(env, cls, iface); ALOGD("getting scan results on interface[%d] = %p", iface, handle); int result = wifi_get_cached_gscan_results(handle, 1, num_results, results, &num_results); if (result == WIFI_SUCCESS) { jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); if (clsScanResult == NULL) { ALOGE("Error in accessing class"); return NULL; } jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); if (scanResults == NULL) { ALOGE("Error in allocating array"); return NULL; } for (int i = 0; i < num_results; i++) { jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); if (scanResult == NULL) { ALOGE("Error in creating scan result"); return NULL; } setStringField(env, scanResult, "SSID", results[i].ssid); char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); setStringField(env, scanResult, "BSSID", bssid); setIntField(env, scanResult, "level", results[i].rssi); setIntField(env, scanResult, "frequency", results[i].channel); setLongField(env, scanResult, "timestamp", results[i].ts); env->SetObjectArrayElement(scanResults, i, scanResult); env->DeleteLocalRef(scanResult); } return scanResults; } else { return NULL; } }
static bool getDateTimePatterns(JNIEnv* env, jobject localeData, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle dateTimePatterns(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); if (U_FAILURE(status)) { return false; } setStringField(env, localeData, "fullTimeFormat", dateTimePatterns.get(), 0); setStringField(env, localeData, "longTimeFormat", dateTimePatterns.get(), 1); setStringField(env, localeData, "mediumTimeFormat", dateTimePatterns.get(), 2); setStringField(env, localeData, "shortTimeFormat", dateTimePatterns.get(), 3); setStringField(env, localeData, "fullDateFormat", dateTimePatterns.get(), 4); setStringField(env, localeData, "longDateFormat", dateTimePatterns.get(), 5); setStringField(env, localeData, "mediumDateFormat", dateTimePatterns.get(), 6); setStringField(env, localeData, "shortDateFormat", dateTimePatterns.get(), 7); return true; }
static void onHotlistApFound(wifi_request_id id, unsigned num_results, wifi_scan_result *results) { JNIEnv *env = NULL; mVM->AttachCurrentThread(&env, NULL); ALOGD("onHotlistApFound called, vm = %p, obj = %p, env = %p, num_results = %d", mVM, mCls, env, num_results); jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); if (clsScanResult == NULL) { ALOGE("Error in accessing class"); return; } jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); if (scanResults == NULL) { ALOGE("Error in allocating array"); return; } for (unsigned i = 0; i < num_results; i++) { jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); if (scanResult == NULL) { ALOGE("Error in creating scan result"); return; } setStringField(env, scanResult, "SSID", results[i].ssid); char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); setStringField(env, scanResult, "BSSID", bssid); setIntField(env, scanResult, "level", results[i].rssi); setIntField(env, scanResult, "frequency", results[i].channel); setLongField(env, scanResult, "timestamp", results[i].ts); env->SetObjectArrayElement(scanResults, i, scanResult); ALOGD("Found AP %32s %s", results[i].ssid, bssid); } reportEvent(env, mCls, "onHotlistApFound", "(I[Landroid/net/wifi/ScanResult;)V", id, scanResults); }
static void setNumberPatterns(JNIEnv* env, jobject obj, Locale& locale) { UErrorCode status = U_ZERO_ERROR; UnicodeString pattern; UniquePtr<DecimalFormat> fmt(static_cast<DecimalFormat*>(NumberFormat::createInstance(locale, UNUM_CURRENCY, status))); pattern = fmt->toPattern(pattern.remove()); setStringField(env, obj, "currencyPattern", pattern); fmt.reset(static_cast<DecimalFormat*>(NumberFormat::createInstance(locale, UNUM_DECIMAL, status))); pattern = fmt->toPattern(pattern.remove()); setStringField(env, obj, "numberPattern", pattern); fmt.reset(static_cast<DecimalFormat*>(NumberFormat::createInstance(locale, UNUM_PERCENT, status))); pattern = fmt->toPattern(pattern.remove()); setStringField(env, obj, "percentPattern", pattern); }
static void setDecimalFormatSymbolsData(JNIEnv* env, jobject obj, Locale& locale) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols dfs(locale, status); setCharField(env, obj, "decimalSeparator", dfs.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)); setCharField(env, obj, "groupingSeparator", dfs.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); setCharField(env, obj, "patternSeparator", dfs.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)); setStringField(env, obj, "percent", dfs.getSymbol(DecimalFormatSymbols::kPercentSymbol)); setCharField(env, obj, "perMill", dfs.getSymbol(DecimalFormatSymbols::kPerMillSymbol)); setCharField(env, obj, "monetarySeparator", dfs.getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol)); setStringField(env, obj, "minusSign", dfs.getSymbol(DecimalFormatSymbols:: kMinusSignSymbol)); setStringField(env, obj, "exponentSeparator", dfs.getSymbol(DecimalFormatSymbols::kExponentialSymbol)); setStringField(env, obj, "infinity", dfs.getSymbol(DecimalFormatSymbols::kInfinitySymbol)); setStringField(env, obj, "NaN", dfs.getSymbol(DecimalFormatSymbols::kNaNSymbol)); setCharField(env, obj, "zeroDigit", dfs.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol)); }
static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, UResourceBundle* bundle, int index) { UErrorCode status = U_ZERO_ERROR; int charCount; const UChar* chars = ures_getStringByIndex(bundle, index, &charCount, &status); if (U_SUCCESS(status)) { setStringField(env, obj, fieldName, env->NewString(chars, charCount)); } }
static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, UResourceBundle* bundle, int index) { UErrorCode status = U_ZERO_ERROR; int charCount; const UChar* chars = ures_getStringByIndex(bundle, index, &charCount, &status); if (U_SUCCESS(status)) { setStringField(env, obj, fieldName, env->NewString(chars, charCount)); } else { ALOGE("Error setting String field %s from ICU resource (index %d): %s", fieldName, index, u_errorName(status)); } }
static bool getTimeFormats12And24(JNIEnv* env, jobject localeData, Locale& locale) { UErrorCode status = U_ZERO_ERROR; DateTimePatternGenerator* generator = DateTimePatternGenerator::createInstance(locale, status); if (U_FAILURE(status)) { return false; } UnicodeString pattern_Hm(generator->getBestPattern(UnicodeString("Hm", 2, US_INV), status)); if (U_FAILURE(status)) { return false; } UnicodeString pattern_hm(generator->getBestPattern(UnicodeString("hm", 2, US_INV), status)); if (U_FAILURE(status)) { return false; } setStringField(env, localeData, "timeFormat12", pattern_hm); setStringField(env, localeData, "timeFormat24", pattern_Hm); return true; }
static void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result results[]) { JNIEnv *env = NULL; mVM->AttachCurrentThread(&env, NULL); ALOGD("onRttResults called, vm = %p, obj = %p, env = %p", mVM, mCls, env); jclass clsRttResult = (env)->FindClass("android/net/wifi/RttManager$RttResult"); if (clsRttResult == NULL) { ALOGE("Error in accessing class"); return; } jobjectArray rttResults = env->NewObjectArray(num_results, clsRttResult, NULL); if (rttResults == NULL) { ALOGE("Error in allocating array"); return; } for (unsigned i = 0; i < num_results; i++) { wifi_rtt_result& result = results[i]; jobject rttResult = createObject(env, "android/net/wifi/RttManager$RttResult"); if (rttResult == NULL) { ALOGE("Error in creating rtt result"); return; } char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.addr[0], result.addr[1], result.addr[2], result.addr[3], result.addr[4], result.addr[5]); setStringField(env, rttResult, "bssid", bssid); setIntField(env, rttResult, "status", result.status); setIntField(env, rttResult, "requestType", result.type); setLongField(env, rttResult, "ts", result.ts); setIntField(env, rttResult, "rssi", result.rssi); setIntField(env, rttResult, "rssi_spread", result.rssi_spread); setIntField(env, rttResult, "tx_rate", result.tx_rate.bitrate); setLongField(env, rttResult, "rtt_ns", result.rtt); setLongField(env, rttResult, "rtt_sd_ns", result.rtt_sd); setLongField(env, rttResult, "rtt_spread_ns", result.rtt_spread); setIntField(env, rttResult, "distance_cm", result.distance); setIntField(env, rttResult, "distance_sd_cm", result.distance_sd); setIntField(env, rttResult, "distance_spread_cm", result.distance_spread); env->SetObjectArrayElement(rttResults, i, rttResult); } reportEvent(env, mCls, "onRttResults", "(I[Landroid/net/wifi/RttManager$RttResult;)V", id, rttResults); }
static bool getAmPmMarkersNarrow(JNIEnv* env, jobject localeData, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { return false; } ScopedResourceBundle amPmMarkersNarrow(ures_getByKey(gregorian.get(), "AmPmMarkersNarrow", NULL, &status)); if (U_FAILURE(status)) { return false; } setStringField(env, localeData, "narrowAm", amPmMarkersNarrow.get(), 0); setStringField(env, localeData, "narrowPm", amPmMarkersNarrow.get(), 1); return true; }
static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLanguageTag, jobject localeData) { ScopedUtfChars languageTag(env, javaLanguageTag); if (languageTag.c_str() == NULL) { return JNI_FALSE; } if (languageTag.size() >= ULOC_FULLNAME_CAPACITY) { return JNI_FALSE; // ICU has a fixed-length limit. } ScopedIcuLocale icuLocale(env, javaLanguageTag); if (!icuLocale.valid()) { return JNI_FALSE; } // Get the DateTimePatterns. UErrorCode status = U_ZERO_ERROR; bool foundDateTimePatterns = false; for (LocaleNameIterator it(icuLocale.locale().getBaseName(), status); it.HasNext(); it.Up()) { if (getDateTimePatterns(env, localeData, it.Get())) { foundDateTimePatterns = true; break; } } if (!foundDateTimePatterns) { ALOGE("Couldn't find ICU DateTimePatterns for %s", languageTag.c_str()); return JNI_FALSE; } // Get the "Yesterday", "Today", and "Tomorrow" strings. bool foundYesterdayTodayAndTomorrow = false; for (LocaleNameIterator it(icuLocale.locale().getBaseName(), status); it.HasNext(); it.Up()) { if (getYesterdayTodayAndTomorrow(env, localeData, icuLocale.locale(), it.Get())) { foundYesterdayTodayAndTomorrow = true; break; } } if (!foundYesterdayTodayAndTomorrow) { ALOGE("Couldn't find ICU yesterday/today/tomorrow for %s", languageTag.c_str()); return JNI_FALSE; } // Get the narrow "AM" and "PM" strings. bool foundAmPmMarkersNarrow = false; for (LocaleNameIterator it(icuLocale.locale().getBaseName(), status); it.HasNext(); it.Up()) { if (getAmPmMarkersNarrow(env, localeData, it.Get())) { foundAmPmMarkersNarrow = true; break; } } if (!foundAmPmMarkersNarrow) { ALOGE("Couldn't find ICU AmPmMarkersNarrow for %s", languageTag.c_str()); return JNI_FALSE; } status = U_ZERO_ERROR; UniquePtr<Calendar> cal(Calendar::createInstance(icuLocale.locale(), status)); if (U_FAILURE(status)) { return JNI_FALSE; } setIntegerField(env, localeData, "firstDayOfWeek", cal->getFirstDayOfWeek()); setIntegerField(env, localeData, "minimalDaysInFirstWeek", cal->getMinimalDaysInFirstWeek()); // Get DateFormatSymbols. status = U_ZERO_ERROR; DateFormatSymbols dateFormatSym(icuLocale.locale(), status); if (U_FAILURE(status)) { return JNI_FALSE; } // Get AM/PM and BC/AD. int32_t count = 0; const UnicodeString* amPmStrs = dateFormatSym.getAmPmStrings(count); setStringArrayField(env, localeData, "amPm", amPmStrs, count); const UnicodeString* erasStrs = dateFormatSym.getEras(count); setStringArrayField(env, localeData, "eras", erasStrs, count); const UnicodeString* longMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longMonthNames", longMonthNames, count); const UnicodeString* shortMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortMonthNames", shortMonthNames, count); const UnicodeString* tinyMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW); setStringArrayField(env, localeData, "tinyMonthNames", tinyMonthNames, count); const UnicodeString* longWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longWeekdayNames", longWeekdayNames, count); const UnicodeString* shortWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortWeekdayNames", shortWeekdayNames, count); const UnicodeString* tinyWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW); setStringArrayField(env, localeData, "tinyWeekdayNames", tinyWeekdayNames, count); const UnicodeString* longStandAloneMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longStandAloneMonthNames", longStandAloneMonthNames, count); const UnicodeString* shortStandAloneMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortStandAloneMonthNames", shortStandAloneMonthNames, count); const UnicodeString* tinyStandAloneMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW); setStringArrayField(env, localeData, "tinyStandAloneMonthNames", tinyStandAloneMonthNames, count); const UnicodeString* longStandAloneWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longStandAloneWeekdayNames", longStandAloneWeekdayNames, count); const UnicodeString* shortStandAloneWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortStandAloneWeekdayNames", shortStandAloneWeekdayNames, count); const UnicodeString* tinyStandAloneWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW); setStringArrayField(env, localeData, "tinyStandAloneWeekdayNames", tinyStandAloneWeekdayNames, count); status = U_ZERO_ERROR; // For numberPatterns and symbols. setNumberPatterns(env, localeData, icuLocale.locale()); setDecimalFormatSymbolsData(env, localeData, icuLocale.locale()); jstring countryCode = env->NewStringUTF(icuLocale.locale().getCountry()); jstring internationalCurrencySymbol = ICU_getCurrencyCode(env, NULL, countryCode); env->DeleteLocalRef(countryCode); countryCode = NULL; jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = ICU_getCurrencySymbol(env, NULL, javaLanguageTag, internationalCurrencySymbol); } else { internationalCurrencySymbol = env->NewStringUTF("XXX"); } if (currencySymbol == NULL) { // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). currencySymbol = env->NewStringUTF("\xc2\xa4"); } setStringField(env, localeData, "currencySymbol", currencySymbol); setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); return JNI_TRUE; }
void Customer::setFirstName(const std::string& firstName) { setStringField(firstName, _firstName); }
void Customer::setAddress(const std::string& address) { setStringField(address, _address); }
static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, const UnicodeString& value) { const UChar* chars = value.getBuffer(); setStringField(env, obj, fieldName, env->NewString(chars, value.length())); }
void Customer::setLastName(const std::string& lastName) { setStringField(lastName, _lastName); }
void Customer::setPhone(const std::string& phone) { setStringField(phone, _phone); }
void MyFmsAuthorizeEvent::authorize() { bool bAuthorized = true; // default authorization state switch(m_pAev->getType()) { case IFmsAuthEvent::E_APPSTART: { // only E_APPSTART allows changes to the following fields: // F_APP_PRTMP // F_APP_PRTMP_COMMON_KEY_FILE // F_APP_PRTMP_VIDEO_ENC_LEVEL // F_APP_PRTMP_UPDATE_INTERVAL // F_APP_PRTMP_SWF_VERIFICATION // F_APP_PRTMP_SWF_WHITELIST_FOLDER bool bSet; I8 sValue; if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP, sValue)) { bSet = setI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP, sValue); } char* pCommonKeyPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_COMMON_KEY_FILE); if (pCommonKeyPath) { bSet = setStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_COMMON_KEY_FILE, pCommonKeyPath); } U32 uValue; if (getU32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_VIDEO_ENC_LEVEL, uValue)) { bSet = setU32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_VIDEO_ENC_LEVEL, uValue); } I32 iValue; if (getI32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_UPDATE_INTERVAL, iValue)) { bSet = setI32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_UPDATE_INTERVAL, iValue); } if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_VERIFICATION, sValue)) { bSet = setI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_VERIFICATION, sValue); } char* pWhiteListPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_WHITELIST_FOLDER); if (pWhiteListPath) { bSet = setStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_WHITELIST_FOLDER, pWhiteListPath); } bAuthorized = true; } break; case IFmsAuthEvent::E_CONNECT: { // only E_CONNECT allows changes to the following fields: // F_CLIENT_AUDIO_SAMPLE_ACCESS // F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK // F_CLIENT_READ_ACCESS // F_CLIENT_READ_ACCESS_LOCK // F_CLIENT_VIDEO_SAMPLE_ACCESS // F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK // F_CLIENT_WRITE_ACCESS_LOCK // F_CLIENT_WRITE_ACCESS I8 iValue; if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue)) { setI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue); } // redirect connection example char* pUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI); if (pUri && !strcmp(pUri, "rtmp://localhost/streamtest")) { setStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI, "rtmp://localhost:1935/streamtest"); bAuthorized = false; } // set DiffServ fields based on a client IP // char* pIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP); // if (pIp && !strcmp(pIp, "192.168.1.1")) { // set the DSCP bits and mask U8 m_diffServBits = 170; U8 m_diffServMask = 252; setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_BITS, m_diffServBits); setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_MASK, m_diffServMask); bAuthorized = true; } } break; case IFmsAuthEvent::E_PLAY: { char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); if (pStreamName) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName); } char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); if (pStreamType) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType); } char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY); if (pStreamQuery) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY, pStreamQuery); } m_pFmsAuthServerContext->log(pStreamName, IFmsServerContext::kInformation, false); m_pFmsAuthServerContext->log(pStreamType, IFmsServerContext::kInformation, false); m_pFmsAuthServerContext->log(pStreamQuery, IFmsServerContext::kInformation, false); I8 iValue; if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue)) { // If iValue is 1 (true) the playlist will be reset and the // stream will be the only stream in the playlist; otherwise // 0 (false) means the stream will be added to the existing // playlist. setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue); } if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue)) { // If iValue is 1 (true) the stream timestamps will be ignored; // otherwise 0 (false) means the timestamps will be handled. setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue); } char* pStreamTransition = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TRANSITION); if (pStreamTransition && strlen(pStreamTransition)) { // MBR transition example if (!strcmp(pStreamTransition, "switch") || !strcmp(pStreamTransition, "swap")) { // get the old stream's properties char* pOldStreamName = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_NAME); char* pOldStreamType = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_TYPE); char* pOldStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_QUERY); // if pOldStream is empty (optional for switch) current stream is in play // do we really want stream transition? { // no we do not allow transition // bAuthorized = false; // now transition will be turned off and old stream continue playing // break; } // doing nothing will execute transition mode as is // or you could modify transition by changing transition properties // set it to 1 to indicate they will be hooking up the stream, // but that it does not currently exist setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_LIVE_PUBLISH_PENDING, 1); } // get the offset value if transition is set to offset mode for reconnect if (!strcmp(pStreamTransition, "resume")) { float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_OFFSET, fValue)) { float offset = fValue; //offset value in seconds } } } else { // This is a regular play waiting for approval, which may be converted // into a play2 command by changing transition properties } } break; case IFmsAuthEvent::E_PUBLISH: { char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); if (pStreamName) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName); } char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); if (pStreamType) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType); } I32 iValue; if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue)) { // publish types: // 0 : record // 1 : append // 2 : appendWithGap // -1 : live setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue); } } break; case IFmsAuthEvent::E_FILENAME_TRANSFORM: { I64 iValue; if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue)) { // some fields are not eligible to be modified. The return // value will be false when trying to modify the F_CLIENT_ID. bool bSet = setI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue); } char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); if (pStreamName) { // some fields are not eligible to be modified. The return // value will be false when trying to modify the F_STREAM_NAME. bool bSet = setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName); } char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH); if (pStreamPath) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH, pStreamPath); } char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); if (pStreamType) { setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType); } } break; case IFmsAuthEvent::E_PAUSE: { bAuthorized = false; // block all E_PAUSE events. float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TIME, fValue)) { float fPauseTime = fValue; // in seconds } I8 iValue; if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE, iValue)) { // 1 (true) means PAUSE // 0 (false) means UNPAUSE bool boolPause = iValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TOGGLE, iValue)) { // 1 (true) means PAUSE_TOGGLE // 0 (false) means no PAUSE_TOGGLE was set bool boolPauseToggle = iValue != 0; } FmsVariant field; // Notify Action example: An IFmsNofifyAction is created to notify // server side action script (SSAS) of the E_PAUSE event by calling // the function name "method" in the script. In this example two // variables will be passed to "method" by calling addParam(field) // on the action. if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS) { I64 clientId = field.i64; IFmsNotifyAction* pAction = m_pAev->addNotifyAction("Notified by adaptor"); pAction->setClientId(field); const char mtd[] = "method"; field.setString(reinterpret_cast<I8*>(const_cast<char*>(mtd))); pAction->setMethodName(field); // create and insert a U16 "12345" as the first parameter field.setU16(12345); pAction->addParam(field); // create and insert clientId as a double as the second parameter field.setDouble((double)clientId); pAction->addParam(field); // Note: SSAS does not work with I64 or Buffer variants // field.setI64(clientId); // pAction->addParam(field); // incorrect } } break; case IFmsAuthEvent::E_SEEK: { bAuthorized = false; // block all E_SEEK events float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue)) { // Modification of the seek position example: // fValue + 3; will add 3 seconds to the initial seek posistion float fSeekTime = fValue; // value in seconds setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fSeekTime); } } break; case IFmsAuthEvent::E_LOADSEGMENT: { // bAuthorized = false; // block all E_LOADSEGMENT events // E_LOADSEGMENT is a read only event that substitutes E_PLAY on // FMS Origin servers for recorded streams. I64 iValue; if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_START, iValue)) { I64 iStart = iValue; // in bytes } if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_END, iValue)) { I64 iEnd = iValue; // in bytes } } break; case IFmsAuthEvent::E_RECORD: { // bAuthorized = false; // block all E_RECORD events float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue)) { float recMaxSize = fValue; // in kilobytes setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, recMaxSize); } if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue)) { float recMaxDuration = fValue; // in seconds setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, recMaxDuration); } } break; case IFmsAuthEvent::E_SWF_VERIFY: { // SWF Verification example: // kAuthorizeSwfVerification is assigned false by default. The // target SWF file must be updated for this to work. if(kAuthorizeSwfVerification) { I8 swfvVersion = 0; if(getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, swfvVersion)) { std::stringstream stream; stream << "Swf verification version is " << static_cast<int>(swfvVersion); m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false); } I64 swfvDepth; if(getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, swfvDepth)) { I32 swfvTTL; if(getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL)) { swfvTTL /= 2; setI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL); } U8 digest[kSHA256DigestLen]; // Target a real SWF file instead of sample.swf hashSwfFileAtDepth("C:\\sample.swf", swfvDepth, digest); FmsVariant field; field.setBuffer(digest, kSHA256DigestLen); m_pAev->setField(IFmsAuthEvent::F_CLIENT_SWFV_DIGEST, field); } } } break; case IFmsAuthEvent::E_APPSTOP: case IFmsAuthEvent::E_DISCONNECT: case IFmsAuthEvent::E_STOP: case IFmsAuthEvent::E_UNPUBLISH: case IFmsAuthEvent::E_ACTION: case IFmsAuthEvent::E_CODEC_CHANGE: case IFmsAuthEvent::E_RECORD_STOP: case IFmsAuthEvent::E_CLIENT_PAUSE: case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE: case IFmsAuthEvent::E_CLIENT_SEEK: case IFmsAuthEvent::E_START_TRANSMIT: case IFmsAuthEvent::E_STOP_TRANSMIT: case IFmsAuthEvent::E_MAXEVENT: break; } IFmsAuthServerContext2::AuthFailureDesc* desc = NULL; if(!bAuthorized) { desc = new IFmsAuthServerContext2::AuthFailureDesc("Blocked by auth adaptor", IFmsAuthServerContext2::kDefaultStatus, -1); } char buf[1024]; const char* const action = bAuthorized ? "approved" : "rejected"; sprintf(buf, "Received dddd authorization type=%d id=%p %s\n", m_pAev->getType(), m_pAev, action); char tlog[1024]; sprintf(tlog,"bb\n"); m_pFmsAuthServerContext->log(tlog, IFmsServerContext::kInformation, false) // log to the configured FMS log directory. If the third parameter is true, // also send the log to the system event log. m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false); m_pFmsAuthServerContext->onAuthorize(m_pAev, bAuthorized, desc); delete desc; }
static jboolean ICU_initLocaleDataImpl(JNIEnv* env, jclass, jstring locale, jobject localeData) { ScopedUtfChars localeName(env, locale); if (localeName.c_str() == NULL) { return JNI_FALSE; } // Get DateTimePatterns UErrorCode status; char currentLocale[ULOC_FULLNAME_CAPACITY]; int32_t localeNameLen = 0; if (localeName.size() >= ULOC_FULLNAME_CAPACITY) { return JNI_FALSE; // Exceed ICU defined limit of the whole locale ID. } strcpy(currentLocale, localeName.c_str()); do { status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, currentLocale, &status)); if (U_FAILURE(status)) { if (localeNameLen == 0) { break; // No parent locale, report this error outside the loop. } else { status = U_ZERO_ERROR; continue; // get parent locale. } } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { status = U_ZERO_ERROR; continue; // get parent locale. } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { status = U_ZERO_ERROR; continue; // get parent locale. } ScopedResourceBundle dateTimePatterns(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); if (U_SUCCESS(status)) { setStringField(env, localeData, "fullTimeFormat", dateTimePatterns.get(), 0); setStringField(env, localeData, "longTimeFormat", dateTimePatterns.get(), 1); setStringField(env, localeData, "mediumTimeFormat", dateTimePatterns.get(), 2); setStringField(env, localeData, "shortTimeFormat", dateTimePatterns.get(), 3); setStringField(env, localeData, "fullDateFormat", dateTimePatterns.get(), 4); setStringField(env, localeData, "longDateFormat", dateTimePatterns.get(), 5); setStringField(env, localeData, "mediumDateFormat", dateTimePatterns.get(), 6); setStringField(env, localeData, "shortDateFormat", dateTimePatterns.get(), 7); break; } else { status = U_ZERO_ERROR; // get parent locale. } } while((localeNameLen = uloc_getParent(currentLocale, currentLocale, sizeof(currentLocale), &status)) >= 0); if (U_FAILURE(status)) { ALOGE("Error getting ICU resource bundle: %s", u_errorName(status)); return JNI_FALSE; } status = U_ZERO_ERROR; Locale localeObj = getLocale(env, locale); UniquePtr<Calendar> cal(Calendar::createInstance(localeObj, status)); if (U_FAILURE(status)) { return JNI_FALSE; } setIntegerField(env, localeData, "firstDayOfWeek", cal->getFirstDayOfWeek()); setIntegerField(env, localeData, "minimalDaysInFirstWeek", cal->getMinimalDaysInFirstWeek()); // Get DateFormatSymbols status = U_ZERO_ERROR; DateFormatSymbols dateFormatSym(localeObj, status); if (U_FAILURE(status)) { return JNI_FALSE; } int32_t count = 0; // Get AM/PM marker const UnicodeString* amPmStrs = dateFormatSym.getAmPmStrings(count); setStringArrayField(env, localeData, "amPm", amPmStrs, count); const UnicodeString* erasStrs = dateFormatSym.getEras(count); setStringArrayField(env, localeData, "eras", erasStrs, count); const UnicodeString* longMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longMonthNames", longMonthNames, count); const UnicodeString* shortMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortMonthNames", shortMonthNames, count); const UnicodeString* longWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longWeekdayNames", longWeekdayNames, count); const UnicodeString* shortWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortWeekdayNames", shortWeekdayNames, count); const UnicodeString* longStandAloneMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longStandAloneMonthNames", longStandAloneMonthNames, count); const UnicodeString* shortStandAloneMonthNames = dateFormatSym.getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortStandAloneMonthNames", shortStandAloneMonthNames, count); const UnicodeString* longStandAloneWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE); setStringArrayField(env, localeData, "longStandAloneWeekdayNames", longStandAloneWeekdayNames, count); const UnicodeString* shortStandAloneWeekdayNames = dateFormatSym.getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED); setStringArrayField(env, localeData, "shortStandAloneWeekdayNames", shortStandAloneWeekdayNames, count); status = U_ZERO_ERROR; // For numberPatterns and symbols. setNumberPatterns(env, localeData, locale); setDecimalFormatSymbolsData(env, localeData, locale); jstring countryCode = env->NewStringUTF(Locale::createFromName(localeName.c_str()).getCountry()); jstring internationalCurrencySymbol = ICU_getCurrencyCode(env, NULL, countryCode); env->DeleteLocalRef(countryCode); countryCode = NULL; jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = ICU_getCurrencySymbol(env, NULL, locale, internationalCurrencySymbol); } else { internationalCurrencySymbol = env->NewStringUTF("XXX"); } if (currencySymbol == NULL) { // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). currencySymbol = env->NewStringUTF("\xc2\xa4"); } setStringField(env, localeData, "currencySymbol", currencySymbol); setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); return JNI_TRUE; }
static jboolean initLocaleDataImpl(JNIEnv* env, jclass clazz, jstring locale, jobject localeData) { const char* loc = env->GetStringUTFChars(locale, NULL); UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_openU(NULL, loc, &status)); env->ReleaseStringUTFChars(locale, loc); if (U_FAILURE(status)) { LOGE("Error getting ICU resource bundle: %s", u_errorName(status)); status = U_ZERO_ERROR; return JNI_FALSE; } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU calendar resource bundle: %s", u_errorName(status)); return JNI_FALSE; } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU gregorian resource bundle: %s", u_errorName(status)); return JNI_FALSE; } int firstDayVals[2]; if (getDayIntVector(env, gregorian.get(), firstDayVals)) { setIntegerField(env, localeData, "firstDayOfWeek", firstDayVals[0]); setIntegerField(env, localeData, "minimalDaysInFirstWeek", firstDayVals[1]); } setStringArrayField(env, localeData, "amPm", getAmPmMarkers(env, gregorian.get())); setStringArrayField(env, localeData, "eras", getEras(env, gregorian.get())); setStringArrayField(env, localeData, "longMonthNames", getLongMonthNames(env, gregorian.get())); setStringArrayField(env, localeData, "shortMonthNames", getShortMonthNames(env, gregorian.get())); setStringArrayField(env, localeData, "longWeekdayNames", getLongWeekdayNames(env, gregorian.get())); setStringArrayField(env, localeData, "shortWeekdayNames", getShortWeekdayNames(env, gregorian.get())); ScopedResourceBundle gregorianElems(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); if (U_SUCCESS(status)) { setStringField(env, localeData, "fullTimeFormat", gregorianElems.get(), 0); setStringField(env, localeData, "longTimeFormat", gregorianElems.get(), 1); setStringField(env, localeData, "mediumTimeFormat", gregorianElems.get(), 2); setStringField(env, localeData, "shortTimeFormat", gregorianElems.get(), 3); setStringField(env, localeData, "fullDateFormat", gregorianElems.get(), 4); setStringField(env, localeData, "longDateFormat", gregorianElems.get(), 5); setStringField(env, localeData, "mediumDateFormat", gregorianElems.get(), 6); setStringField(env, localeData, "shortDateFormat", gregorianElems.get(), 7); } status = U_ZERO_ERROR; ScopedResourceBundle numberElements(ures_getByKey(root.get(), "NumberElements", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberElements.get()) >= 11) { setStringField(env, localeData, "decimalPatternChars", getDecimalPatternChars(env, numberElements.get())); setStringField(env, localeData, "infinity", numberElements.get(), 9); setStringField(env, localeData, "NaN", numberElements.get(), 10); } status = U_ZERO_ERROR; jstring internationalCurrencySymbol = getIntCurrencyCode(env, locale); jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = getCurrencySymbolNative(env, clazz, locale, internationalCurrencySymbol); } else { internationalCurrencySymbol = env->NewStringUTF("XXX"); } if (currencySymbol == NULL) { // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). currencySymbol = env->NewStringUTF("\xc2\xa4"); } setStringField(env, localeData, "currencySymbol", currencySymbol); setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); ScopedResourceBundle numberPatterns(ures_getByKey(root.get(), "NumberPatterns", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberPatterns.get()) >= 3) { setStringField(env, localeData, "numberPattern", numberPatterns.get(), 0); setStringField(env, localeData, "currencyPattern", numberPatterns.get(), 1); setStringField(env, localeData, "percentPattern", numberPatterns.get(), 2); } return JNI_TRUE; }
static jboolean ICU_initLocaleDataImpl(JNIEnv* env, jclass, jstring locale, jobject localeData) { ScopedUtfChars localeName(env, locale); UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, localeName.c_str(), &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU resource bundle: %s", u_errorName(status)); status = U_ZERO_ERROR; return JNI_FALSE; } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU calendar resource bundle: %s", u_errorName(status)); return JNI_FALSE; } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU gregorian resource bundle: %s", u_errorName(status)); return JNI_FALSE; } int firstDayVals[] = { 0, 0 }; if (getDayIntVector(env, gregorian.get(), firstDayVals)) { setIntegerField(env, localeData, "firstDayOfWeek", firstDayVals[0]); setIntegerField(env, localeData, "minimalDaysInFirstWeek", firstDayVals[1]); } setStringArrayField(env, localeData, "amPm", getAmPmMarkers(env, gregorian.get())); setStringArrayField(env, localeData, "eras", getEras(env, gregorian.get())); ScopedResourceBundle dayNames(ures_getByKey(gregorian.get(), "dayNames", NULL, &status)); ScopedResourceBundle monthNames(ures_getByKey(gregorian.get(), "monthNames", NULL, &status)); // Get the regular month and weekday names. jobjectArray longMonthNames = getNames(env, monthNames.get(), true, REGULAR, LONG); jobjectArray shortMonthNames = getNames(env, monthNames.get(), true, REGULAR, SHORT); jobjectArray longWeekdayNames = getNames(env, dayNames.get(), false, REGULAR, LONG); jobjectArray shortWeekdayNames = getNames(env, dayNames.get(), false, REGULAR, SHORT); setStringArrayField(env, localeData, "longMonthNames", longMonthNames); setStringArrayField(env, localeData, "shortMonthNames", shortMonthNames); setStringArrayField(env, localeData, "longWeekdayNames", longWeekdayNames); setStringArrayField(env, localeData, "shortWeekdayNames", shortWeekdayNames); // Get the stand-alone month and weekday names. If they're not available (as they aren't for // English), we reuse the regular names. If we returned null to Java, the usual fallback // mechanisms would come into play and we'd end up with the bogus stand-alone names from the // root locale ("1" for January, and so on). jobjectArray longStandAloneMonthNames = getNames(env, monthNames.get(), true, STAND_ALONE, LONG); if (longStandAloneMonthNames == NULL) { longStandAloneMonthNames = longMonthNames; } jobjectArray shortStandAloneMonthNames = getNames(env, monthNames.get(), true, STAND_ALONE, SHORT); if (shortStandAloneMonthNames == NULL) { shortStandAloneMonthNames = shortMonthNames; } jobjectArray longStandAloneWeekdayNames = getNames(env, dayNames.get(), false, STAND_ALONE, LONG); if (longStandAloneWeekdayNames == NULL) { longStandAloneWeekdayNames = longWeekdayNames; } jobjectArray shortStandAloneWeekdayNames = getNames(env, dayNames.get(), false, STAND_ALONE, SHORT); if (shortStandAloneWeekdayNames == NULL) { shortStandAloneWeekdayNames = shortWeekdayNames; } setStringArrayField(env, localeData, "longStandAloneMonthNames", longStandAloneMonthNames); setStringArrayField(env, localeData, "shortStandAloneMonthNames", shortStandAloneMonthNames); setStringArrayField(env, localeData, "longStandAloneWeekdayNames", longStandAloneWeekdayNames); setStringArrayField(env, localeData, "shortStandAloneWeekdayNames", shortStandAloneWeekdayNames); ScopedResourceBundle dateTimePatterns(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); if (U_SUCCESS(status)) { setStringField(env, localeData, "fullTimeFormat", dateTimePatterns.get(), 0); setStringField(env, localeData, "longTimeFormat", dateTimePatterns.get(), 1); setStringField(env, localeData, "mediumTimeFormat", dateTimePatterns.get(), 2); setStringField(env, localeData, "shortTimeFormat", dateTimePatterns.get(), 3); setStringField(env, localeData, "fullDateFormat", dateTimePatterns.get(), 4); setStringField(env, localeData, "longDateFormat", dateTimePatterns.get(), 5); setStringField(env, localeData, "mediumDateFormat", dateTimePatterns.get(), 6); setStringField(env, localeData, "shortDateFormat", dateTimePatterns.get(), 7); } status = U_ZERO_ERROR; ScopedResourceBundle numberElements(ures_getByKey(root.get(), "NumberElements", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberElements.get()) >= 11) { setCharField(env, localeData, "zeroDigit", numberElements.get(), 4); setCharField(env, localeData, "digit", numberElements.get(), 5); setCharField(env, localeData, "decimalSeparator", numberElements.get(), 0); setCharField(env, localeData, "groupingSeparator", numberElements.get(), 1); setCharField(env, localeData, "patternSeparator", numberElements.get(), 2); setCharField(env, localeData, "percent", numberElements.get(), 3); setCharField(env, localeData, "perMill", numberElements.get(), 8); setCharField(env, localeData, "monetarySeparator", numberElements.get(), 0); setCharField(env, localeData, "minusSign", numberElements.get(), 6); setStringField(env, localeData, "exponentSeparator", numberElements.get(), 7); setStringField(env, localeData, "infinity", numberElements.get(), 9); setStringField(env, localeData, "NaN", numberElements.get(), 10); } status = U_ZERO_ERROR; jstring internationalCurrencySymbol = getIntCurrencyCode(env, locale); jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = ICU_getCurrencySymbolNative(env, NULL, locale, internationalCurrencySymbol); } else { internationalCurrencySymbol = env->NewStringUTF("XXX"); } if (currencySymbol == NULL) { // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). currencySymbol = env->NewStringUTF("\xc2\xa4"); } setStringField(env, localeData, "currencySymbol", currencySymbol); setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); ScopedResourceBundle numberPatterns(ures_getByKey(root.get(), "NumberPatterns", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberPatterns.get()) >= 3) { setStringField(env, localeData, "numberPattern", numberPatterns.get(), 0); setStringField(env, localeData, "currencyPattern", numberPatterns.get(), 1); setStringField(env, localeData, "percentPattern", numberPatterns.get(), 2); } return JNI_TRUE; }