1 /* 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include "sun_util_locale_provider_HostLocaleProviderAdapterImpl.h" 27 #include <CoreFoundation/CoreFoundation.h> 28 #include <stdio.h> 29 30 #define BUFLEN 256 31 32 static CFDateFormatterStyle convertDateFormatterStyle(jint javaStyle); 33 static CFNumberFormatterStyle convertNumberFormatterStyle(jint javaStyle); 34 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count); 35 static jstring getNumberSymbolString(JNIEnv *env, jstring jdefault, CFStringRef type); 36 static jchar getNumberSymbolChar(jchar jdefault, CFStringRef type); 37 38 // from java_props_macosx.c 39 extern char * getMacOSXLocale(int cat); 40 extern char * getPosixLocale(int cat); 41 42 /* 43 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 44 * Method: getDefaultLocale 45 * Signature: (I)Ljava/lang/String; 46 */ 47 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDefaultLocale 48 (JNIEnv *env, jclass cls, jint cat) { 49 char * localeString = NULL; 50 int posixCat; 51 jstring ret = NULL; 52 53 switch (cat) { 54 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CAT_DISPLAY: 55 posixCat = LC_MESSAGES; 56 break; 57 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CAT_FORMAT: 58 default: 59 posixCat = LC_CTYPE; 60 break; 61 } 62 63 localeString = getMacOSXLocale(posixCat); 64 if (localeString == NULL) { 65 localeString = getPosixLocale(posixCat); 66 } 67 ret = (*env)->NewStringUTF(env, localeString); 68 free(localeString); 69 70 return ret; 71 } 72 73 /* 74 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 75 * Method: getDateTimePatternNative 76 * Signature: (IILjava/lang/String;)Ljava/lang/String; 77 */ 78 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDateTimePatternNative 79 (JNIEnv *env, jclass cls, jint dateStyle, jint timeStyle, jstring jlangtag) { 80 jstring ret = NULL; 81 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 82 83 if (cflocale != NULL) { 84 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 85 cflocale, 86 convertDateFormatterStyle(dateStyle), 87 convertDateFormatterStyle(timeStyle)); 88 if (df != NULL) { 89 char buf[BUFLEN]; 90 CFStringRef formatStr = CFDateFormatterGetFormat(df); 91 CFStringGetCString(formatStr, buf, BUFLEN, kCFStringEncodingUTF8); 92 ret = (*env)->NewStringUTF(env, buf); 93 CFRelease(df); 94 } 95 CFRelease(cflocale); 96 } 97 98 return ret; 99 } 100 101 /* 102 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 103 * Method: getCalendarID 104 * Signature: (Ljava/lang/String;)Ljava/lang/String; 105 */ 106 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCalendarID 107 (JNIEnv *env, jclass cls, jstring jlangtag) { 108 jstring ret = NULL; 109 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 110 111 if (cflocale != NULL) { 112 char buf[BUFLEN]; 113 CFTypeRef calid = CFLocaleGetValue(cflocale, kCFLocaleCalendarIdentifier); 114 CFStringGetCString((CFStringRef)calid, buf, BUFLEN, kCFStringEncodingUTF8); 115 ret = (*env)->NewStringUTF(env, buf); 116 CFRelease(cflocale); 117 } 118 119 return ret; 120 } 121 122 /* 123 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 124 * Method: getAmPmStrings 125 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 126 */ 127 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getAmPmStrings 128 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray ampms) { 129 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 130 if (cflocale != NULL) { 131 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 132 cflocale, 133 kCFDateFormatterFullStyle, 134 kCFDateFormatterFullStyle); 135 if (df != NULL) { 136 char buf[BUFLEN]; 137 CFStringRef amStr = CFDateFormatterCopyProperty(df, kCFDateFormatterAMSymbol); 138 if (amStr != NULL) { 139 CFStringGetCString(amStr, buf, BUFLEN, kCFStringEncodingUTF8); 140 CFRelease(amStr); 141 (*env)->SetObjectArrayElement(env, ampms, 0, (*env)->NewStringUTF(env, buf)); 142 } 143 CFStringRef pmStr = CFDateFormatterCopyProperty(df, kCFDateFormatterPMSymbol); 144 if (pmStr != NULL) { 145 CFStringGetCString(pmStr, buf, BUFLEN, kCFStringEncodingUTF8); 146 CFRelease(pmStr); 147 (*env)->SetObjectArrayElement(env, ampms, 1, (*env)->NewStringUTF(env, buf)); 148 } 149 CFRelease(df); 150 } 151 CFRelease(cflocale); 152 } 153 154 return ampms; 155 } 156 157 /* 158 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 159 * Method: getEras 160 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 161 */ 162 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getEras 163 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray eras) { 164 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 165 if (cflocale != NULL) { 166 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 167 cflocale, 168 kCFDateFormatterFullStyle, 169 kCFDateFormatterFullStyle); 170 if (df != NULL) { 171 CFArrayRef cferas = CFDateFormatterCopyProperty(df, kCFDateFormatterEraSymbols); 172 if (cferas != NULL) { 173 copyArrayElements(env, cferas, eras, 0, 0, CFArrayGetCount(cferas)); 174 CFRelease(cferas); 175 } 176 CFRelease(df); 177 } 178 CFRelease(cflocale); 179 } 180 181 return eras; 182 } 183 184 /* 185 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 186 * Method: getMonths 187 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 188 */ 189 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMonths 190 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray months) { 191 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 192 if (cflocale != NULL) { 193 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 194 cflocale, 195 kCFDateFormatterFullStyle, 196 kCFDateFormatterFullStyle); 197 if (df != NULL) { 198 CFArrayRef cfmonths = CFDateFormatterCopyProperty(df, kCFDateFormatterMonthSymbols); 199 if (cfmonths != NULL) { 200 copyArrayElements(env, cfmonths, months, 0, 0, CFArrayGetCount(cfmonths)); 201 CFRelease(cfmonths); 202 } 203 CFRelease(df); 204 } 205 CFRelease(cflocale); 206 } 207 208 return months; 209 } 210 211 /* 212 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 213 * Method: getShortMonths 214 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 215 */ 216 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getShortMonths 217 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray smonths) { 218 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 219 if (cflocale != NULL) { 220 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 221 cflocale, 222 kCFDateFormatterFullStyle, 223 kCFDateFormatterFullStyle); 224 if (df != NULL) { 225 CFArrayRef cfsmonths = CFDateFormatterCopyProperty(df, kCFDateFormatterShortMonthSymbols); 226 if (cfsmonths != NULL) { 227 copyArrayElements(env, cfsmonths, smonths, 0, 0, CFArrayGetCount(cfsmonths)); 228 CFRelease(cfsmonths); 229 } 230 CFRelease(df); 231 } 232 CFRelease(cflocale); 233 } 234 235 return smonths; 236 } 237 238 /* 239 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 240 * Method: getWeekdays 241 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 242 */ 243 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getWeekdays 244 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray wdays) { 245 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 246 if (cflocale != NULL) { 247 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 248 cflocale, 249 kCFDateFormatterFullStyle, 250 kCFDateFormatterFullStyle); 251 if (df != NULL) { 252 CFArrayRef cfwdays = CFDateFormatterCopyProperty(df, kCFDateFormatterWeekdaySymbols); 253 if (cfwdays != NULL) { 254 copyArrayElements(env, cfwdays, wdays, 0, 1, CFArrayGetCount(cfwdays)); 255 CFRelease(cfwdays); 256 } 257 CFRelease(df); 258 } 259 CFRelease(cflocale); 260 } 261 262 return wdays; 263 } 264 265 /* 266 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 267 * Method: getShortWeekdays 268 * Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String; 269 */ 270 JNIEXPORT jobjectArray JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getShortWeekdays 271 (JNIEnv *env, jclass cls, jstring jlangtag, jobjectArray swdays) { 272 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 273 if (cflocale != NULL) { 274 CFDateFormatterRef df = CFDateFormatterCreate(kCFAllocatorDefault, 275 cflocale, 276 kCFDateFormatterFullStyle, 277 kCFDateFormatterFullStyle); 278 if (df != NULL) { 279 CFArrayRef cfswdays = CFDateFormatterCopyProperty(df, kCFDateFormatterShortWeekdaySymbols); 280 if (cfswdays != NULL) { 281 copyArrayElements(env, cfswdays, swdays, 0, 1, CFArrayGetCount(cfswdays)); 282 CFRelease(cfswdays); 283 } 284 CFRelease(df); 285 } 286 CFRelease(cflocale); 287 } 288 289 return swdays; 290 } 291 292 /* 293 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 294 * Method: getNumberPatternNative 295 * Signature: (ILjava/lang/String;)Ljava/lang/String; 296 */ 297 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getNumberPatternNative 298 (JNIEnv *env, jclass cls, jint numberStyle, jstring jlangtag) { 299 jstring ret = NULL; 300 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 301 if (cflocale != NULL) { 302 CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault, 303 cflocale, 304 convertNumberFormatterStyle(numberStyle)); 305 if (nf != NULL) { 306 char buf[BUFLEN]; 307 CFStringRef formatStr = CFNumberFormatterGetFormat(nf); 308 CFStringGetCString(formatStr, buf, BUFLEN, kCFStringEncodingUTF8); 309 ret = (*env)->NewStringUTF(env, buf); 310 CFRelease(nf); 311 } 312 CFRelease(cflocale); 313 } 314 315 return ret; 316 } 317 318 /* 319 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 320 * Method: getCurrencySymbol 321 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 322 */ 323 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCurrencySymbol 324 (JNIEnv *env, jclass cls, jstring jlangtag, jstring currencySymbol) { 325 return getNumberSymbolString(env, currencySymbol, kCFNumberFormatterCurrencySymbol); 326 } 327 328 /* 329 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 330 * Method: getDecimalSeparator 331 * Signature: (Ljava/lang/String;C)C 332 */ 333 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDecimalSeparator 334 (JNIEnv *env, jclass cls, jstring jlangtag, jchar decimalSeparator) { 335 return getNumberSymbolChar(decimalSeparator, kCFNumberFormatterDecimalSeparator); 336 } 337 338 /* 339 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 340 * Method: getGroupingSeparator 341 * Signature: (Ljava/lang/String;C)C 342 */ 343 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getGroupingSeparator 344 (JNIEnv *env, jclass cls, jstring jlangtag, jchar groupingSeparator) { 345 return getNumberSymbolChar(groupingSeparator, kCFNumberFormatterGroupingSeparator); 346 } 347 348 /* 349 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 350 * Method: getInfinity 351 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 352 */ 353 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInfinity 354 (JNIEnv *env, jclass cls, jstring jlangtag, jstring infinity) { 355 return getNumberSymbolString(env, infinity, kCFNumberFormatterInfinitySymbol); 356 } 357 358 /* 359 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 360 * Method: getInternationalCurrencySymbol 361 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 362 */ 363 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInternationalCurrencySymbol 364 (JNIEnv *env, jclass cls, jstring jlangtag, jstring internationalCurrencySymbol) { 365 return getNumberSymbolString(env, internationalCurrencySymbol, kCFNumberFormatterInternationalCurrencySymbol); 366 } 367 368 /* 369 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 370 * Method: getMinusSign 371 * Signature: (Ljava/lang/String;C)C 372 */ 373 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMinusSign 374 (JNIEnv *env, jclass cls, jstring jlangtag, jchar minusSign) { 375 return getNumberSymbolChar(minusSign, kCFNumberFormatterMinusSign); 376 } 377 378 /* 379 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 380 * Method: getMonetaryDecimalSeparator 381 * Signature: (Ljava/lang/String;C)C 382 */ 383 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMonetaryDecimalSeparator 384 (JNIEnv *env, jclass cls, jstring jlangtag, jchar monetaryDecimalSeparator) { 385 return getNumberSymbolChar(monetaryDecimalSeparator, kCFNumberFormatterCurrencyDecimalSeparator); 386 } 387 388 /* 389 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 390 * Method: getNaN 391 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 392 */ 393 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getNaN 394 (JNIEnv *env, jclass cls, jstring jlangtag, jstring nan) { 395 return getNumberSymbolString(env, nan, kCFNumberFormatterNaNSymbol); 396 } 397 398 /* 399 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 400 * Method: getPercent 401 * Signature: (Ljava/lang/String;C)C 402 */ 403 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPercent 404 (JNIEnv *env, jclass cls, jstring jlangtag, jchar percent) { 405 return getNumberSymbolChar(percent, kCFNumberFormatterPercentSymbol); 406 } 407 408 /* 409 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 410 * Method: getPerMill 411 * Signature: (Ljava/lang/String;C)C 412 */ 413 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPerMill 414 (JNIEnv *env, jclass cls, jstring jlangtag, jchar perMill) { 415 return getNumberSymbolChar(perMill, kCFNumberFormatterPerMillSymbol); 416 } 417 418 /* 419 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 420 * Method: getZeroDigit 421 * Signature: (Ljava/lang/String;C)C 422 */ 423 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getZeroDigit 424 (JNIEnv *env, jclass cls, jstring jlangtag, jchar zeroDigit) { 425 return getNumberSymbolChar(zeroDigit, kCFNumberFormatterZeroSymbol); 426 } 427 428 /* 429 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 430 * Method: getExponentSeparator 431 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 432 */ 433 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getExponentSeparator 434 (JNIEnv *env, jclass cls, jstring jlangtag, jstring exponent) { 435 return getNumberSymbolString(env, exponent, kCFNumberFormatterExponentSymbol); 436 } 437 438 /* 439 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 440 * Method: getCalendarInt 441 * Signature: (Ljava/lang/String;I)I 442 */ 443 JNIEXPORT jint JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCalendarInt 444 (JNIEnv *env, jclass cls, jstring jlangtag, jint type) { 445 jint ret = 0; 446 CFCalendarRef cfcal = CFCalendarCopyCurrent(); 447 448 if (cfcal != NULL) { 449 switch (type) { 450 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_FIRSTDAYOFWEEK: 451 ret = CFCalendarGetFirstWeekday(cfcal); 452 break; 453 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_MINIMALDAYSINFIRSTWEEK: 454 ret = CFCalendarGetMinimumDaysInFirstWeek(cfcal); 455 break; 456 default: 457 ret = 0; 458 } 459 460 CFRelease(cfcal); 461 } 462 463 return ret; 464 } 465 466 /* 467 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 468 * Method: getDisplayString 469 * Signature: (Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String; 470 */ 471 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDisplayString 472 (JNIEnv *env, jclass cls, jstring jlangtag, jint type, jstring value) { 473 jstring ret = NULL; 474 475 const char *clangtag = (*env)->GetStringUTFChars(env, jlangtag, 0); 476 if (clangtag != NULL) { 477 const char *cvalue = (*env)->GetStringUTFChars(env, value, 0); 478 if (cvalue != NULL) { 479 CFStringRef cflangtag = 480 CFStringCreateWithCString(kCFAllocatorDefault, clangtag, kCFStringEncodingUTF8); 481 if (cflangtag != NULL) { 482 CFLocaleRef cflocale = CFLocaleCreate(kCFAllocatorDefault, cflangtag); 483 if (cflocale != NULL) { 484 CFStringRef cfvalue = 485 CFStringCreateWithCString(kCFAllocatorDefault, cvalue, kCFStringEncodingUTF8); 486 if (cfvalue != NULL) { 487 CFStringRef str = NULL; 488 switch (type) { 489 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_LOCALE_LANGUAGE: 490 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleLanguageCode, cfvalue); 491 break; 492 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_LOCALE_SCRIPT: 493 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleScriptCode, cfvalue); 494 break; 495 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_LOCALE_REGION: 496 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleCountryCode, cfvalue); 497 break; 498 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_LOCALE_VARIANT: 499 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleVariantCode, cfvalue); 500 break; 501 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_CURRENCY_CODE: 502 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleCurrencyCode, cfvalue); 503 break; 504 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_CURRENCY_SYMBOL: 505 str = CFLocaleCopyDisplayNameForPropertyValue(cflocale, kCFLocaleCurrencySymbol, cfvalue); 506 break; 507 } 508 if (str != NULL) { 509 char buf[BUFLEN]; 510 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8); 511 CFRelease(str); 512 ret = (*env)->NewStringUTF(env, buf); 513 } 514 CFRelease(cfvalue); 515 } 516 CFRelease(cflocale); 517 } 518 CFRelease(cflangtag); 519 } 520 (*env)->ReleaseStringUTFChars(env, value, cvalue); 521 } 522 (*env)->ReleaseStringUTFChars(env, jlangtag, clangtag); 523 } 524 525 return ret; 526 } 527 528 /* 529 * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl 530 * Method: getTimeZoneDisplayString 531 * Signature: (Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String; 532 */ 533 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getTimeZoneDisplayString 534 (JNIEnv *env, jclass cls, jstring jlangtag, jint type, jstring tzid) { 535 jstring ret = NULL; 536 537 const char *clangtag = (*env)->GetStringUTFChars(env, jlangtag, 0); 538 if (clangtag != NULL) { 539 const char *ctzid = (*env)->GetStringUTFChars(env, tzid, 0); 540 if (ctzid != NULL) { 541 CFStringRef cflangtag = 542 CFStringCreateWithCString(kCFAllocatorDefault, clangtag, kCFStringEncodingUTF8); 543 if (cflangtag != NULL) { 544 CFLocaleRef cflocale = CFLocaleCreate(kCFAllocatorDefault, cflangtag); 545 if (cflocale != NULL) { 546 CFStringRef cftzid = 547 CFStringCreateWithCString(kCFAllocatorDefault, ctzid, kCFStringEncodingUTF8); 548 if (cftzid != NULL) { 549 CFTimeZoneRef cftz = CFTimeZoneCreateWithName(kCFAllocatorDefault, cftzid, false); 550 if (cftz != NULL) { 551 CFStringRef str = NULL; 552 switch (type) { 553 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_TZ_SHORT_STANDARD: 554 str = CFTimeZoneCopyLocalizedName(cftz, kCFTimeZoneNameStyleShortStandard, cflocale); 555 break; 556 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_TZ_SHORT_DST: 557 str = CFTimeZoneCopyLocalizedName(cftz, kCFTimeZoneNameStyleShortDaylightSaving, cflocale); 558 break; 559 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_TZ_LONG_STANDARD: 560 str = CFTimeZoneCopyLocalizedName(cftz, kCFTimeZoneNameStyleStandard, cflocale); 561 break; 562 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_DN_TZ_LONG_DST: 563 str = CFTimeZoneCopyLocalizedName(cftz, kCFTimeZoneNameStyleDaylightSaving, cflocale); 564 break; 565 } 566 if (str != NULL) { 567 char buf[BUFLEN]; 568 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8); 569 CFRelease(str); 570 ret = (*env)->NewStringUTF(env, buf); 571 } 572 CFRelease(cftz); 573 } 574 CFRelease(cftzid); 575 } 576 CFRelease(cflocale); 577 } 578 CFRelease(cflangtag); 579 } 580 (*env)->ReleaseStringUTFChars(env, tzid, ctzid); 581 } 582 (*env)->ReleaseStringUTFChars(env, jlangtag, clangtag); 583 } 584 585 return ret; 586 } 587 588 static CFDateFormatterStyle convertDateFormatterStyle(jint javaStyle) { 589 switch (javaStyle) { 590 case 0: // FULL 591 return kCFDateFormatterFullStyle; 592 case 1: // LONG 593 return kCFDateFormatterLongStyle; 594 case 2: // MEDIUM 595 return kCFDateFormatterMediumStyle; 596 case 3: // LONG 597 return kCFDateFormatterShortStyle; 598 case -1: // No style 599 default: 600 return kCFDateFormatterNoStyle; 601 } 602 } 603 604 static CFNumberFormatterStyle convertNumberFormatterStyle(jint javaStyle) { 605 switch (javaStyle) { 606 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_CURRENCY: 607 return kCFNumberFormatterCurrencyStyle; 608 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_INTEGER: 609 return kCFNumberFormatterDecimalStyle; 610 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_NUMBER: 611 return kCFNumberFormatterDecimalStyle; 612 case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_PERCENT: 613 return kCFNumberFormatterPercentStyle; 614 default: 615 return kCFNumberFormatterNoStyle; 616 } 617 } 618 619 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count) { 620 char buf[BUFLEN]; 621 622 for (; count > 0; sindex++, dindex++, count--) { 623 CFStringGetCString(CFArrayGetValueAtIndex(cfarray, sindex), buf, BUFLEN, kCFStringEncodingUTF8); 624 (*env)->SetObjectArrayElement(env, jarray, dindex, (*env)->NewStringUTF(env, buf)); 625 } 626 } 627 628 static jstring getNumberSymbolString(JNIEnv *env, jstring jdefault, CFStringRef type) { 629 char buf[BUFLEN]; 630 jstring ret = jdefault; 631 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 632 633 if (cflocale != NULL) { 634 CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault, 635 cflocale, 636 kCFNumberFormatterDecimalStyle); 637 if (nf != NULL) { 638 CFStringRef str = CFNumberFormatterCopyProperty(nf, type); 639 if (str != NULL) { 640 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8); 641 CFRelease(str); 642 ret = (*env)->NewStringUTF(env, buf); 643 } 644 645 CFRelease(nf); 646 } 647 648 CFRelease(cflocale); 649 } 650 651 return ret; 652 } 653 654 static jchar getNumberSymbolChar(jchar jdefault, CFStringRef type) { 655 char buf[BUFLEN]; 656 jchar ret = jdefault; 657 CFLocaleRef cflocale = CFLocaleCopyCurrent(); 658 659 if (cflocale != NULL) { 660 CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault, 661 cflocale, 662 kCFNumberFormatterDecimalStyle); 663 if (nf != NULL) { 664 CFStringRef str = CFNumberFormatterCopyProperty(nf, type); 665 if (str != NULL) { 666 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8); 667 CFRelease(str); 668 ret = buf[0]; 669 } 670 671 CFRelease(nf); 672 } 673 674 CFRelease(cflocale); 675 } 676 677 return ret; 678 }