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: */
|