LCOV - code coverage report
Current view: top level - i18npool/source/localedata - localedata.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 381 653 58.3 %
Date: 2015-06-13 12:38:46 Functions: 43 66 65.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <cppuhelper/supportsservice.hxx>
      21             : #include <localedata.hxx>
      22             : #include <i18nlangtag/mslangid.hxx>
      23             : #include <i18nlangtag/languagetag.hxx>
      24             : #include <rtl/ustrbuf.hxx>
      25             : #include <sal/log.hxx>
      26             : #include <osl/diagnose.h>
      27             : #include <string.h>
      28             : #include <stdio.h>
      29             : #include "rtl/instance.hxx"
      30             : #include <sal/macros.h>
      31             : 
      32             : using namespace com::sun::star::i18n;
      33             : using namespace com::sun::star::uno;
      34             : using namespace com::sun::star::lang;
      35             : using namespace com::sun::star;
      36             : 
      37             : typedef sal_Unicode**   (SAL_CALL * MyFunc_Type)( sal_Int16&);
      38             : typedef sal_Unicode***  (SAL_CALL * MyFunc_Type2)( sal_Int16&, sal_Int16& );
      39             : typedef sal_Unicode**** (SAL_CALL * MyFunc_Type3)( sal_Int16&, sal_Int16&, sal_Int16& );
      40             : typedef sal_Unicode const * const * (SAL_CALL * MyFunc_FormatCode)( sal_Int16&, sal_Unicode const *&, sal_Unicode const *& );
      41             : 
      42             : #ifndef DISABLE_DYNLOADING
      43             : 
      44             : static const char *lcl_DATA_EN = "localedata_en";
      45             : static const char *lcl_DATA_ES = "localedata_es";
      46             : static const char *lcl_DATA_EURO = "localedata_euro";
      47             : static const char *lcl_DATA_OTHERS = "localedata_others";
      48             : 
      49             : #endif
      50             : 
      51             : #ifndef DISABLE_DYNLOADING
      52             : 
      53             : static const struct {
      54             :     const char* pLocale;
      55             :     const char* pLib;
      56             : } aLibTable[] = {
      57             :     { "en_US",  lcl_DATA_EN },
      58             :     { "en_AU",  lcl_DATA_EN },
      59             :     { "en_BZ",  lcl_DATA_EN },
      60             :     { "en_CA",  lcl_DATA_EN },
      61             :     { "en_GB",  lcl_DATA_EN },
      62             :     { "en_IE",  lcl_DATA_EN },
      63             :     { "en_JM",  lcl_DATA_EN },
      64             :     { "en_NZ",  lcl_DATA_EN },
      65             :     { "en_PH",  lcl_DATA_EN },
      66             :     { "en_TT",  lcl_DATA_EN },
      67             :     { "en_ZA",  lcl_DATA_EN },
      68             :     { "en_ZW",  lcl_DATA_EN },
      69             :     { "en_NA",  lcl_DATA_EN },
      70             :     { "en_GH",  lcl_DATA_EN },
      71             :     { "en_MW",  lcl_DATA_EN },
      72             : 
      73             :     { "es_ES",  lcl_DATA_ES },
      74             :     { "es_AR",  lcl_DATA_ES },
      75             :     { "es_BO",  lcl_DATA_ES },
      76             :     { "es_CL",  lcl_DATA_ES },
      77             :     { "es_CO",  lcl_DATA_ES },
      78             :     { "es_CR",  lcl_DATA_ES },
      79             :     { "es_DO",  lcl_DATA_ES },
      80             :     { "es_EC",  lcl_DATA_ES },
      81             :     { "es_GT",  lcl_DATA_ES },
      82             :     { "es_HN",  lcl_DATA_ES },
      83             :     { "es_MX",  lcl_DATA_ES },
      84             :     { "es_NI",  lcl_DATA_ES },
      85             :     { "es_PA",  lcl_DATA_ES },
      86             :     { "es_PE",  lcl_DATA_ES },
      87             :     { "es_PR",  lcl_DATA_ES },
      88             :     { "es_PY",  lcl_DATA_ES },
      89             :     { "es_SV",  lcl_DATA_ES },
      90             :     { "es_UY",  lcl_DATA_ES },
      91             :     { "es_VE",  lcl_DATA_ES },
      92             :     { "gl_ES",  lcl_DATA_ES },
      93             : 
      94             :     { "de_DE",  lcl_DATA_EURO },
      95             :     { "de_AT",  lcl_DATA_EURO },
      96             :     { "de_CH",  lcl_DATA_EURO },
      97             :     { "de_LI",  lcl_DATA_EURO },
      98             :     { "de_LU",  lcl_DATA_EURO },
      99             :     { "fr_FR",  lcl_DATA_EURO },
     100             :     { "fr_BE",  lcl_DATA_EURO },
     101             :     { "fr_CA",  lcl_DATA_EURO },
     102             :     { "fr_CH",  lcl_DATA_EURO },
     103             :     { "fr_LU",  lcl_DATA_EURO },
     104             :     { "fr_MC",  lcl_DATA_EURO },
     105             :     { "fr_BF",  lcl_DATA_EURO },
     106             :     { "fr_CI",  lcl_DATA_EURO },
     107             :     { "fr_ML",  lcl_DATA_EURO },
     108             :     { "fr_SN",  lcl_DATA_EURO },
     109             :     { "fr_BJ",  lcl_DATA_EURO },
     110             :     { "fr_NE",  lcl_DATA_EURO },
     111             :     { "fr_TG",  lcl_DATA_EURO },
     112             :     { "it_IT",  lcl_DATA_EURO },
     113             :     { "it_CH",  lcl_DATA_EURO },
     114             :     { "sl_SI",  lcl_DATA_EURO },
     115             :     { "sv_SE",  lcl_DATA_EURO },
     116             :     { "sv_FI",  lcl_DATA_EURO },
     117             :     { "ca_ES",  lcl_DATA_EURO },
     118             :     { "ca_ES_valencia",  lcl_DATA_EURO },
     119             :     { "cs_CZ",  lcl_DATA_EURO },
     120             :     { "sk_SK",  lcl_DATA_EURO },
     121             :     { "da_DK",  lcl_DATA_EURO },
     122             :     { "el_GR",  lcl_DATA_EURO },
     123             :     { "fi_FI",  lcl_DATA_EURO },
     124             :     { "is_IS",  lcl_DATA_EURO },
     125             :     { "nl_BE",  lcl_DATA_EURO },
     126             :     { "nl_NL",  lcl_DATA_EURO },
     127             :     { "no_NO",  lcl_DATA_EURO },
     128             :     { "nn_NO",  lcl_DATA_EURO },
     129             :     { "nb_NO",  lcl_DATA_EURO },
     130             :     { "nds_DE", lcl_DATA_EURO },
     131             :     { "pl_PL",  lcl_DATA_EURO },
     132             :     { "pt_BR",  lcl_DATA_EURO },
     133             :     { "pt_PT",  lcl_DATA_EURO },
     134             :     { "ru_RU",  lcl_DATA_EURO },
     135             :     { "tr_TR",  lcl_DATA_EURO },
     136             :     { "tt_RU",  lcl_DATA_EURO },
     137             :     { "et_EE",  lcl_DATA_EURO },
     138             :     { "lb_LU",  lcl_DATA_EURO },
     139             :     { "lt_LT",  lcl_DATA_EURO },
     140             :     { "lv_LV",  lcl_DATA_EURO },
     141             :     { "uk_UA",  lcl_DATA_EURO },
     142             :     { "ro_RO",  lcl_DATA_EURO },
     143             :     { "cy_GB",  lcl_DATA_EURO },
     144             :     { "bg_BG",  lcl_DATA_EURO },
     145             :     { "sr_Latn_ME",  lcl_DATA_EURO },
     146             :     { "sr_Latn_RS",  lcl_DATA_EURO },
     147             :     { "sr_Latn_CS",  lcl_DATA_EURO },
     148             :     { "sr_ME",  lcl_DATA_EURO },
     149             :     { "sr_RS",  lcl_DATA_EURO },
     150             :     { "sr_CS",  lcl_DATA_EURO },
     151             :     { "hr_HR",  lcl_DATA_EURO },
     152             :     { "bs_BA",  lcl_DATA_EURO },
     153             :     { "eu",     lcl_DATA_EURO },
     154             :     { "fo_FO",  lcl_DATA_EURO },
     155             :     { "ga_IE",  lcl_DATA_EURO },
     156             :     { "gd_GB",  lcl_DATA_EURO },
     157             :     { "ka_GE",  lcl_DATA_EURO },
     158             :     { "be_BY",  lcl_DATA_EURO },
     159             :     { "kl_GL",  lcl_DATA_EURO },
     160             :     { "mk_MK",  lcl_DATA_EURO },
     161             :     { "br_FR",  lcl_DATA_EURO },
     162             :     { "la_VA",  lcl_DATA_EURO },
     163             :     { "cv_RU",  lcl_DATA_EURO },
     164             :     { "wa_BE",  lcl_DATA_EURO },
     165             :     { "fur_IT", lcl_DATA_EURO },
     166             :     { "gsc_FR", lcl_DATA_EURO },
     167             :     { "fy_NL",  lcl_DATA_EURO },
     168             :     { "oc_FR",  lcl_DATA_EURO },
     169             :     { "mt_MT",  lcl_DATA_EURO },
     170             :     { "sc_IT",  lcl_DATA_EURO },
     171             :     { "ast_ES", lcl_DATA_EURO },
     172             :     { "ltg_LV", lcl_DATA_EURO },
     173             :     { "hsb_DE", lcl_DATA_EURO },
     174             :     { "dsb_DE", lcl_DATA_EURO },
     175             :     { "rue_SK", lcl_DATA_EURO },
     176             :     { "an_ES",  lcl_DATA_EURO },
     177             :     { "myv_RU", lcl_DATA_EURO },
     178             :     { "lld_IT", lcl_DATA_EURO },
     179             :     { "cu_RU",  lcl_DATA_EURO },
     180             :     { "vec_IT", lcl_DATA_EURO },
     181             : 
     182             :     { "ja_JP",  lcl_DATA_OTHERS },
     183             :     { "ko_KR",  lcl_DATA_OTHERS },
     184             :     { "zh_CN",  lcl_DATA_OTHERS },
     185             :     { "zh_HK",  lcl_DATA_OTHERS },
     186             :     { "zh_SG",  lcl_DATA_OTHERS },
     187             :     { "zh_TW",  lcl_DATA_OTHERS },
     188             :     { "zh_MO",  lcl_DATA_OTHERS },
     189             : 
     190             :     { "ar_EG",  lcl_DATA_OTHERS },
     191             :     { "ar_DZ",  lcl_DATA_OTHERS },
     192             :     { "ar_LB",  lcl_DATA_OTHERS },
     193             :     { "ar_SA",  lcl_DATA_OTHERS },
     194             :     { "ar_TN",  lcl_DATA_OTHERS },
     195             :     { "he_IL",  lcl_DATA_OTHERS },
     196             :     { "hi_IN",  lcl_DATA_OTHERS },
     197             :     { "kn_IN",  lcl_DATA_OTHERS },
     198             :     { "ta_IN",  lcl_DATA_OTHERS },
     199             :     { "te_IN",  lcl_DATA_OTHERS },
     200             :     { "gu_IN",  lcl_DATA_OTHERS },
     201             :     { "mr_IN",  lcl_DATA_OTHERS },
     202             :     { "pa_IN",  lcl_DATA_OTHERS },
     203             :     { "bn_IN",  lcl_DATA_OTHERS },
     204             :     { "or_IN",  lcl_DATA_OTHERS },
     205             :     { "en_IN",  lcl_DATA_OTHERS },
     206             :     { "ml_IN",  lcl_DATA_OTHERS },
     207             :     { "bn_BD",  lcl_DATA_OTHERS },
     208             :     { "th_TH",  lcl_DATA_OTHERS },
     209             : 
     210             :     { "af_ZA",  lcl_DATA_OTHERS },
     211             :     { "hu_HU",  lcl_DATA_OTHERS },
     212             :     { "id_ID",  lcl_DATA_OTHERS },
     213             :     { "ms_MY",  lcl_DATA_OTHERS },
     214             :     { "ia",     lcl_DATA_OTHERS },
     215             :     { "mn_Cyrl_MN",  lcl_DATA_OTHERS },
     216             :     { "az_AZ",  lcl_DATA_OTHERS },
     217             :     { "sw_TZ",  lcl_DATA_OTHERS },
     218             :     { "km_KH",  lcl_DATA_OTHERS },
     219             :     { "lo_LA",  lcl_DATA_OTHERS },
     220             :     { "rw_RW",  lcl_DATA_OTHERS },
     221             :     { "eo",     lcl_DATA_OTHERS },
     222             :     { "dz_BT",  lcl_DATA_OTHERS },
     223             :     { "ne_NP",  lcl_DATA_OTHERS },
     224             :     { "zu_ZA",  lcl_DATA_OTHERS },
     225             :     { "nso_ZA", lcl_DATA_OTHERS },
     226             :     { "vi_VN",  lcl_DATA_OTHERS },
     227             :     { "tn_ZA",  lcl_DATA_OTHERS },
     228             :     { "xh_ZA",  lcl_DATA_OTHERS },
     229             :     { "st_ZA",  lcl_DATA_OTHERS },
     230             :     { "ss_ZA",  lcl_DATA_OTHERS },
     231             :     { "ve_ZA",  lcl_DATA_OTHERS },
     232             :     { "nr_ZA",  lcl_DATA_OTHERS },
     233             :     { "ts_ZA",  lcl_DATA_OTHERS },
     234             :     { "kmr_Latn_TR",  lcl_DATA_OTHERS },
     235             :     { "ak_GH",  lcl_DATA_OTHERS },
     236             :     { "af_NA",  lcl_DATA_OTHERS },
     237             :     { "am_ET",  lcl_DATA_OTHERS },
     238             :     { "ti_ER",  lcl_DATA_OTHERS },
     239             :     { "tg_TJ",  lcl_DATA_OTHERS },
     240             :     { "ky_KG",  lcl_DATA_OTHERS },
     241             :     { "kk_KZ",  lcl_DATA_OTHERS },
     242             :     { "fa_IR",  lcl_DATA_OTHERS },
     243             :     { "ha_Latn_GH",  lcl_DATA_OTHERS },
     244             :     { "ee_GH",  lcl_DATA_OTHERS },
     245             :     { "sg_CF",  lcl_DATA_OTHERS },
     246             :     { "lg_UG",  lcl_DATA_OTHERS },
     247             :     { "uz_UZ",  lcl_DATA_OTHERS },
     248             :     { "ln_CD",  lcl_DATA_OTHERS },
     249             :     { "hy_AM",  lcl_DATA_OTHERS },
     250             :     { "hil_PH", lcl_DATA_OTHERS },
     251             :     { "so_SO",  lcl_DATA_OTHERS },
     252             :     { "gug_PY", lcl_DATA_OTHERS },
     253             :     { "tk_TM",  lcl_DATA_OTHERS },
     254             :     { "my_MM",  lcl_DATA_OTHERS },
     255             :     { "shs_CA", lcl_DATA_OTHERS },
     256             :     { "tpi_PG", lcl_DATA_OTHERS },
     257             :     { "ar_OM",  lcl_DATA_OTHERS },
     258             :     { "ug_CN",  lcl_DATA_OTHERS },
     259             :     { "om_ET",  lcl_DATA_OTHERS },
     260             :     { "plt_MG", lcl_DATA_OTHERS },
     261             :     { "mai_IN", lcl_DATA_OTHERS },
     262             :     { "yi_US",  lcl_DATA_OTHERS },
     263             :     { "haw_US", lcl_DATA_OTHERS },
     264             :     { "lif_NP", lcl_DATA_OTHERS },
     265             :     { "ur_PK",  lcl_DATA_OTHERS },
     266             :     { "ht_HT",  lcl_DATA_OTHERS },
     267             :     { "jbo",    lcl_DATA_OTHERS },
     268             :     { "kab_DZ", lcl_DATA_OTHERS },
     269             :     { "pt_AO",  lcl_DATA_OTHERS },
     270             :     { "pjt_AU", lcl_DATA_OTHERS },
     271             :     { "pap_BQ", lcl_DATA_OTHERS },
     272             :     { "pap_CW", lcl_DATA_OTHERS },
     273             :     { "ebo_CG", lcl_DATA_OTHERS },
     274             :     { "tyx_CG", lcl_DATA_OTHERS },
     275             :     { "axk_CG", lcl_DATA_OTHERS },
     276             :     { "beq_CG", lcl_DATA_OTHERS },
     277             :     { "bkw_CG", lcl_DATA_OTHERS },
     278             :     { "bvx_CG", lcl_DATA_OTHERS },
     279             :     { "dde_CG", lcl_DATA_OTHERS },
     280             :     { "iyx_CG", lcl_DATA_OTHERS },
     281             :     { "kkw_CG", lcl_DATA_OTHERS },
     282             :     { "kng_CG", lcl_DATA_OTHERS },
     283             :     { "ldi_CG", lcl_DATA_OTHERS },
     284             :     { "mdw_CG", lcl_DATA_OTHERS },
     285             :     { "mkw_CG", lcl_DATA_OTHERS },
     286             :     { "njx_CG", lcl_DATA_OTHERS },
     287             :     { "ngz_CG", lcl_DATA_OTHERS },
     288             :     { "njy_CG", lcl_DATA_OTHERS },
     289             :     { "puu_CG", lcl_DATA_OTHERS },
     290             :     { "sdj_CG", lcl_DATA_OTHERS },
     291             :     { "tek_CG", lcl_DATA_OTHERS },
     292             :     { "tsa_CG", lcl_DATA_OTHERS },
     293             :     { "vif_CG", lcl_DATA_OTHERS },
     294             :     { "xku_CG", lcl_DATA_OTHERS },
     295             :     { "yom_CG", lcl_DATA_OTHERS },
     296             :     { "sid_ET", lcl_DATA_OTHERS },
     297             :     { "bo_CN",  lcl_DATA_OTHERS },
     298             :     { "bo_IN",  lcl_DATA_OTHERS },
     299             :     { "ar_AE",  lcl_DATA_OTHERS },
     300             :     { "ar_KW",  lcl_DATA_OTHERS },
     301             :     { "bm_ML",  lcl_DATA_OTHERS },
     302             :     { "pui_CO", lcl_DATA_OTHERS },
     303             :     { "lgr_SB", lcl_DATA_OTHERS },
     304             :     { "mos_BF", lcl_DATA_OTHERS },
     305             :     { "ny_MW",  lcl_DATA_OTHERS },
     306             :     { "ti_ET",  lcl_DATA_OTHERS }
     307         235 : };
     308             : 
     309             : #else
     310             : 
     311             : #include "localedata_static.hxx"
     312             : 
     313             : #endif
     314             : 
     315             : static const sal_Unicode cUnder = '_';
     316             : static const sal_Unicode cHyphen = '-';
     317             : 
     318             : static const sal_Int16 nbOfLocales = SAL_N_ELEMENTS(aLibTable);
     319             : 
     320      172859 : struct LocaleDataLookupTableItem
     321             : {
     322         397 :     LocaleDataLookupTableItem(const sal_Char *name, osl::Module* m, const sal_Char* lname) : dllName(name), module(m), localeName(lname)
     323             :     {
     324         397 :     }
     325             :     const sal_Char* dllName;
     326             :     osl::Module *module;
     327             :     const sal_Char* localeName;
     328             : 
     329             :     com::sun::star::lang::Locale aLocale;
     330    85491511 :     bool equals(const com::sun::star::lang::Locale& rLocale)
     331             :     {
     332    85491511 :         return (rLocale == aLocale);
     333             :     }
     334             : };
     335             : 
     336             : 
     337             : // static
     338           0 : Sequence< CalendarItem > LocaleDataImpl::downcastCalendarItems( const Sequence< CalendarItem2 > & rCi )
     339             : {
     340           0 :     sal_Int32 nSize = rCi.getLength();
     341           0 :     Sequence< CalendarItem > aCi( nSize);
     342           0 :     CalendarItem* p1 = aCi.getArray();
     343           0 :     const CalendarItem2* p2 = rCi.getConstArray();
     344           0 :     for (sal_Int32 i=0; i < nSize; ++i, ++p1, ++p2)
     345           0 :         *p1 = *p2;
     346           0 :     return aCi;
     347             : }
     348             : 
     349             : 
     350             : // static
     351           0 : Calendar LocaleDataImpl::downcastCalendar( const Calendar2 & rC )
     352             : {
     353             :     Calendar aCal(
     354             :             downcastCalendarItems( rC.Days),
     355             :             downcastCalendarItems( rC.Months),
     356             :             downcastCalendarItems( rC.Eras),
     357             :             rC.StartOfWeek,
     358             :             rC.MinimumNumberOfDaysForFirstWeek,
     359             :             rC.Default,
     360             :             rC.Name
     361           0 :             );
     362           0 :     return aCal;
     363             : }
     364             : 
     365             : 
     366       68998 : LocaleDataImpl::LocaleDataImpl()
     367             : {
     368       68998 : }
     369      121280 : LocaleDataImpl::~LocaleDataImpl()
     370             : {
     371      121280 : }
     372             : 
     373             : 
     374             : LocaleDataItem SAL_CALL
     375       42686 : LocaleDataImpl::getLocaleItem( const Locale& rLocale ) throw(RuntimeException, std::exception)
     376             : {
     377       42686 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getLocaleItem" ));
     378             : 
     379       42686 :     if ( func ) {
     380       42686 :         sal_Int16 dataItemCount = 0;
     381       42686 :         sal_Unicode **dataItem = func(dataItemCount);
     382             : 
     383             :         LocaleDataItem item(
     384             :                 dataItem[0],
     385       42686 :                 dataItem[1],
     386       42686 :                 dataItem[2],
     387       42686 :                 dataItem[3],
     388       42686 :                 dataItem[4],
     389       42686 :                 dataItem[5],
     390       42686 :                 dataItem[6],
     391       42686 :                 dataItem[7],
     392       42686 :                 dataItem[8],
     393       42686 :                 dataItem[9],
     394       42686 :                 dataItem[10],
     395       42686 :                 dataItem[11],
     396       42686 :                 dataItem[12],
     397       42686 :                 dataItem[13],
     398       42686 :                 dataItem[14],
     399       42686 :                 dataItem[15],
     400       42686 :                 dataItem[16],
     401       42686 :                 dataItem[17]
     402      725662 :                 );
     403       42686 :         return item;
     404             :     }
     405             :     else {
     406           0 :         LocaleDataItem item1;
     407           0 :         return item1;
     408             :     }
     409             : }
     410             : 
     411             : #ifndef DISABLE_DYNLOADING
     412             : 
     413           0 : extern "C" { static void SAL_CALL thisModule() {} }
     414             : 
     415             : #endif
     416             : 
     417             : namespace
     418             : {
     419             : 
     420             : // implement the lookup table as a safe static object
     421             : class lcl_LookupTableHelper
     422             : {
     423             : public:
     424             :     lcl_LookupTableHelper();
     425             :     ~lcl_LookupTableHelper();
     426             : 
     427             :     oslGenericFunction SAL_CALL getFunctionSymbolByName(
     428             :             const OUString& localeName, const sal_Char* pFunction,
     429             :             LocaleDataLookupTableItem** pOutCachedItem );
     430             : 
     431             : private:
     432             :     ::osl::Mutex maMutex;
     433             :     ::std::vector< LocaleDataLookupTableItem* >  maLookupTable;
     434             : };
     435             : 
     436             : // from instance.hxx: Helper base class for a late-initialized
     437             : // (default-constructed) static variable, implementing the double-checked
     438             : // locking pattern correctly.
     439             : // usage:  lcl_LookupTableHelper & rLookupTable = lcl_LookupTableStatic::get();
     440             : // retrieves the singleton lookup table instance
     441             : struct lcl_LookupTableStatic : public ::rtl::Static< lcl_LookupTableHelper, lcl_LookupTableStatic >
     442             : {};
     443             : 
     444         229 : lcl_LookupTableHelper::lcl_LookupTableHelper()
     445             : {
     446         229 : }
     447             : 
     448         458 : lcl_LookupTableHelper::~lcl_LookupTableHelper()
     449             : {
     450         229 :     std::vector<LocaleDataLookupTableItem*>::const_iterator aEnd(maLookupTable.end());
     451         229 :     std::vector<LocaleDataLookupTableItem*>::iterator aIter(maLookupTable.begin());
     452             : 
     453         626 :     for ( ; aIter != aEnd; ++aIter ) {
     454         397 :         LocaleDataLookupTableItem* pItem = *aIter;
     455         397 :         delete pItem->module;
     456         397 :         delete pItem;
     457             :     }
     458         229 :     maLookupTable.clear();
     459         229 : }
     460             : 
     461       88128 : oslGenericFunction SAL_CALL lcl_LookupTableHelper::getFunctionSymbolByName(
     462             :         const OUString& localeName, const sal_Char* pFunction,
     463             :         LocaleDataLookupTableItem** pOutCachedItem )
     464             : {
     465       88128 :     OUString aFallback;
     466       88128 :     bool bFallback = (localeName.indexOf( cUnder) < 0);
     467       88128 :     if (bFallback)
     468             :     {
     469        1535 :         Locale aLocale;
     470        1535 :         aLocale.Language = localeName;
     471        3070 :         Locale aFbLocale = MsLangId::getFallbackLocale( aLocale);
     472        1535 :         if (aFbLocale == aLocale)
     473         569 :             bFallback = false;  // may be a "language-only-locale" like Interlingua (ia)
     474             :         else
     475        2501 :             aFallback = LocaleDataImpl::getFirstLocaleServiceName( aFbLocale);
     476             :     }
     477             : 
     478     4393815 :     for ( sal_Int16 i = 0; i < nbOfLocales; i++)
     479             :     {
     480     4481835 :         if (localeName.equalsAscii(aLibTable[i].pLocale) ||
     481      109434 :                 (bFallback && aFallback.equalsAscii(aLibTable[i].pLocale)))
     482             :         {
     483             : #ifndef DISABLE_DYNLOADING
     484             :             OUStringBuffer aBuf(sal::static_int_cast<int>(
     485       88074 :                         strlen(aLibTable[i].pLocale) + 1 + strlen(pFunction)));
     486             :             {
     487       88074 :                 ::osl::MutexGuard aGuard( maMutex );
     488      164675 :                 for (size_t l = 0; l < maLookupTable.size(); l++)
     489             :                 {
     490      164278 :                     LocaleDataLookupTableItem* pCurrent = maLookupTable[l];
     491      164278 :                     if (pCurrent->dllName == aLibTable[i].pLib)
     492             :                     {
     493             :                         OSL_ASSERT( pOutCachedItem );
     494       87677 :                         if( pOutCachedItem )
     495             :                         {
     496       87677 :                             (*pOutCachedItem) = new LocaleDataLookupTableItem( *pCurrent );
     497       87677 :                             (*pOutCachedItem)->localeName = aLibTable[i].pLocale;
     498             :                             return (*pOutCachedItem)->module->getFunctionSymbol(
     499       87677 :                                     aBuf.appendAscii( pFunction).append( cUnder).
     500      175354 :                                     appendAscii( (*pOutCachedItem)->localeName).makeStringAndClear());
     501             :                         }
     502             :                         else
     503           0 :                             return NULL;
     504             :                     }
     505         397 :                 }
     506             :             }
     507             :             // Library not loaded, load it and add it to the list.
     508             : #ifdef SAL_DLLPREFIX
     509         397 :             aBuf.ensureCapacity(strlen(aLibTable[i].pLib) + 6);    // mostly "lib*.so"
     510         397 :             aBuf.appendAscii( SAL_DLLPREFIX ).appendAscii(aLibTable[i].pLib).appendAscii( SAL_DLLEXTENSION );
     511             : #else
     512             :             aBuf.ensureCapacity(strlen(aLibTable[i].pLib) + 4);    // mostly "*.dll"
     513             :             aBuf.appendAscii(aLibTable[i].pLib).appendAscii( SAL_DLLEXTENSION );
     514             : #endif
     515         397 :             osl::Module *module = new osl::Module();
     516         397 :             if ( module->loadRelative(&thisModule, aBuf.makeStringAndClear()) )
     517             :             {
     518         397 :                 ::osl::MutexGuard aGuard( maMutex );
     519         397 :                 LocaleDataLookupTableItem* pNewItem = new LocaleDataLookupTableItem(aLibTable[i].pLib, module, aLibTable[i].pLocale);
     520         397 :                 maLookupTable.push_back(pNewItem);
     521             :                 OSL_ASSERT( pOutCachedItem );
     522         397 :                 if( pOutCachedItem )
     523             :                 {
     524         397 :                     (*pOutCachedItem) = new LocaleDataLookupTableItem( *pNewItem );
     525             :                     return module->getFunctionSymbol(
     526         397 :                             aBuf.appendAscii(pFunction).append(cUnder).
     527         794 :                             appendAscii((*pOutCachedItem)->localeName).makeStringAndClear());
     528             :                 }
     529             :                 else
     530           0 :                     return NULL;
     531             :             }
     532             :             else
     533           0 :                 delete module;
     534             : #else
     535             :             (void) pOutCachedItem;
     536             : 
     537             :             if( strcmp(pFunction, "getAllCalendars") == 0 )
     538             :                 return aLibTable[i].getAllCalendars;
     539             :             else if( strcmp(pFunction, "getAllCurrencies") == 0 )
     540             :                 return aLibTable[i].getAllCurrencies;
     541             :             else if( strcmp(pFunction, "getAllFormats0") == 0 )
     542             :                 return aLibTable[i].getAllFormats0;
     543             :             else if( strcmp(pFunction, "getBreakIteratorRules") == 0 )
     544             :                 return aLibTable[i].getBreakIteratorRules;
     545             :             else if( strcmp(pFunction, "getCollationOptions") == 0 )
     546             :                 return aLibTable[i].getCollationOptions;
     547             :             else if( strcmp(pFunction, "getCollatorImplementation") == 0 )
     548             :                 return aLibTable[i].getCollatorImplementation;
     549             :             else if( strcmp(pFunction, "getContinuousNumberingLevels") == 0 )
     550             :                 return aLibTable[i].getContinuousNumberingLevels;
     551             :             else if( strcmp(pFunction, "getDateAcceptancePatterns") == 0 )
     552             :                 return aLibTable[i].getDateAcceptancePatterns;
     553             :             else if( strcmp(pFunction, "getFollowPageWords") == 0 )
     554             :                 return aLibTable[i].getFollowPageWords;
     555             :             else if( strcmp(pFunction, "getForbiddenCharacters") == 0 )
     556             :                 return aLibTable[i].getForbiddenCharacters;
     557             :             else if( strcmp(pFunction, "getIndexAlgorithm") == 0 )
     558             :                 return aLibTable[i].getIndexAlgorithm;
     559             :             else if( strcmp(pFunction, "getLCInfo") == 0 )
     560             :                 return aLibTable[i].getLCInfo;
     561             :             else if( strcmp(pFunction, "getLocaleItem") == 0 )
     562             :                 return aLibTable[i].getLocaleItem;
     563             :             else if( strcmp(pFunction, "getOutlineNumberingLevels") == 0 )
     564             :                 return aLibTable[i].getOutlineNumberingLevels;
     565             :             else if( strcmp(pFunction, "getReservedWords") == 0 )
     566             :                 return aLibTable[i].getReservedWords;
     567             :             else if( strcmp(pFunction, "getSearchOptions") == 0 )
     568             :                 return aLibTable[i].getSearchOptions;
     569             :             else if( strcmp(pFunction, "getTransliterations") == 0 )
     570             :                 return aLibTable[i].getTransliterations;
     571             :             else if( strcmp(pFunction, "getUnicodeScripts") == 0 )
     572             :                 return aLibTable[i].getUnicodeScripts;
     573             :             else if( strcmp(pFunction, "getAllFormats1") == 0 )
     574             :                 return aLibTable[i].getAllFormats1;
     575             : #endif
     576             :         }
     577             :     }
     578          54 :     return NULL;
     579             : }
     580             : 
     581             : } // anonymous namespace
     582             : 
     583             : 
     584             : // REF values equal offsets of counts within getAllCalendars() data structure!
     585             : #define REF_DAYS         0
     586             : #define REF_MONTHS       1
     587             : #define REF_GMONTHS      2
     588             : #define REF_PMONTHS      3
     589             : #define REF_ERAS         4
     590             : #define REF_OFFSET_COUNT 5
     591             : 
     592          16 : Sequence< CalendarItem2 > &LocaleDataImpl::getCalendarItemByName(const OUString& name,
     593             :         const Locale& rLocale, const Sequence< Calendar2 >& calendarsSeq, sal_Int16 item)
     594             :         throw(RuntimeException)
     595             : {
     596          16 :     if (!ref_name.equals(name)) {
     597          16 :         OUString aLocStr, id;
     598           8 :         sal_Int32 nLastUnder = name.lastIndexOf( cUnder);
     599             :         SAL_WARN_IF( nLastUnder < 1, "i18npool",
     600             :                 "LocaleDataImpl::getCalendarItemByName - no '_' or first in name can't be right: " << name);
     601           8 :         if (nLastUnder >= 0)
     602             :         {
     603           8 :             aLocStr = name.copy( 0, nLastUnder);
     604           8 :             if (nLastUnder + 1 < name.getLength())
     605           8 :                 id = name.copy( nLastUnder + 1);
     606             :         }
     607          16 :         Locale loc( LanguageTag::convertToLocale( aLocStr.replace( cUnder, cHyphen)));
     608          16 :         Sequence < Calendar2 > cals;
     609           8 :         if (loc == rLocale) {
     610           0 :             cals = calendarsSeq;
     611             :         } else {
     612           8 :             cals = getAllCalendars2(loc);
     613             :         }
     614             :         sal_Int32 index;
     615           8 :         for (index = 0; index < cals.getLength(); index++) {
     616           8 :             if (id.equals(cals[index].Name)) {
     617           8 :                 ref_cal = cals[index];
     618           8 :                 break;
     619             :             }
     620             :         }
     621             :         // Referred locale not found, return name for en_US locale.
     622           8 :         if (index == cals.getLength()) {
     623           0 :             cals = getAllCalendars2(
     624           0 :                     Locale(OUString("en"), OUString("US"), OUString()));
     625           0 :             if (cals.getLength() > 0)
     626           0 :                 ref_cal = cals[0];
     627             :             else
     628           0 :                 throw RuntimeException();
     629             :         }
     630          16 :         ref_name = name;
     631             :     }
     632          16 :     switch (item)
     633             :     {
     634             :         case REF_DAYS:
     635          16 :             return ref_cal.Days;
     636             :         case REF_MONTHS:
     637           0 :             return ref_cal.Months;
     638             :         case REF_GMONTHS:
     639           0 :             return ref_cal.GenitiveMonths;
     640             :         case REF_PMONTHS:
     641           0 :             return ref_cal.PartitiveMonths;
     642             :         default:
     643             :             OSL_FAIL( "LocaleDataImpl::getCalendarItemByName: unhandled REF_* case");
     644             :             // fallthru
     645             :         case REF_ERAS:
     646           0 :             return ref_cal.Eras;
     647             :     }
     648             : }
     649             : 
     650             : 
     651       14900 : Sequence< CalendarItem2 > LocaleDataImpl::getCalendarItems(
     652             :         sal_Unicode const * const * const allCalendars, sal_Int16 & rnOffset,
     653             :         const sal_Int16 nWhichItem, const sal_Int16 nCalendar,
     654             :         const Locale & rLocale, const Sequence< Calendar2 > & calendarsSeq )
     655             :         throw(RuntimeException)
     656             : {
     657       14900 :     Sequence< CalendarItem2 > aItems;
     658       14900 :     if ( OUString( allCalendars[rnOffset] ) == "ref" )
     659             :     {
     660          16 :         aItems = getCalendarItemByName( OUString( allCalendars[rnOffset+1]), rLocale, calendarsSeq, nWhichItem);
     661          16 :         rnOffset += 2;
     662             :     }
     663             :     else
     664             :     {
     665       14884 :         sal_Int32 nSize = allCalendars[nWhichItem][nCalendar];
     666       14884 :         aItems.realloc( nSize);
     667       14884 :         CalendarItem2* pItem = aItems.getArray();
     668       14884 :         switch (nWhichItem)
     669             :         {
     670             :             case REF_DAYS:
     671             :             case REF_MONTHS:
     672             :             case REF_GMONTHS:
     673             :             case REF_PMONTHS:
     674      144312 :                 for (sal_Int32 j = 0; j < nSize; ++j, ++pItem)
     675             :                 {
     676      264816 :                     CalendarItem2 item( allCalendars[rnOffset], allCalendars[rnOffset+1],
     677      397224 :                             allCalendars[rnOffset+2], allCalendars[rnOffset+3]);
     678      132408 :                     *pItem = item;
     679      132408 :                     rnOffset += 4;
     680      132408 :                 }
     681       11904 :                 break;
     682             :             case REF_ERAS:
     683             :                 // Absent narrow name.
     684        8940 :                 for (sal_Int32 j = 0; j < nSize; ++j, ++pItem)
     685             :                 {
     686       11920 :                     CalendarItem2 item( allCalendars[rnOffset], allCalendars[rnOffset+1],
     687       17880 :                             allCalendars[rnOffset+2], OUString());
     688        5960 :                     *pItem = item;
     689        5960 :                     rnOffset += 3;
     690        5960 :                 }
     691        2980 :                 break;
     692             :             default:
     693             :                 OSL_FAIL( "LocaleDataImpl::getCalendarItems: unhandled REF_* case");
     694             :         }
     695             :     }
     696       14900 :     return aItems;
     697             : }
     698             : 
     699             : 
     700             : Sequence< Calendar2 > SAL_CALL
     701        1502 : LocaleDataImpl::getAllCalendars2( const Locale& rLocale ) throw(RuntimeException, std::exception)
     702             : {
     703             : 
     704        1502 :     sal_Unicode const * const * allCalendars = NULL;
     705             : 
     706        1502 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getAllCalendars" ));
     707             : 
     708        1502 :     if ( func ) {
     709        1502 :         sal_Int16 calendarsCount = 0;
     710        1502 :         allCalendars = func(calendarsCount);
     711             : 
     712        1502 :         Sequence< Calendar2 > calendarsSeq(calendarsCount);
     713        1502 :         sal_Int16 offset = REF_OFFSET_COUNT;
     714        4482 :         for(sal_Int16 i = 0; i < calendarsCount; i++) {
     715        2980 :             OUString calendarID(allCalendars[offset]);
     716        2980 :             offset++;
     717        2980 :             bool defaultCalendar = allCalendars[offset][0] != 0;
     718        2980 :             offset++;
     719             :             Sequence< CalendarItem2 > days = getCalendarItems( allCalendars, offset, REF_DAYS, i,
     720        5960 :                     rLocale, calendarsSeq);
     721             :             Sequence< CalendarItem2 > months = getCalendarItems( allCalendars, offset, REF_MONTHS, i,
     722        5960 :                     rLocale, calendarsSeq);
     723             :             Sequence< CalendarItem2 > gmonths = getCalendarItems( allCalendars, offset, REF_GMONTHS, i,
     724        5960 :                     rLocale, calendarsSeq);
     725             :             Sequence< CalendarItem2 > pmonths = getCalendarItems( allCalendars, offset, REF_PMONTHS, i,
     726        5960 :                     rLocale, calendarsSeq);
     727             :             Sequence< CalendarItem2 > eras = getCalendarItems( allCalendars, offset, REF_ERAS, i,
     728        5960 :                     rLocale, calendarsSeq);
     729        5960 :             OUString startOfWeekDay(allCalendars[offset]);
     730        2980 :             offset++;
     731        2980 :             sal_Int16 minimalDaysInFirstWeek = allCalendars[offset][0];
     732        2980 :             offset++;
     733             :             Calendar2 aCalendar(days, months, gmonths, pmonths, eras, startOfWeekDay,
     734        5960 :                     minimalDaysInFirstWeek, defaultCalendar, calendarID);
     735        2980 :             calendarsSeq[i] = aCalendar;
     736        2980 :         }
     737        1502 :         return calendarsSeq;
     738             :     }
     739             :     else {
     740           0 :         Sequence< Calendar2 > seq1(0);
     741           0 :         return seq1;
     742             :     }
     743             : }
     744             : 
     745             : 
     746             : Sequence< Calendar > SAL_CALL
     747           0 : LocaleDataImpl::getAllCalendars( const Locale& rLocale ) throw(RuntimeException, std::exception)
     748             : {
     749           0 :     const Sequence< Calendar2 > aCal2( getAllCalendars2( rLocale));
     750           0 :     sal_Int32 nLen = aCal2.getLength();
     751           0 :     Sequence< Calendar > aCal1( nLen);
     752           0 :     const Calendar2* p2 = aCal2.getConstArray();
     753           0 :     Calendar* p1 = aCal1.getArray();
     754           0 :     for (sal_Int32 i=0; i < nLen; ++i, ++p1, ++p2)
     755             :     {
     756           0 :         *p1 = downcastCalendar( *p2);
     757             :     }
     758           0 :     return aCal1;
     759             : }
     760             : 
     761             : 
     762             : Sequence< Currency2 > SAL_CALL
     763       37387 : LocaleDataImpl::getAllCurrencies2( const Locale& rLocale ) throw(RuntimeException, std::exception)
     764             : {
     765       37387 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getAllCurrencies" ));
     766             : 
     767       37387 :     if ( func ) {
     768       37387 :         sal_Int16 currencyCount = 0;
     769       37387 :         sal_Unicode **allCurrencies = func(currencyCount);
     770             : 
     771       37387 :         Sequence< Currency2 > seq(currencyCount);
     772       83605 :         for(int i = 0, nOff = 0; i < currencyCount; i++, nOff += 8 ) {
     773             :             Currency2 cur(
     774       46218 :                     allCurrencies[nOff],        // string ID
     775       46218 :                     allCurrencies[nOff+1],      // string Symbol
     776       46218 :                     allCurrencies[nOff+2],      // string BankSymbol
     777       46218 :                     allCurrencies[nOff+3],      // string Name
     778       46218 :                     allCurrencies[nOff+4][0] != 0, // boolean Default
     779       46218 :                     allCurrencies[nOff+5][0] != 0, // boolean UsedInCompatibleFormatCodes
     780       46218 :                     allCurrencies[nOff+6][0],   // short DecimalPlaces
     781       46218 :                     allCurrencies[nOff+7][0] != 0 // boolean LegacyOnly
     782      369744 :                     );
     783       46218 :             seq[i] = cur;
     784       46218 :         }
     785       37387 :         return seq;
     786             :     }
     787             :     else {
     788           0 :         Sequence< Currency2 > seq1(0);
     789           0 :         return seq1;
     790             :     }
     791             : }
     792             : 
     793             : 
     794             : Sequence< Currency > SAL_CALL
     795           0 : LocaleDataImpl::getAllCurrencies( const Locale& rLocale ) throw(RuntimeException, std::exception)
     796             : {
     797           0 :     Sequence< Currency2 > aCur2( getAllCurrencies2( rLocale));
     798           0 :     sal_Int32 nLen = aCur2.getLength();
     799           0 :     Sequence< Currency > aCur1( nLen);
     800           0 :     const Currency2* p2 = aCur2.getArray();
     801           0 :     Currency* p1 = aCur1.getArray();
     802           0 :     for (sal_Int32 i=0; i < nLen; ++i, ++p1, ++p2)
     803             :     {
     804           0 :         *p1 = *p2;
     805             :     }
     806           0 :     return aCur1;
     807             : }
     808             : 
     809             : 
     810             : // return a static (!) string resulting from replacing all occurrences of
     811             : // 'oldStr' string in 'formatCode' string with 'newStr' string
     812     1785426 : static const sal_Unicode * replace( sal_Unicode const * const formatCode, sal_Unicode const * const oldStr, sal_Unicode const * const newStr)
     813             : {
     814             :     // make reasonable assumption of maximum length of formatCode.
     815             : #define MAX_FORMATCODE_LENTH 512
     816             :     static sal_Unicode str[MAX_FORMATCODE_LENTH];
     817             : 
     818     1785426 :     if (oldStr[0] == 0) // no replacement requires
     819      339826 :         return formatCode;
     820             : 
     821     1445600 :     sal_Int32 i = 0, k = 0;
     822    18815467 :     while (formatCode[i] > 0 && k < MAX_FORMATCODE_LENTH) {
     823    15924267 :         sal_Int32 j = 0, last = k;
     824             :         // search oldStr in formatCode
     825    35753344 :         while (formatCode[i] > 0 && oldStr[j] > 0 && k < MAX_FORMATCODE_LENTH) {
     826    19454785 :             str[k++] = formatCode[i];
     827    19454785 :             if (formatCode[i++] != oldStr[j++])
     828    15549975 :                 break;
     829             :         }
     830    15924267 :         if (oldStr[j] == 0) {
     831             :             // matched string found, do replacement
     832      374292 :             k = last; j = 0;
     833     3841866 :             while (newStr[j] > 0 && k < MAX_FORMATCODE_LENTH)
     834     3093282 :                 str[k++] = newStr[j++];
     835             :         }
     836             :     }
     837     1445600 :     if (k >= MAX_FORMATCODE_LENTH) // could not complete replacement, return original formatCode
     838           0 :         return formatCode;
     839             : 
     840     1445600 :     str[k] = 0;
     841     1445600 :     return str;
     842             : }
     843             : 
     844             : Sequence< FormatElement > SAL_CALL
     845       31490 : LocaleDataImpl::getAllFormats( const Locale& rLocale ) throw(RuntimeException, std::exception)
     846             : {
     847       31490 :     const int SECTIONS = 2;
     848             :     struct FormatSection
     849             :     {
     850             :         MyFunc_FormatCode         func;
     851             :         sal_Unicode const        *from;
     852             :         sal_Unicode const        *to;
     853             :         sal_Unicode const *const *formatArray;
     854             :         sal_Int16                 formatCount;
     855             : 
     856       62980 :         FormatSection() : func(0), from(0), to(0), formatArray(0), formatCount(0) {}
     857       62980 :         sal_Int16 getFunc( LocaleDataImpl& rLocaleData, const Locale& rL, const char* pName )
     858             :         {
     859       62980 :             func = reinterpret_cast<MyFunc_FormatCode>( rLocaleData.getFunctionSymbol( rL, pName));
     860       62980 :             if (func)
     861       52149 :                 formatArray = func( formatCount, from, to);
     862       62980 :             return formatCount;
     863             :         }
     864       31490 :     } section[SECTIONS];
     865             : 
     866             :     sal_Int32 formatCount;
     867       31490 :     formatCount  = section[0].getFunc( *this, rLocale, "getAllFormats0");
     868       31490 :     formatCount += section[1].getFunc( *this, rLocale, "getAllFormats1");
     869             : 
     870       31490 :     Sequence< FormatElement > seq(formatCount);
     871       31490 :     sal_Int32 f = 0;
     872       94470 :     for (int s = 0; s < SECTIONS; ++s)
     873             :     {
     874       62980 :         sal_Unicode const * const * const formatArray = section[s].formatArray;
     875       62980 :         if ( formatArray )
     876             :         {
     877     1837575 :             for (int i = 0, nOff = 0; i < section[s].formatCount; ++i, nOff += 7, ++f)
     878             :             {
     879             :                 FormatElement elem(
     880     1785426 :                         replace( formatArray[nOff], section[s].from, section[s].to),
     881     1785426 :                         formatArray[nOff + 1],
     882     1785426 :                         formatArray[nOff + 2],
     883     1785426 :                         formatArray[nOff + 3],
     884     1785426 :                         formatArray[nOff + 4],
     885     1785426 :                         formatArray[nOff + 5][0],
     886    12497982 :                         formatArray[nOff + 6][0] != 0);
     887     1785426 :                 seq[f] = elem;
     888     1785426 :             }
     889             :         }
     890             :     }
     891       31490 :     return seq;
     892             : }
     893             : 
     894             : 
     895             : Sequence< OUString > SAL_CALL
     896         282 : LocaleDataImpl::getDateAcceptancePatterns( const Locale& rLocale ) throw(RuntimeException, std::exception)
     897             : {
     898         282 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getDateAcceptancePatterns" ));
     899             : 
     900         282 :     if (func)
     901             :     {
     902         282 :         sal_Int16 patternsCount = 0;
     903         282 :         sal_Unicode **patternsArray = func( patternsCount );
     904         282 :         Sequence< OUString > seq( patternsCount );
     905         863 :         for (sal_Int16 i = 0; i < patternsCount; ++i)
     906             :         {
     907         581 :             seq[i] = OUString( patternsArray[i] );
     908             :         }
     909         282 :         return seq;
     910             :     }
     911             :     else
     912             :     {
     913           0 :         Sequence< OUString > seq(0);
     914           0 :         return seq;
     915             :     }
     916             : }
     917             : 
     918             : 
     919             : #define COLLATOR_OFFSET_ALGO    0
     920             : #define COLLATOR_OFFSET_DEFAULT 1
     921             : #define COLLATOR_OFFSET_RULE    2
     922             : #define COLLATOR_ELEMENTS       3
     923             : 
     924             : OUString SAL_CALL
     925          86 : LocaleDataImpl::getCollatorRuleByAlgorithm( const Locale& rLocale, const OUString& algorithm ) throw(RuntimeException)
     926             : {
     927          86 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getCollatorImplementation" ));
     928          86 :     if ( func ) {
     929          86 :         sal_Int16 collatorCount = 0;
     930          86 :         sal_Unicode **collatorArray = func(collatorCount);
     931          86 :         for(sal_Int16 i = 0; i < collatorCount; i++)
     932          86 :             if (algorithm.equals(collatorArray[i * COLLATOR_ELEMENTS + COLLATOR_OFFSET_ALGO]))
     933          86 :                 return OUString(collatorArray[i * COLLATOR_ELEMENTS + COLLATOR_OFFSET_RULE]);
     934             :     }
     935           0 :     return OUString();
     936             : }
     937             : 
     938             : 
     939             : Sequence< Implementation > SAL_CALL
     940          75 : LocaleDataImpl::getCollatorImplementations( const Locale& rLocale ) throw(RuntimeException, std::exception)
     941             : {
     942          75 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getCollatorImplementation" ));
     943             : 
     944          75 :     if ( func ) {
     945          75 :         sal_Int16 collatorCount = 0;
     946          75 :         sal_Unicode **collatorArray = func(collatorCount);
     947          75 :         Sequence< Implementation > seq(collatorCount);
     948         150 :         for(sal_Int16 i = 0; i < collatorCount; i++) {
     949          75 :             Implementation impl(collatorArray[i * COLLATOR_ELEMENTS + COLLATOR_OFFSET_ALGO],
     950         150 :                     collatorArray[i * COLLATOR_ELEMENTS + COLLATOR_OFFSET_DEFAULT][0] != 0);
     951          75 :             seq[i] = impl;
     952          75 :         }
     953          75 :         return seq;
     954             :     }
     955             :     else {
     956           0 :         Sequence< Implementation > seq1(0);
     957           0 :         return seq1;
     958             :     }
     959             : }
     960             : 
     961             : Sequence< OUString > SAL_CALL
     962           0 : LocaleDataImpl::getCollationOptions( const Locale& rLocale ) throw(RuntimeException, std::exception)
     963             : {
     964           0 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getCollationOptions" ));
     965             : 
     966           0 :     if ( func ) {
     967           0 :         sal_Int16 optionsCount = 0;
     968           0 :         sal_Unicode **optionsArray = func(optionsCount);
     969           0 :         Sequence< OUString > seq(optionsCount);
     970           0 :         for(sal_Int16 i = 0; i < optionsCount; i++) {
     971           0 :             seq[i] = OUString( optionsArray[i] );
     972             :         }
     973           0 :         return seq;
     974             :     }
     975             :     else {
     976           0 :         Sequence< OUString > seq1(0);
     977           0 :         return seq1;
     978             :     }
     979             : }
     980             : 
     981             : Sequence< OUString > SAL_CALL
     982           0 : LocaleDataImpl::getSearchOptions( const Locale& rLocale ) throw(RuntimeException, std::exception)
     983             : {
     984           0 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getSearchOptions" ));
     985             : 
     986           0 :     if ( func ) {
     987           0 :         sal_Int16 optionsCount = 0;
     988           0 :         sal_Unicode **optionsArray = func(optionsCount);
     989           0 :         Sequence< OUString > seq(optionsCount);
     990           0 :         for(sal_Int16 i = 0; i < optionsCount; i++) {
     991           0 :             seq[i] = OUString( optionsArray[i] );
     992             :         }
     993           0 :         return seq;
     994             :     }
     995             :     else {
     996           0 :         Sequence< OUString > seq1(0);
     997           0 :         return seq1;
     998             :     }
     999             : }
    1000             : 
    1001             : sal_Unicode ** SAL_CALL
    1002          27 : LocaleDataImpl::getIndexArray(const Locale& rLocale, sal_Int16& indexCount)
    1003             : {
    1004          27 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getIndexAlgorithm" ));
    1005             : 
    1006          27 :     if (func)
    1007          27 :         return func(indexCount);
    1008           0 :     return NULL;
    1009             : }
    1010             : 
    1011             : Sequence< OUString > SAL_CALL
    1012          12 : LocaleDataImpl::getIndexAlgorithm( const Locale& rLocale ) throw(RuntimeException)
    1013             : {
    1014          12 :     sal_Int16 indexCount = 0;
    1015          12 :     sal_Unicode **indexArray = getIndexArray(rLocale, indexCount);
    1016             : 
    1017          12 :     if ( indexArray ) {
    1018          12 :         Sequence< OUString > seq(indexCount);
    1019          24 :         for(sal_Int16 i = 0; i < indexCount; i++) {
    1020          12 :             seq[i] = indexArray[i*5];
    1021             :         }
    1022          12 :         return seq;
    1023             :     }
    1024             :     else {
    1025           0 :         Sequence< OUString > seq1(0);
    1026           0 :         return seq1;
    1027             :     }
    1028             : }
    1029             : 
    1030             : OUString SAL_CALL
    1031           0 : LocaleDataImpl::getDefaultIndexAlgorithm( const Locale& rLocale ) throw(RuntimeException)
    1032             : {
    1033           0 :     sal_Int16 indexCount = 0;
    1034           0 :     sal_Unicode **indexArray = getIndexArray(rLocale, indexCount);
    1035             : 
    1036           0 :     if ( indexArray ) {
    1037           0 :         for(sal_Int16 i = 0; i < indexCount; i++) {
    1038           0 :             if (indexArray[i*5 + 3][0])
    1039           0 :                 return OUString(indexArray[i*5]);
    1040             :         }
    1041             :     }
    1042           0 :     return OUString();
    1043             : }
    1044             : 
    1045             : bool SAL_CALL
    1046           0 : LocaleDataImpl::hasPhonetic( const Locale& rLocale ) throw(RuntimeException)
    1047             : {
    1048           0 :     sal_Int16 indexCount = 0;
    1049           0 :     sal_Unicode **indexArray = getIndexArray(rLocale, indexCount);
    1050             : 
    1051           0 :     if ( indexArray ) {
    1052           0 :         for(sal_Int16 i = 0; i < indexCount; i++) {
    1053           0 :             if (indexArray[i*5 + 4][0])
    1054           0 :                 return true;
    1055             :         }
    1056             :     }
    1057           0 :     return false;
    1058             : }
    1059             : 
    1060             : sal_Unicode ** SAL_CALL
    1061          15 : LocaleDataImpl::getIndexArrayForAlgorithm(const Locale& rLocale, const OUString& algorithm)
    1062             : {
    1063          15 :     sal_Int16 indexCount = 0;
    1064          15 :     sal_Unicode **indexArray = getIndexArray(rLocale, indexCount);
    1065          15 :     if ( indexArray ) {
    1066          15 :         for(sal_Int16 i = 0; i < indexCount; i++) {
    1067          15 :             if (algorithm.equals(indexArray[i*5]))
    1068          15 :                 return indexArray+i*5;
    1069             :         }
    1070             :     }
    1071           0 :     return NULL;
    1072             : }
    1073             : 
    1074             : bool SAL_CALL
    1075           5 : LocaleDataImpl::isPhonetic( const Locale& rLocale, const OUString& algorithm ) throw(RuntimeException)
    1076             : {
    1077           5 :     sal_Unicode **indexArray = getIndexArrayForAlgorithm(rLocale, algorithm);
    1078           5 :     return indexArray && indexArray[4][0];
    1079             : }
    1080             : 
    1081             : OUString SAL_CALL
    1082           5 : LocaleDataImpl::getIndexKeysByAlgorithm( const Locale& rLocale, const OUString& algorithm ) throw(RuntimeException)
    1083             : {
    1084           5 :     sal_Unicode **indexArray = getIndexArrayForAlgorithm(rLocale, algorithm);
    1085           5 :     return indexArray ? "0-9"+OUString(indexArray[2]) : OUString();
    1086             : }
    1087             : 
    1088             : OUString SAL_CALL
    1089           5 : LocaleDataImpl::getIndexModuleByAlgorithm( const Locale& rLocale, const OUString& algorithm ) throw(RuntimeException)
    1090             : {
    1091           5 :     sal_Unicode **indexArray = getIndexArrayForAlgorithm(rLocale, algorithm);
    1092           5 :     return indexArray ? OUString(indexArray[1]) : OUString();
    1093             : }
    1094             : 
    1095             : Sequence< UnicodeScript > SAL_CALL
    1096           5 : LocaleDataImpl::getUnicodeScripts( const Locale& rLocale ) throw(RuntimeException)
    1097             : {
    1098           5 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getUnicodeScripts" ));
    1099             : 
    1100           5 :     if ( func ) {
    1101           5 :         sal_Int16 scriptCount = 0;
    1102           5 :         sal_Unicode **scriptArray = func(scriptCount);
    1103           5 :         Sequence< UnicodeScript > seq(scriptCount);
    1104          15 :         for(sal_Int16 i = 0; i < scriptCount; i++) {
    1105          10 :             seq[i] = UnicodeScript( OUString(scriptArray[i]).toInt32() );
    1106             :         }
    1107           5 :         return seq;
    1108             :     }
    1109             :     else {
    1110           0 :         Sequence< UnicodeScript > seq1(0);
    1111           0 :         return seq1;
    1112             :     }
    1113             : }
    1114             : 
    1115             : Sequence< OUString > SAL_CALL
    1116           0 : LocaleDataImpl::getFollowPageWords( const Locale& rLocale ) throw(RuntimeException)
    1117             : {
    1118           0 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getFollowPageWords" ));
    1119             : 
    1120           0 :     if ( func ) {
    1121           0 :         sal_Int16 wordCount = 0;
    1122           0 :         sal_Unicode **wordArray = func(wordCount);
    1123           0 :         Sequence< OUString > seq(wordCount);
    1124           0 :         for(sal_Int16 i = 0; i < wordCount; i++) {
    1125           0 :             seq[i] = OUString(wordArray[i]);
    1126             :         }
    1127           0 :         return seq;
    1128             :     }
    1129             :     else {
    1130           0 :         Sequence< OUString > seq1(0);
    1131           0 :         return seq1;
    1132             :     }
    1133             : }
    1134             : 
    1135             : Sequence< OUString > SAL_CALL
    1136           0 : LocaleDataImpl::getTransliterations( const Locale& rLocale ) throw(RuntimeException, std::exception)
    1137             : {
    1138           0 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getTransliterations" ));
    1139             : 
    1140           0 :     if ( func ) {
    1141           0 :         sal_Int16 transliterationsCount = 0;
    1142           0 :         sal_Unicode **transliterationsArray = func(transliterationsCount);
    1143             : 
    1144           0 :         Sequence< OUString > seq(transliterationsCount);
    1145           0 :         for(int i = 0; i < transliterationsCount; i++) {
    1146           0 :             OUString  elem(transliterationsArray[i]);
    1147           0 :             seq[i] = elem;
    1148           0 :         }
    1149           0 :         return seq;
    1150             :     }
    1151             :     else {
    1152           0 :         Sequence< OUString > seq1(0);
    1153           0 :         return seq1;
    1154             :     }
    1155             : 
    1156             : 
    1157             : }
    1158             : 
    1159             : 
    1160             : LanguageCountryInfo SAL_CALL
    1161    85402951 : LocaleDataImpl::getLanguageCountryInfo( const Locale& rLocale ) throw(RuntimeException, std::exception)
    1162             : {
    1163    85402951 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getLCInfo" ));
    1164             : 
    1165    85402951 :     if ( func ) {
    1166    85402951 :         sal_Int16 LCInfoCount = 0;
    1167    85402951 :         sal_Unicode **LCInfoArray = func(LCInfoCount);
    1168             :         LanguageCountryInfo info(LCInfoArray[0],
    1169    85402951 :                 LCInfoArray[1],
    1170    85402951 :                 LCInfoArray[2],
    1171    85402951 :                 LCInfoArray[3],
    1172   341611804 :                 LCInfoArray[4]);
    1173    85402951 :         return info;
    1174             :     }
    1175             :     else {
    1176           0 :         LanguageCountryInfo info1;
    1177           0 :         return info1;
    1178             :     }
    1179             : 
    1180             : }
    1181             : 
    1182             : 
    1183             : ForbiddenCharacters SAL_CALL
    1184        3204 : LocaleDataImpl::getForbiddenCharacters( const Locale& rLocale ) throw(RuntimeException, std::exception)
    1185             : {
    1186        3204 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
    1187             : 
    1188        3204 :     if ( func ) {
    1189        3204 :         sal_Int16 LCForbiddenCharactersCount = 0;
    1190        3204 :         sal_Unicode **LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
    1191        3204 :         ForbiddenCharacters chars(LCForbiddenCharactersArray[0], LCForbiddenCharactersArray[1]);
    1192        3204 :         return chars;
    1193             :     }
    1194             :     else {
    1195           0 :         ForbiddenCharacters chars1;
    1196           0 :         return chars1;
    1197             :     }
    1198             : }
    1199             : 
    1200             : OUString SAL_CALL
    1201         603 : LocaleDataImpl::getHangingCharacters( const Locale& rLocale ) throw(RuntimeException)
    1202             : {
    1203         603 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
    1204             : 
    1205         603 :     if ( func ) {
    1206         603 :         sal_Int16 LCForbiddenCharactersCount = 0;
    1207         603 :         sal_Unicode **LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
    1208         603 :         return OUString(LCForbiddenCharactersArray[2]);
    1209             :     }
    1210             : 
    1211           0 :     return OUString();
    1212             : }
    1213             : 
    1214             : Sequence< OUString > SAL_CALL
    1215        5576 : LocaleDataImpl::getBreakIteratorRules( const Locale& rLocale  ) throw(RuntimeException)
    1216             : {
    1217        5576 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getBreakIteratorRules" ));
    1218             : 
    1219        5576 :     if ( func ) {
    1220        5576 :         sal_Int16 LCBreakIteratorRuleCount = 0;
    1221        5576 :         sal_Unicode **LCBreakIteratorRulesArray = func(LCBreakIteratorRuleCount);
    1222        5576 :         Sequence< OUString > seq(LCBreakIteratorRuleCount);
    1223       33456 :         for(int i = 0; i < (LCBreakIteratorRuleCount); i++) {
    1224       27880 :             OUString  elem(LCBreakIteratorRulesArray[i]);
    1225       27880 :             seq[i] = elem;
    1226       27880 :         }
    1227        5576 :         return seq;
    1228             :     }
    1229             :     else {
    1230           0 :         Sequence< OUString > seq1(0);
    1231           0 :         return seq1;
    1232             :     }
    1233             : }
    1234             : 
    1235             : 
    1236             : Sequence< OUString > SAL_CALL
    1237        1122 : LocaleDataImpl::getReservedWord( const Locale& rLocale  ) throw(RuntimeException, std::exception)
    1238             : {
    1239        1122 :     MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getReservedWords" ));
    1240             : 
    1241        1122 :     if ( func ) {
    1242        1122 :         sal_Int16 LCReservedWordsCount = 0;
    1243        1122 :         sal_Unicode **LCReservedWordsArray = func(LCReservedWordsCount);
    1244        1122 :         Sequence< OUString > seq(LCReservedWordsCount);
    1245       14586 :         for(int i = 0; i < (LCReservedWordsCount); i++) {
    1246       13464 :             OUString  elem(LCReservedWordsArray[i]);
    1247       13464 :             seq[i] = elem;
    1248       13464 :         }
    1249        1122 :         return seq;
    1250             :     }
    1251             :     else {
    1252           0 :         Sequence< OUString > seq1(0);
    1253           0 :         return seq1;
    1254             :     }
    1255             : }
    1256             : 
    1257             : 
    1258             : Sequence< Sequence<beans::PropertyValue> > SAL_CALL
    1259           0 : LocaleDataImpl::getContinuousNumberingLevels( const lang::Locale& rLocale ) throw(RuntimeException)
    1260             : {
    1261             :     // load symbol
    1262           0 :     MyFunc_Type2 func = reinterpret_cast<MyFunc_Type2>(getFunctionSymbol( rLocale, "getContinuousNumberingLevels" ));
    1263             : 
    1264           0 :     if ( func )
    1265             :     {
    1266             :         int i;
    1267             :         // invoke function
    1268             :         sal_Int16 nStyles;
    1269             :         sal_Int16 nAttributes;
    1270           0 :         sal_Unicode*** p0 = func( nStyles, nAttributes );
    1271             : 
    1272             :         // allocate memory for nAttributes attributes for each of the nStyles styles.
    1273           0 :         Sequence< Sequence<beans::PropertyValue> > pv( nStyles );
    1274           0 :         for( i=0; i<pv.getLength(); i++ ) {
    1275           0 :             pv[i] = Sequence<beans::PropertyValue>( nAttributes );
    1276             :         }
    1277             : 
    1278           0 :         sal_Unicode*** pStyle = p0;
    1279           0 :         for( i=0;  i<nStyles;  i++ ) {
    1280           0 :             sal_Unicode** pAttribute = pStyle[i];
    1281           0 :             for( int j=0;  j<nAttributes;  j++ ) { // prefix, numberingtype, ...
    1282           0 :                 sal_Unicode* pString = pAttribute[j];
    1283           0 :                 beans::PropertyValue& rVal = pv[i][j];
    1284           0 :                 OUString sVal;
    1285           0 :                 if( pString ) {
    1286           0 :                     if( 0 != j && 2 != j )
    1287           0 :                         sVal = pString;
    1288           0 :                     else if( *pString )
    1289           0 :                         sVal = OUString( pString, 1 );
    1290             :                 }
    1291             : 
    1292           0 :                 switch( j )
    1293             :                 {
    1294             :                     case 0:
    1295           0 :                         rVal.Name = "Prefix";
    1296           0 :                         rVal.Value <<= sVal;
    1297           0 :                         break;
    1298             :                     case 1:
    1299           0 :                         rVal.Name = "NumberingType";
    1300           0 :                         rVal.Value <<= (sal_Int16) sVal.toInt32();
    1301           0 :                         break;
    1302             :                     case 2:
    1303           0 :                         rVal.Name = "Suffix";
    1304           0 :                         rVal.Value <<= sVal;
    1305           0 :                         break;
    1306             :                     case 3:
    1307           0 :                         rVal.Name = "Transliteration";
    1308           0 :                         rVal.Value <<= sVal;
    1309           0 :                         break;
    1310             :                     case 4:
    1311           0 :                         rVal.Name = "NatNum";
    1312           0 :                         rVal.Value <<= (sal_Int16) sVal.toInt32();
    1313           0 :                         break;
    1314             :                     default:
    1315             :                         OSL_ASSERT(false);
    1316             :                 }
    1317           0 :             }
    1318             :         }
    1319           0 :         return pv;
    1320             :     }
    1321             : 
    1322           0 :     Sequence< Sequence<beans::PropertyValue> > seq1(0);
    1323           0 :     return seq1;
    1324             : }
    1325             : 
    1326             : // OutlineNumbering helper class
    1327             : 
    1328             : #include <com/sun/star/container/XIndexAccess.hpp>
    1329             : #include <cppuhelper/implbase1.hxx>
    1330             : 
    1331             : namespace com{ namespace sun{ namespace star{ namespace lang {
    1332             :     struct  Locale;
    1333             : }}}}
    1334             : 
    1335           0 : struct OutlineNumberingLevel_Impl
    1336             : {
    1337             :     OUString        sPrefix;
    1338             :     sal_Int16       nNumType; //com::sun::star::style::NumberingType
    1339             :     OUString        sSuffix;
    1340             :     sal_Unicode     cBulletChar;
    1341             :     OUString        sBulletFontName;
    1342             :     sal_Int16       nParentNumbering;
    1343             :     sal_Int32       nLeftMargin;
    1344             :     sal_Int32       nSymbolTextDistance;
    1345             :     sal_Int32       nFirstLineOffset;
    1346             :     OUString        sTransliteration;
    1347             :     sal_Int32       nNatNum;
    1348             : };
    1349             : 
    1350             : class OutlineNumbering : public cppu::WeakImplHelper1 < container::XIndexAccess >
    1351             : {
    1352             :     // OutlineNumbering helper class
    1353             : 
    1354             :     const OutlineNumberingLevel_Impl* m_pOutlineLevels;
    1355             :     sal_Int16                         m_nCount;
    1356             : public:
    1357             :     OutlineNumbering(const OutlineNumberingLevel_Impl* pOutlineLevels, int nLevels);
    1358             :     virtual ~OutlineNumbering();
    1359             : 
    1360             :     //XIndexAccess
    1361             :     virtual sal_Int32 SAL_CALL getCount(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
    1362             :     virtual Any SAL_CALL getByIndex( sal_Int32 Index )
    1363             :         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
    1364             : 
    1365             :     //XElementAccess
    1366             :     virtual Type SAL_CALL getElementType(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
    1367             :     virtual sal_Bool SAL_CALL hasElements(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
    1368             : };
    1369             : 
    1370             : Sequence< Reference<container::XIndexAccess> > SAL_CALL
    1371           0 : LocaleDataImpl::getOutlineNumberingLevels( const lang::Locale& rLocale ) throw(RuntimeException)
    1372             : {
    1373             :     // load symbol
    1374           0 :     MyFunc_Type3 func = reinterpret_cast<MyFunc_Type3>(getFunctionSymbol( rLocale, "getOutlineNumberingLevels" ));
    1375             : 
    1376           0 :     if ( func )
    1377             :     {
    1378             :         int i;
    1379             :         // invoke function
    1380             :         sal_Int16 nStyles;
    1381             :         sal_Int16 nLevels;
    1382             :         sal_Int16 nAttributes;
    1383           0 :         sal_Unicode**** p0 = func( nStyles, nLevels, nAttributes );
    1384             : 
    1385           0 :         Sequence< Reference<container::XIndexAccess> > aRet( nStyles );
    1386             : 
    1387           0 :         OUString aEmptyStr;
    1388             : 
    1389           0 :         sal_Unicode**** pStyle = p0;
    1390           0 :         for( i=0;  i<nStyles;  i++ )
    1391             :         {
    1392             :             int j;
    1393             : 
    1394           0 :             OutlineNumberingLevel_Impl* level = new OutlineNumberingLevel_Impl[ nLevels+1 ];
    1395           0 :             sal_Unicode*** pLevel = pStyle[i];
    1396           0 :             for( j = 0;  j < nLevels;  j++ )
    1397             :             {
    1398           0 :                 sal_Unicode** pAttribute = pLevel[j];
    1399           0 :                 for( int k=0; k<nAttributes; k++ )
    1400             :                 {
    1401           0 :                     OUString tmp( pAttribute[k] );
    1402           0 :                     switch( k )
    1403             :                     {
    1404           0 :                         case 0: level[j].sPrefix             = tmp;             break;
    1405           0 :                         case 1: level[j].nNumType            = sal::static_int_cast<sal_Int16>(tmp.toInt32()); break;
    1406           0 :                         case 2: level[j].sSuffix             = tmp;             break;
    1407           0 :                         case 3: level[j].cBulletChar         = sal::static_int_cast<sal_Unicode>(tmp.toUInt32(16)); break; // base 16
    1408           0 :                         case 4: level[j].sBulletFontName     = tmp;             break;
    1409           0 :                         case 5: level[j].nParentNumbering    = sal::static_int_cast<sal_Int16>(tmp.toInt32()); break;
    1410           0 :                         case 6: level[j].nLeftMargin         = tmp.toInt32();   break;
    1411           0 :                         case 7: level[j].nSymbolTextDistance = tmp.toInt32();   break;
    1412           0 :                         case 8: level[j].nFirstLineOffset    = tmp.toInt32();   break;
    1413           0 :                         case 9: break;
    1414           0 :                         case 10: level[j].sTransliteration = tmp; break;
    1415           0 :                         case 11: level[j].nNatNum    = tmp.toInt32();   break;
    1416             :                         default:
    1417             :                                  OSL_ASSERT(false);
    1418             :                     }
    1419           0 :                 }
    1420             :             }
    1421           0 :             level[j].sPrefix             = aEmptyStr;
    1422           0 :             level[j].nNumType            = 0;
    1423           0 :             level[j].sSuffix             = aEmptyStr;
    1424           0 :             level[j].cBulletChar         = 0;
    1425           0 :             level[j].sBulletFontName     = aEmptyStr;
    1426           0 :             level[j].nParentNumbering    = 0;
    1427           0 :             level[j].nLeftMargin         = 0;
    1428           0 :             level[j].nSymbolTextDistance = 0;
    1429           0 :             level[j].nFirstLineOffset    = 0;
    1430           0 :             level[j].sTransliteration    = aEmptyStr;
    1431           0 :             level[j].nNatNum             = 0;
    1432           0 :             aRet[i] = new OutlineNumbering( level, nLevels );
    1433             :         }
    1434           0 :         return aRet;
    1435             :     }
    1436             :     else {
    1437           0 :         Sequence< Reference<container::XIndexAccess> > seq1(0);
    1438           0 :         return seq1;
    1439             :     }
    1440             : }
    1441             : 
    1442             : // helper functions
    1443             : 
    1444    85558486 : oslGenericFunction SAL_CALL LocaleDataImpl::getFunctionSymbol( const Locale& rLocale, const sal_Char* pFunction )
    1445             :         throw(RuntimeException)
    1446             : {
    1447    85558486 :     lcl_LookupTableHelper & rLookupTable = lcl_LookupTableStatic::get();
    1448             : 
    1449    85558486 :     OUStringBuffer aBuf(1);
    1450    85558486 :     if (cachedItem.get() && cachedItem->equals(rLocale))
    1451             :     {
    1452    85480947 :         aBuf.ensureCapacity(strlen(pFunction) + 1 + strlen(cachedItem->localeName));
    1453   170961894 :         return cachedItem->module->getFunctionSymbol(aBuf.appendAscii(pFunction).append(cUnder).
    1454   256442841 :                 appendAscii(cachedItem->localeName).makeStringAndClear());
    1455             :     }
    1456             : 
    1457       77539 :     oslGenericFunction pSymbol = 0;
    1458       77539 :     LocaleDataLookupTableItem *pCachedItem = 0;
    1459             : 
    1460             :     // Load function with name <func>_<lang>_<country> or <func>_<bcp47> and
    1461             :     // fallbacks.
    1462             :     pSymbol = rLookupTable.getFunctionSymbolByName( LocaleDataImpl::getFirstLocaleServiceName( rLocale),
    1463       77539 :             pFunction, &pCachedItem);
    1464       77539 :     if (!pSymbol)
    1465             :     {
    1466          54 :         ::std::vector< OUString > aFallbacks( LocaleDataImpl::getFallbackLocaleServiceNames( rLocale));
    1467          54 :         for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it)
    1468             :         {
    1469           0 :             pSymbol = rLookupTable.getFunctionSymbolByName( *it, pFunction, &pCachedItem);
    1470           0 :             if (pSymbol)
    1471           0 :                 break;
    1472          54 :         }
    1473             :     }
    1474       77539 :     if (!pSymbol)
    1475             :     {
    1476             :         // load default function with name <func>_en_US
    1477          54 :         pSymbol = rLookupTable.getFunctionSymbolByName(OUString("en_US"), pFunction, &pCachedItem);
    1478             :     }
    1479             : 
    1480       77539 :     if (!pSymbol)
    1481             :         // Appropriate symbol could not be found.  Give up.
    1482           0 :         throw RuntimeException();
    1483             : 
    1484       77539 :     if (pCachedItem)
    1485       77539 :         cachedItem.reset(pCachedItem);
    1486       77539 :     if (cachedItem.get())
    1487       77539 :         cachedItem->aLocale = rLocale;
    1488             : 
    1489       77539 :     return pSymbol;
    1490             : }
    1491             : 
    1492             : Sequence< Locale > SAL_CALL
    1493          43 : LocaleDataImpl::getAllInstalledLocaleNames() throw(RuntimeException, std::exception)
    1494             : {
    1495          43 :     Sequence< lang::Locale > seq( nbOfLocales );
    1496          43 :     sal_Int16 nInstalled = 0;
    1497             : 
    1498       10578 :     for( sal_Int16 i=0; i<nbOfLocales; i++ ) {
    1499       10535 :         OUString name = OUString::createFromAscii( aLibTable[i].pLocale );
    1500             : 
    1501             :         // Check if the locale is really available and not just in the table,
    1502             :         // don't allow fall backs.
    1503       10535 :         LocaleDataLookupTableItem *pCachedItem = 0;
    1504       10535 :         if (lcl_LookupTableStatic::get().getFunctionSymbolByName( name, "getLocaleItem", &pCachedItem )) {
    1505       10535 :             if( pCachedItem )
    1506       10535 :                 cachedItem.reset( pCachedItem );
    1507       10535 :             seq[nInstalled++] = LanguageTag::convertToLocale( name.replace( cUnder, cHyphen), false);
    1508             :         }
    1509             :         else
    1510             :         {
    1511           0 :             delete pCachedItem;
    1512             :         }
    1513       10535 :     }
    1514          43 :     if ( nInstalled < nbOfLocales )
    1515           0 :         seq.realloc( nInstalled );          // reflect reality
    1516             : 
    1517          43 :     return seq;
    1518             : }
    1519             : 
    1520             : using namespace ::com::sun::star::container;
    1521             : using namespace ::com::sun::star::beans;
    1522             : using namespace ::com::sun::star::style;
    1523             : using namespace ::com::sun::star::text;
    1524             : 
    1525           0 : OutlineNumbering::OutlineNumbering(const OutlineNumberingLevel_Impl* pOutlnLevels, int nLevels) :
    1526             :     m_pOutlineLevels(pOutlnLevels),
    1527           0 :     m_nCount(sal::static_int_cast<sal_Int16>(nLevels))
    1528             : {
    1529           0 : }
    1530             : 
    1531           0 : OutlineNumbering::~OutlineNumbering()
    1532             : {
    1533           0 :     delete [] m_pOutlineLevels;
    1534           0 : }
    1535             : 
    1536           0 : sal_Int32 OutlineNumbering::getCount(  ) throw(RuntimeException, std::exception)
    1537             : {
    1538           0 :     return m_nCount;
    1539             : }
    1540             : 
    1541           0 : Any OutlineNumbering::getByIndex( sal_Int32 nIndex )
    1542             :         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException, std::exception)
    1543             : {
    1544           0 :     if(nIndex < 0 || nIndex >= m_nCount)
    1545           0 :         throw IndexOutOfBoundsException();
    1546           0 :     const OutlineNumberingLevel_Impl* pTemp = m_pOutlineLevels;
    1547           0 :     pTemp += nIndex;
    1548           0 :     Any aRet;
    1549             : 
    1550           0 :     Sequence<PropertyValue> aOutlineNumbering(12);
    1551           0 :     PropertyValue* pValues = aOutlineNumbering.getArray();
    1552           0 :     pValues[0].Name = "Prefix";
    1553           0 :     pValues[0].Value <<= pTemp->sPrefix;
    1554           0 :     pValues[1].Name = "NumberingType";
    1555           0 :     pValues[1].Value <<= pTemp->nNumType;
    1556           0 :     pValues[2].Name = "Suffix";
    1557           0 :     pValues[2].Value <<= pTemp->sSuffix;
    1558           0 :     pValues[3].Name = "BulletChar";
    1559           0 :     pValues[3].Value <<= OUString(&pTemp->cBulletChar, 1);
    1560           0 :     pValues[4].Name = "BulletFontName";
    1561           0 :     pValues[4].Value <<= pTemp->sBulletFontName;
    1562           0 :     pValues[5].Name = "ParentNumbering";
    1563           0 :     pValues[5].Value <<= pTemp->nParentNumbering;
    1564           0 :     pValues[6].Name = "LeftMargin";
    1565           0 :     pValues[6].Value <<= pTemp->nLeftMargin;
    1566           0 :     pValues[7].Name = "SymbolTextDistance";
    1567           0 :     pValues[7].Value <<= pTemp->nSymbolTextDistance;
    1568           0 :     pValues[8].Name = "FirstLineOffset";
    1569           0 :     pValues[8].Value <<= pTemp->nFirstLineOffset;
    1570           0 :     pValues[9].Name = "Adjust";
    1571           0 :     pValues[9].Value <<= (sal_Int16)HoriOrientation::LEFT;
    1572           0 :     pValues[10].Name = "Transliteration";
    1573           0 :     pValues[10].Value <<= pTemp->sTransliteration;
    1574           0 :     pValues[11].Name = "NatNum";
    1575           0 :     pValues[11].Value <<= pTemp->nNatNum;
    1576           0 :     aRet <<= aOutlineNumbering;
    1577           0 :     return aRet;
    1578             : }
    1579             : 
    1580           0 : Type OutlineNumbering::getElementType(  ) throw(RuntimeException, std::exception)
    1581             : {
    1582           0 :     return cppu::UnoType<Sequence<PropertyValue>>::get();
    1583             : }
    1584             : 
    1585           0 : sal_Bool OutlineNumbering::hasElements(  ) throw(RuntimeException, std::exception)
    1586             : {
    1587           0 :     return m_nCount > 0;
    1588             : }
    1589             : 
    1590             : OUString SAL_CALL
    1591           1 : LocaleDataImpl::getImplementationName() throw( RuntimeException, std::exception )
    1592             : {
    1593           1 :     return OUString("com.sun.star.i18n.LocaleDataImpl");
    1594             : }
    1595             : 
    1596           0 : sal_Bool SAL_CALL LocaleDataImpl::supportsService(const OUString& rServiceName)
    1597             :         throw( RuntimeException, std::exception )
    1598             : {
    1599           0 :     return cppu::supportsService(this, rServiceName);
    1600             : }
    1601             : 
    1602             : Sequence< OUString > SAL_CALL
    1603           1 : LocaleDataImpl::getSupportedServiceNames() throw( RuntimeException, std::exception )
    1604             : {
    1605           1 :     Sequence< OUString > aRet(1);
    1606           1 :     aRet[0] = "com.sun.star.i18n.LocaleData";
    1607           1 :     return aRet;
    1608             : }
    1609             : 
    1610             : // static
    1611      116532 : OUString LocaleDataImpl::getFirstLocaleServiceName( const com::sun::star::lang::Locale & rLocale )
    1612             : {
    1613      116532 :     if (rLocale.Language == I18NLANGTAG_QLT)
    1614         602 :         return rLocale.Variant.replace( cHyphen, cUnder);
    1615      115930 :     else if (!rLocale.Country.isEmpty())
    1616      114521 :         return rLocale.Language + "_" + rLocale.Country;
    1617             :     else
    1618        1409 :         return rLocale.Language;
    1619             : }
    1620             : 
    1621             : // static
    1622       38081 : ::std::vector< OUString > LocaleDataImpl::getFallbackLocaleServiceNames( const com::sun::star::lang::Locale & rLocale )
    1623             : {
    1624       38081 :     ::std::vector< OUString > aVec;
    1625       38081 :     if (rLocale.Language == I18NLANGTAG_QLT)
    1626             :     {
    1627           0 :         aVec = LanguageTag( rLocale).getFallbackStrings( false);
    1628           0 :         for (::std::vector< OUString >::iterator it(aVec.begin()); it != aVec.end(); ++it)
    1629             :         {
    1630           0 :             *it = (*it).replace( cHyphen, cUnder);
    1631             :         }
    1632             :     }
    1633       38081 :     else if (!rLocale.Country.isEmpty())
    1634             :     {
    1635       37981 :         aVec.push_back( rLocale.Language);
    1636             :     }
    1637             :     // else nothing, language-only was the first
    1638       38081 :     return aVec;
    1639             : }
    1640             : 
    1641             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1642       59818 : com_sun_star_i18n_LocaleDataImpl_get_implementation(
    1643             :     css::uno::XComponentContext *,
    1644             :     css::uno::Sequence<css::uno::Any> const &)
    1645             : {
    1646       59818 :     return cppu::acquire(new LocaleDataImpl());
    1647         705 : }
    1648             : 
    1649             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11