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

Generated by: LCOV version 1.10