LCOV - code coverage report
Current view: top level - i18npool/source/localedata - localedata.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 669 0.0 %
Date: 2014-04-14 Functions: 0 66 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10