jdk/src/macosx/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c
changeset 13583 dc0017b1a452
child 16733 9267ec7004a1
equal deleted inserted replaced
13582:16f0af616ea0 13583:dc0017b1a452
       
     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 }