|
1 /* |
|
2 * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Contains the source for all locale related functionalities |
|
15 * |
|
16 * |
|
17 */ |
|
18 |
|
19 |
|
20 #include <stdlib.h> |
|
21 #include <f32file.h> |
|
22 #include "localeinfo.h" |
|
23 #include "sysif.h" |
|
24 #include <e32std_private.h> |
|
25 #include <e32ldr_private.h> |
|
26 |
|
27 typedef void (*TLibFn)(TLocale*); |
|
28 |
|
29 #if (defined(__SYMBIAN32__) && (defined(__WINSCW__) || defined(__WINS__))) |
|
30 #include "libc_wsd_defs.h" |
|
31 #include "localetlsinfo.h" |
|
32 #else |
|
33 |
|
34 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
35 #define NEW_LANG_VARIANT_DLL_NAME 30 |
|
36 #endif |
|
37 |
|
38 #endif |
|
39 #define LC_TIME_MEMORY 1024 |
|
40 #define LC_MONETARY_MEMORY 50 |
|
41 #define LC_NUMERIC_MEMORY 20 |
|
42 #define MONTHS 12 |
|
43 #define WEEKDAYS 7 |
|
44 #define DECIMAL_THOUSAND_DATE_TIME_SEPARATOR 2 |
|
45 #define EURO_CURRENCY 4 |
|
46 #define LOCALE_LENGTH 50 |
|
47 #define CHARACTER_SET_NAME 32 |
|
48 #define TIME_FORMAT_LENGTH 32 |
|
49 #define NON_UNICODE_TEXT_BUFFER_LENGTH 256 |
|
50 #define LANG_VARIANT_DLL_NAME 10 |
|
51 |
|
52 #define MONTH_STR "%m" |
|
53 #define DAY_STR "%d" |
|
54 #define YEAR_STR "%Y" |
|
55 #define TWELVE_HOUR_STR "%I" |
|
56 #define TWENTY_FOUR_HOUR_STR "%H" |
|
57 #define MINUTE_STR "%M" |
|
58 #define SECOND_STR "%S" |
|
59 #define AMPM_SPACE " %p" |
|
60 #define AMPM_NO_SPACE "%p" |
|
61 |
|
62 |
|
63 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
64 |
|
65 |
|
66 _LIT(KLanDllName, "elocl_lan."); |
|
67 _LIT(KRegDllName, "elocl_reg."); |
|
68 _LIT(KColDllName, "elocl_col."); |
|
69 |
|
70 #endif |
|
71 |
|
72 _LIT(KDllName, "elocl"); |
|
73 |
|
74 |
|
75 #ifndef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
76 _LIT(KEuro, "\x20AC"); |
|
77 #endif |
|
78 |
|
79 _LIT8(KAMPMSpace12hr, "B"); |
|
80 _LIT8(KAMPMSpace, "A"); |
|
81 _LIT8(KAMPMNoSpace12hr, "*B"); |
|
82 _LIT8(KAMPMNoSpace, "*A"); |
|
83 |
|
84 #ifndef EMULATOR |
|
85 |
|
86 CLocale* CLocale::iNewLocale = NULL; |
|
87 lc_monetary_T* CLocale::iMonetary_locale = NULL; |
|
88 lc_numeric_T* CLocale::iNumeric_locale =NULL; |
|
89 lc_time_T* CLocale::iTime_locale = NULL; |
|
90 |
|
91 TText8* numericLocale = NULL; |
|
92 TText8* monetaryLocale = NULL; |
|
93 TText8* timeLocale = NULL; |
|
94 |
|
95 static TBuf<LANG_VARIANT_DLL_NAME> DllName; |
|
96 |
|
97 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
98 static TBuf<NEW_LANG_VARIANT_DLL_NAME> ColDllName; |
|
99 #endif |
|
100 |
|
101 #else //EMULATOR |
|
102 |
|
103 #define iNewLocale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(iNewLocale,s)) |
|
104 #define iMonetary_locale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(iMonetary_locale,s)) |
|
105 #define iNumeric_locale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(iNumeric_locale,s)) |
|
106 #define iTime_locale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(iTime_locale,s)) |
|
107 |
|
108 #define numericLocale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(numericLocale,s)) |
|
109 #define monetaryLocale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(monetaryLocale,s)) |
|
110 #define timeLocale ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(timeLocale,s)) |
|
111 |
|
112 #define DllName ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(DllName,s)) |
|
113 |
|
114 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
115 |
|
116 #define ColDllName ((GetGlobals()->localeptr)->GET_WSD_VAR_NAME(ColDllName,s)) |
|
117 #endif |
|
118 |
|
119 #endif //EMULATOR |
|
120 |
|
121 CLocale::CLocale() |
|
122 { |
|
123 iMonetary_locale = NULL; |
|
124 iNumeric_locale = NULL; |
|
125 iTime_locale = NULL; |
|
126 |
|
127 numericLocale = NULL; |
|
128 monetaryLocale = NULL; |
|
129 timeLocale = NULL; |
|
130 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
131 iOldDllPresent = 0; |
|
132 #endif |
|
133 } |
|
134 |
|
135 |
|
136 |
|
137 CLocale* CLocale::New() |
|
138 { |
|
139 CLocale* self = new CLocale(); |
|
140 if(self) |
|
141 { |
|
142 TInt ret=KErrNone; |
|
143 TRAPD(result,ret = self->ConstructL()); |
|
144 if(KErrNone != (result | ret)) |
|
145 { |
|
146 delete self; |
|
147 self = NULL; |
|
148 } |
|
149 } |
|
150 return self; |
|
151 } |
|
152 |
|
153 TInt CLocale::ConstructL() |
|
154 { |
|
155 iMonetary_locale = new lc_monetary_T; |
|
156 if(!iMonetary_locale) |
|
157 { |
|
158 return KErrNoMemory; |
|
159 } |
|
160 iNumeric_locale = new lc_numeric_T; |
|
161 if(!iNumeric_locale) |
|
162 { |
|
163 return KErrNoMemory; |
|
164 } |
|
165 iTime_locale = new (ELeave) lc_time_T; |
|
166 if(!iTime_locale) |
|
167 { |
|
168 return KErrNoMemory; |
|
169 } |
|
170 |
|
171 for(TInt i =0 ; i < MONTHS; i++) |
|
172 { |
|
173 iTime_locale->mon[i] = NULL; |
|
174 iTime_locale->month[i] = NULL; |
|
175 iTime_locale->alt_month[i] = NULL; |
|
176 } |
|
177 |
|
178 |
|
179 for(TInt i =0 ; i < WEEKDAYS; i++) |
|
180 { |
|
181 iTime_locale->wday[i] = NULL; |
|
182 iTime_locale->weekday[i] = NULL; |
|
183 } |
|
184 |
|
185 iTime_locale->X_fmt = NULL; |
|
186 iTime_locale->x_fmt = NULL; |
|
187 iTime_locale->c_fmt = NULL; |
|
188 iTime_locale->am = NULL; |
|
189 iTime_locale->pm = NULL; |
|
190 iTime_locale->date_fmt = NULL; |
|
191 iTime_locale->md_order = NULL; |
|
192 iTime_locale->ampm_fmt = NULL; |
|
193 |
|
194 iMonetary_locale->int_curr_symbol = NULL; |
|
195 iMonetary_locale->currency_symbol = NULL; |
|
196 iMonetary_locale->mon_decimal_point = NULL; |
|
197 iMonetary_locale->mon_thousands_sep = NULL; |
|
198 iMonetary_locale->mon_grouping = NULL; |
|
199 iMonetary_locale->positive_sign = NULL; |
|
200 iMonetary_locale->negative_sign = NULL; |
|
201 iMonetary_locale->int_frac_digits = iMonetary_locale->frac_digits = NULL; |
|
202 iMonetary_locale->p_cs_precedes = iMonetary_locale->int_p_cs_precedes = NULL; |
|
203 iMonetary_locale->p_sep_by_space = iMonetary_locale->int_p_sep_by_space = NULL; |
|
204 iMonetary_locale->n_cs_precedes = iMonetary_locale->int_n_cs_precedes = NULL; |
|
205 iMonetary_locale->n_sep_by_space = iMonetary_locale->int_n_sep_by_space = NULL; |
|
206 iMonetary_locale->p_sign_posn = iMonetary_locale->int_p_sign_posn = NULL; |
|
207 iMonetary_locale->n_sign_posn = iMonetary_locale->int_n_sign_posn = NULL; |
|
208 |
|
209 iNumeric_locale->decimal_point = NULL; |
|
210 iNumeric_locale->thousands_sep = NULL; |
|
211 iNumeric_locale->grouping = NULL; |
|
212 |
|
213 return KErrNone; |
|
214 } |
|
215 |
|
216 CLocale* CLocale::GetInstance() |
|
217 { |
|
218 // Switch to the backend heap |
|
219 RHeap* oldheap = User::SwitchHeap(Backend()->Heap()); |
|
220 |
|
221 if(NULL == iNewLocale) |
|
222 { |
|
223 iNewLocale = New(); |
|
224 } |
|
225 |
|
226 if(numericLocale == NULL ) |
|
227 { |
|
228 numericLocale = new TText8 [LC_NUMERIC_MEMORY]; |
|
229 } |
|
230 |
|
231 if(monetaryLocale == NULL) |
|
232 { |
|
233 monetaryLocale = new TText8[LC_MONETARY_MEMORY]; |
|
234 } |
|
235 |
|
236 if(timeLocale == NULL) |
|
237 { |
|
238 timeLocale = new TText8[LC_TIME_MEMORY]; |
|
239 } |
|
240 |
|
241 |
|
242 |
|
243 //Set back the default user heap |
|
244 User::SwitchHeap(oldheap); |
|
245 return iNewLocale; |
|
246 } |
|
247 |
|
248 |
|
249 void CLocale::DeleteInstance() |
|
250 { |
|
251 // Switch to the backend heap so that deletes happen from there |
|
252 RHeap* oldheap = User::SwitchHeap(Backend()->Heap()); |
|
253 |
|
254 delete [] timeLocale; |
|
255 timeLocale =NULL; |
|
256 |
|
257 delete [] numericLocale; |
|
258 numericLocale = NULL; |
|
259 |
|
260 delete [] monetaryLocale; |
|
261 monetaryLocale = NULL; |
|
262 |
|
263 delete iMonetary_locale; |
|
264 iMonetary_locale = NULL; |
|
265 |
|
266 delete iNumeric_locale; |
|
267 iNumeric_locale = NULL; |
|
268 |
|
269 delete iTime_locale; |
|
270 iTime_locale = NULL; |
|
271 |
|
272 delete iNewLocale; |
|
273 iNewLocale = NULL; |
|
274 |
|
275 |
|
276 |
|
277 //Set back to the default user heap |
|
278 User::SwitchHeap(oldheap); |
|
279 } |
|
280 |
|
281 |
|
282 TText* CLocale::SetLocale(TDesC& aLocale) |
|
283 { |
|
284 //Check whether locale is supported |
|
285 |
|
286 TText* retVal = NULL; |
|
287 TInt r; |
|
288 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
289 |
|
290 // load the new locale dll if not present check for the old dll |
|
291 r = LoadNewLocaleDll( aLocale ); |
|
292 if ( r == KErrNone ) |
|
293 { |
|
294 retVal = (TText*) aLocale.Ptr(); |
|
295 iOldDllPresent = 0; |
|
296 return retVal; |
|
297 } |
|
298 #endif |
|
299 |
|
300 if(!LoadLocale(aLocale)) |
|
301 { |
|
302 return NULL; |
|
303 } |
|
304 RLoader loader; |
|
305 r = loader.Connect(); |
|
306 if(KErrNone == r) |
|
307 { |
|
308 //Load the language variant DLL |
|
309 TInt size = KNumLocaleExports * sizeof(TLibraryFunction); |
|
310 TPtr8 functionListBuf((TUint8*) iData, size, size); |
|
311 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&DllName, &functionListBuf) ); |
|
312 if(KErrNone == r) |
|
313 { |
|
314 ((TLibFn)iData[FnLocaleData])(&iLocale); |
|
315 retVal = (TText*) aLocale.Ptr(); |
|
316 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
317 iOldDllPresent = 1; |
|
318 #endif |
|
319 } |
|
320 loader.Close(); |
|
321 } |
|
322 return retVal; |
|
323 } |
|
324 |
|
325 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
326 |
|
327 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
328 TInt CLocale::GetSystemLocale(TDesC& aLanDllName,TDesC& aRegDllName) |
|
329 { |
|
330 RLoader loader; |
|
331 TInt retVal = -1; |
|
332 TInt r = loader.Connect(); |
|
333 if(KErrNone == r) |
|
334 { |
|
335 TInt size = KNumLocaleExports * sizeof(TLibraryFunction); |
|
336 TPtr8 functionListBuf1((TUint8*) iDataLanguage, size, size); |
|
337 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&aLanDllName, &functionListBuf1) ); |
|
338 if(KErrNone != r) |
|
339 return retVal; |
|
340 TPtr8 functionListBuf2((TUint8*) iDataRegion, size, size); |
|
341 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&aRegDllName, &functionListBuf2) ); |
|
342 ((TLibFn)iDataRegion[FnLocaleDataV2])(&iLocale); |
|
343 if(KErrNone != r) |
|
344 return retVal; |
|
345 retVal = 0; |
|
346 loader.Close(); |
|
347 } |
|
348 return retVal; |
|
349 |
|
350 } |
|
351 #endif |
|
352 //Load the system dll settings |
|
353 TInt CLocale::GetSystemLocale(TDesC& aDllName) |
|
354 { |
|
355 RLoader loader; |
|
356 TInt retVal = -1; |
|
357 TInt r = loader.Connect(); |
|
358 if(KErrNone == r) |
|
359 { |
|
360 //Load the language variant DLL |
|
361 TInt size = KNumLocaleExports * sizeof(TLibraryFunction); |
|
362 TPtr8 functionListBuf((TUint8*) iData, size, size); |
|
363 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&aDllName, &functionListBuf) ); |
|
364 if(KErrNone == r) |
|
365 { |
|
366 ((TLibFn)iData[FnLocaleData])(&iLocale); |
|
367 retVal = 0; |
|
368 } |
|
369 loader.Close(); |
|
370 } |
|
371 return retVal; |
|
372 } |
|
373 |
|
374 #endif |
|
375 |
|
376 |
|
377 TInt CLocale::MonetaryLoadLocaleL(const char* localeName) |
|
378 { |
|
379 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
380 TInt charsetID=-1; |
|
381 if(localeName) |
|
382 { |
|
383 charsetID = GetCharcaterSetIDL(localeName); |
|
384 if(charsetID == -1) |
|
385 { |
|
386 return -1; |
|
387 } |
|
388 } |
|
389 #else |
|
390 TInt charsetID = GetCharcaterSetIDL(localeName); |
|
391 if(charsetID == -1) |
|
392 { |
|
393 return -1; |
|
394 } |
|
395 #endif |
|
396 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
397 else |
|
398 { |
|
399 //update the iLocale with the system locale settings |
|
400 iLocale.Refresh(); |
|
401 } |
|
402 #endif |
|
403 #ifndef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
404 //Retreive monetary information from language variant DLL |
|
405 Mem::Copy(&iLocaleSettings.iCurrencySymbol[0], (const TAny*) iData[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1)); |
|
406 #endif |
|
407 TLocalePos aCurrencySymbolPosition = iLocale.CurrencySymbolPosition(); |
|
408 TLocale::TNegativeCurrencyFormat aNegativeCurrencyFormat = iLocale.NegativeCurrencyFormat(); |
|
409 TBool aCurrencySpaceBetween = iLocale.CurrencySpaceBetween(); |
|
410 TBool aNegativeCurrencySymbolOpposite = iLocale.NegativeCurrencySymbolOpposite(); |
|
411 TBool aNegativeLoseSpace = iLocale.NegativeLoseSpace(); |
|
412 TBool aCurrencyTriadsAllowed = iLocale.CurrencyTriadsAllowed(); |
|
413 |
|
414 TInt currencyDecimalPlaces = iLocale.CurrencyDecimalPlaces(); |
|
415 iThousandsSeparator= iLocale.ThousandsSeparator(); |
|
416 iDecimalSeparator = iLocale.DecimalSeparator(); |
|
417 |
|
418 TText8* temp = monetaryLocale; |
|
419 |
|
420 //Set the decimal separator |
|
421 const TText* dec_point = (const TText*) &iDecimalSeparator; |
|
422 if(dec_point) |
|
423 { |
|
424 const TPtrC dec(dec_point); |
|
425 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> decimal; |
|
426 decimal.Copy(dec); |
|
427 strncpy((char*) monetaryLocale, (char*) decimal.Ptr(), decimal.Length()); |
|
428 monetaryLocale[decimal.Length()] = '\0'; |
|
429 iMonetary_locale->mon_decimal_point = (const char*) monetaryLocale; |
|
430 monetaryLocale += decimal.Length() + 1; |
|
431 } |
|
432 |
|
433 //Set thousand separator |
|
434 const TText* thous_sep = (const TText*) &iThousandsSeparator; |
|
435 if(thous_sep) |
|
436 { |
|
437 const TPtrC thousand(thous_sep); |
|
438 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> thousand_sep; |
|
439 thousand_sep.Copy(thousand); |
|
440 strncpy((char*) monetaryLocale, (char*) thousand_sep.Ptr(), thousand_sep.Length()); |
|
441 monetaryLocale[thousand_sep.Length()] = '\0'; |
|
442 iMonetary_locale->mon_thousands_sep = (const char*) monetaryLocale; |
|
443 monetaryLocale += thousand_sep.Length() + 1; |
|
444 } |
|
445 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
446 TBuf<KMaxCurrencySymbol> CurrencySymbol; |
|
447 if(localeName) |
|
448 { |
|
449 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
450 if( iOldDllPresent ) // old style dll is loaded |
|
451 { |
|
452 Mem::Copy(&iLocaleSettings.iCurrencySymbol[0], (const TAny*) iData[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1)); |
|
453 } |
|
454 else |
|
455 { |
|
456 Mem::Copy(&iLocaleSettings.iCurrencySymbol[0], (const TAny*) iDataRegion[FnCurrencySymbolV2](), sizeof(TText) * (KMaxCurrencySymbol+1)); |
|
457 } |
|
458 #else |
|
459 Mem::Copy(&iLocaleSettings.iCurrencySymbol[0], (const TAny*) iData[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1)); |
|
460 #endif |
|
461 //Set Currency information |
|
462 const TText16* cur = iLocaleSettings.iCurrencySymbol; |
|
463 const TPtrC currency(cur); |
|
464 CurrencySymbol.Copy(currency); |
|
465 } |
|
466 else |
|
467 { |
|
468 TCurrencySymbol cur; |
|
469 const TPtrC currency(cur); |
|
470 CurrencySymbol.Copy(currency); |
|
471 } |
|
472 strncpy((char*) monetaryLocale, (char*) CurrencySymbol.Ptr(), CurrencySymbol.Length()); |
|
473 monetaryLocale[CurrencySymbol.Length()] = '\0'; |
|
474 iMonetary_locale->currency_symbol = (const char*) monetaryLocale; |
|
475 monetaryLocale += strlen((char*) monetaryLocale) + 1; |
|
476 #else |
|
477 //Set Currency information |
|
478 const TText16* currency = iLocaleSettings.iCurrencySymbol; |
|
479 if(currency) |
|
480 { |
|
481 TBuf<EURO_CURRENCY> euroSymbol(currency); |
|
482 char* temp = strchr(localeName, '.'); |
|
483 temp = temp + 1; |
|
484 |
|
485 if(!euroSymbol.Compare(KEuro) && !strcmp(temp, "ISO-8859-1")) |
|
486 { |
|
487 strcpy((char*) monetaryLocale,"\x80"); |
|
488 monetaryLocale[1] = '\0'; |
|
489 } |
|
490 else |
|
491 { |
|
492 ConvertToMultiByteL((TText8*)monetaryLocale, currency, charsetID); |
|
493 } |
|
494 iMonetary_locale->currency_symbol = (const char*) monetaryLocale; |
|
495 monetaryLocale += strlen((char*) monetaryLocale) + 1; |
|
496 } |
|
497 #endif |
|
498 |
|
499 //Set grouping information |
|
500 strcpy((char*) monetaryLocale,(aCurrencyTriadsAllowed? "\003":"")); |
|
501 monetaryLocale[strlen((char*) monetaryLocale)] = '\0'; |
|
502 iMonetary_locale->mon_grouping = (const char*) monetaryLocale; |
|
503 monetaryLocale += strlen((char*) monetaryLocale) + 1; |
|
504 |
|
505 //Set currency decimal places |
|
506 iMonetary_locale->int_frac_digits = iMonetary_locale->frac_digits = (const char*) monetaryLocale; |
|
507 *monetaryLocale++ = currencyDecimalPlaces; |
|
508 *monetaryLocale++ = '\0'; |
|
509 |
|
510 //Set the currency symbol position for a monetary quantity with non-negative value |
|
511 iMonetary_locale->p_cs_precedes = (const char*) monetaryLocale; |
|
512 iMonetary_locale->int_p_cs_precedes = iMonetary_locale->p_cs_precedes; |
|
513 *monetaryLocale++ = (ELocaleBefore == aCurrencySymbolPosition)?1:0; |
|
514 *monetaryLocale++ = '\0'; |
|
515 |
|
516 //Set the currency symbol position for a monetary quantity with negative value |
|
517 iMonetary_locale->n_cs_precedes = (const char*) monetaryLocale; |
|
518 iMonetary_locale->int_n_cs_precedes = iMonetary_locale->n_cs_precedes; |
|
519 *monetaryLocale++ = aNegativeCurrencySymbolOpposite?0:1; |
|
520 *monetaryLocale++ ='\0'; |
|
521 |
|
522 //Set the currency symbol separated by space or not for a monetary quantity with non-negative value |
|
523 iMonetary_locale->p_sep_by_space = (const char*) monetaryLocale; |
|
524 iMonetary_locale->int_p_sep_by_space = iMonetary_locale->p_sep_by_space; |
|
525 *monetaryLocale++ = aCurrencySpaceBetween?1:0; |
|
526 *monetaryLocale++ ='\0'; |
|
527 |
|
528 //Set the currency symbol separated by space or not for a monetary quantity with negative value |
|
529 iMonetary_locale->n_sep_by_space = (const char*) monetaryLocale; |
|
530 iMonetary_locale->int_n_sep_by_space = iMonetary_locale->n_sep_by_space; |
|
531 *monetaryLocale++ = aNegativeLoseSpace?1:0; |
|
532 *monetaryLocale++ = '\0'; |
|
533 |
|
534 //Set the positioning of the negative and positive for a monetary quantity |
|
535 if(TLocale::ELeadingMinusSign == aNegativeCurrencyFormat) |
|
536 { |
|
537 iMonetary_locale->n_sign_posn = (const char*) monetaryLocale; |
|
538 *monetaryLocale++ = 1; |
|
539 *monetaryLocale++ = '\0'; |
|
540 } |
|
541 if(TLocale::EInBrackets == aNegativeCurrencyFormat) |
|
542 { |
|
543 iMonetary_locale->n_sign_posn = (const char*) monetaryLocale; |
|
544 *monetaryLocale++ = 0; |
|
545 *monetaryLocale++ = '\0'; |
|
546 } |
|
547 |
|
548 if(TLocale::ETrailingMinusSign == aNegativeCurrencyFormat) |
|
549 { |
|
550 iMonetary_locale->n_sign_posn = (const char*) monetaryLocale; |
|
551 *monetaryLocale++ = 2; |
|
552 *monetaryLocale++ = '\0'; |
|
553 } |
|
554 |
|
555 if(TLocale::EInterveningMinusSign == aNegativeCurrencyFormat) |
|
556 { |
|
557 iMonetary_locale->n_sign_posn = (const char*) monetaryLocale; |
|
558 *monetaryLocale++ = 3; |
|
559 *monetaryLocale++ = '\0'; |
|
560 } |
|
561 |
|
562 iMonetary_locale->int_n_sign_posn = iMonetary_locale->n_sign_posn; |
|
563 iMonetary_locale->p_sign_posn = iMonetary_locale->int_p_sign_posn = iMonetary_locale->n_sign_posn; |
|
564 //Set the positive sign and negative sign for monetary quantity |
|
565 iMonetary_locale->positive_sign = iMonetary_locale->negative_sign = ""; |
|
566 //Set the internationla currency symbol |
|
567 iMonetary_locale->int_curr_symbol = ""; |
|
568 monetaryLocale = temp; |
|
569 return 0; |
|
570 |
|
571 |
|
572 } |
|
573 /* Forward declaration of ReadALine */ |
|
574 inline TInt ReadALine(RFile& aFile, TInt& aPos, TDes8& aDesc); |
|
575 extern void GetInstallationDataDir(TFileName& aPath); |
|
576 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
577 |
|
578 TInt CLocale::ParseNewLocaleFile( TDesC& aLocale ) |
|
579 { |
|
580 // open and parse the file |
|
581 TPtrC src(aLocale); |
|
582 TBuf8<LOCALE_LENGTH> locale_name; |
|
583 locale_name.Copy(src); |
|
584 char locale[LOCALE_LENGTH]; |
|
585 strncpy(locale, (char*) locale_name.Ptr(), locale_name.Length()); |
|
586 locale[locale_name.Length()] = '\0'; |
|
587 |
|
588 if (NULL == strchr(locale, '.')) |
|
589 { |
|
590 return 0; |
|
591 } |
|
592 RFile newfile; |
|
593 #ifndef __EPOC32__ |
|
594 _LIT(localeFileNew,"\\resource\\openc\\locales_new.txt" ); |
|
595 #else |
|
596 TFileName localeFileNew; |
|
597 GetInstallationDataDir(localeFileNew); |
|
598 localeFileNew.Append(_L("locales_new.txt" )); |
|
599 #endif |
|
600 |
|
601 int retValNew = newfile.Open(Backend()->FileSession(), localeFileNew, EFileRead); |
|
602 if( KErrNone != retValNew ) |
|
603 { |
|
604 return 0; |
|
605 } |
|
606 int pos = 0; |
|
607 TBuf8<LOCALE_LENGTH> localeInfoNew; |
|
608 retValNew = ReadALine(newfile, pos, localeInfoNew); |
|
609 char* buffer = (char*) localeInfoNew.Ptr(); |
|
610 int i = 0; |
|
611 int flag = 0; |
|
612 while( retValNew > 0) |
|
613 { |
|
614 char str1[LOCALE_LENGTH]; |
|
615 while(buffer[i] != '=') |
|
616 { |
|
617 str1[i] = buffer[i]; |
|
618 i++; |
|
619 } |
|
620 str1[i] = '\0'; |
|
621 if(!strcmp(str1,locale)) |
|
622 { |
|
623 flag = 1; |
|
624 break; |
|
625 } |
|
626 i = 0; |
|
627 retValNew = ReadALine(newfile, pos, localeInfoNew); |
|
628 buffer = (char*) localeInfoNew.Ptr(); |
|
629 } |
|
630 if(flag) |
|
631 { |
|
632 |
|
633 iLanDllName.Copy(KLanDllName); |
|
634 iRegDllName.Copy(KRegDllName); |
|
635 ColDllName.Copy(KColDllName); |
|
636 i++; |
|
637 int len = localeInfoNew.Length(); |
|
638 TBuf<50> localeids; |
|
639 while(i < len ) |
|
640 { |
|
641 localeids.Append(buffer[i]); |
|
642 i++; |
|
643 } |
|
644 TLex lex( localeids ); |
|
645 TChar ch; |
|
646 TInt k = 0; |
|
647 TBuf<10> token[3]; |
|
648 while((ch = lex.Get()) != 0 ) |
|
649 { |
|
650 while (ch != ',' && ch != 0 && ch != '\t' && ch != '\n' && ch != '\r') |
|
651 { |
|
652 lex.Inc(); |
|
653 ch = lex.Peek(); |
|
654 } |
|
655 token[k].Copy(lex.MarkedToken()); |
|
656 k++; |
|
657 lex.Inc(); |
|
658 lex.Mark(); |
|
659 } |
|
660 iLanDllName.Append(token[0]); |
|
661 iRegDllName.Append(token[1]); |
|
662 ColDllName.Append(token[2]); |
|
663 newfile.Close(); |
|
664 return 1; |
|
665 |
|
666 } |
|
667 newfile.Close(); |
|
668 return 0; |
|
669 } |
|
670 |
|
671 TInt CLocale::LoadNewLocaleDll( TDesC& aLocale ) |
|
672 { |
|
673 |
|
674 if(!ParseNewLocaleFile( aLocale )) |
|
675 { |
|
676 return -1; |
|
677 } |
|
678 RLoader loader; |
|
679 TInt r = loader.Connect(); |
|
680 if( KErrNone != r) |
|
681 return -1; |
|
682 TInt size = KNumLocaleExports * sizeof(TLibraryFunction); |
|
683 TPtr8 functionListBuf((TUint8*) iDataRegion, size, size ); |
|
684 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&iRegDllName, &functionListBuf) ); |
|
685 if( KErrNone != r) |
|
686 return -1; |
|
687 ((TLibFn)iDataRegion[FnLocaleDataV2])(&iLocale); |
|
688 // language dll loading |
|
689 TPtr8 functionListBuf_lan((TUint8*) iDataLanguage, size, size); |
|
690 r = loader.SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&iLanDllName, &functionListBuf_lan) ); |
|
691 if( KErrNone != r) |
|
692 return -1; |
|
693 |
|
694 return r; |
|
695 |
|
696 } |
|
697 |
|
698 #endif |
|
699 |
|
700 |
|
701 |
|
702 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
703 TInt CLocale::NumericLoadLocale(const char* localeName) |
|
704 #else |
|
705 TInt CLocale::NumericLoadLocale(const char* /*localeName*/) |
|
706 #endif |
|
707 { |
|
708 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
709 if(!localeName) |
|
710 { |
|
711 //update the iLocale with the system settings |
|
712 iLocale.Refresh(); |
|
713 |
|
714 } |
|
715 #endif |
|
716 //Retrive numeric information from language variant DLL |
|
717 TBool aCurrencyTriadsAllowed = iLocale.CurrencyTriadsAllowed(); |
|
718 iThousandsSeparator= iLocale.ThousandsSeparator(); |
|
719 iDecimalSeparator = iLocale.DecimalSeparator(); |
|
720 |
|
721 TText8* temp = numericLocale; |
|
722 //Set the decimal separator |
|
723 const TText* dec_point = (const TText*) &iDecimalSeparator; |
|
724 if(dec_point) |
|
725 { |
|
726 const TPtrC dec(dec_point); |
|
727 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> decimal; |
|
728 decimal.Copy(dec); |
|
729 strncpy((char*) numericLocale, (char*) decimal.Ptr(), decimal.Length()); |
|
730 numericLocale[decimal.Length()] ='\0'; |
|
731 iNumeric_locale->decimal_point = (const char*) numericLocale; |
|
732 numericLocale += decimal.Length() + 1; |
|
733 } |
|
734 |
|
735 //Set thousand separator |
|
736 const TText* thous_sep = (const TText*) &iThousandsSeparator; |
|
737 if(thous_sep) |
|
738 { |
|
739 const TPtrC thousand(thous_sep); |
|
740 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> thousand_sep; |
|
741 thousand_sep.Copy(thousand); |
|
742 strncpy((char*) numericLocale, (char*) thousand_sep.Ptr(), thousand_sep.Length()); |
|
743 numericLocale[thousand_sep.Length()] = '\0'; |
|
744 iNumeric_locale->thousands_sep = (const char*) numericLocale; |
|
745 numericLocale += thousand_sep.Length() + 1; |
|
746 } |
|
747 |
|
748 //Set grouping information |
|
749 strcpy((char*) numericLocale,(aCurrencyTriadsAllowed? "\003":"")); |
|
750 numericLocale[strlen((char*) numericLocale)] = '\0'; |
|
751 iNumeric_locale->grouping = (const char*) numericLocale; |
|
752 numericLocale += strlen((char*) numericLocale) + 1; |
|
753 |
|
754 numericLocale = temp; |
|
755 return 0; |
|
756 |
|
757 } |
|
758 |
|
759 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
760 |
|
761 |
|
762 TInt CLocale::TimeLoadNewLocaleL( const char* localeName ) |
|
763 { |
|
764 TInt charsetID = -1; |
|
765 if( localeName ) |
|
766 { |
|
767 charsetID = GetCharcaterSetIDL(localeName); |
|
768 if(charsetID == -1) |
|
769 { |
|
770 return -1; |
|
771 } |
|
772 } |
|
773 else |
|
774 { |
|
775 //update the iLocale with the system locale settings |
|
776 iLocale.Refresh(); |
|
777 } |
|
778 TText8* startAddress = timeLocale; |
|
779 //Set month and abbreviated month name information |
|
780 for(TInt aMonth = 0 ; aMonth < MONTHS; aMonth++) |
|
781 { |
|
782 |
|
783 const TText16* month = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnMonthTableV2]()))[aMonth]); |
|
784 if(month) |
|
785 { |
|
786 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
787 if(!localeName) |
|
788 { |
|
789 ConvertToMultiByteCustom((TUint8*)timeLocale, month); |
|
790 } |
|
791 else |
|
792 { |
|
793 #endif |
|
794 ConvertToMultiByteL((TUint8*)timeLocale, month, charsetID); |
|
795 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
796 } |
|
797 #endif |
|
798 iTime_locale->month[aMonth] = (const char*) timeLocale; |
|
799 iTime_locale->alt_month[aMonth] = (const char*) timeLocale; |
|
800 timeLocale += strlen((char*) timeLocale) + 1; |
|
801 } |
|
802 const TText16* abbMonth = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnMonthAbbTableV2]()))[aMonth]); |
|
803 if(abbMonth) |
|
804 { |
|
805 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
806 if(!localeName) |
|
807 { |
|
808 ConvertToMultiByteCustom((TUint8*)timeLocale, abbMonth); |
|
809 } |
|
810 else |
|
811 { |
|
812 #endif |
|
813 ConvertToMultiByteL((TUint8*)timeLocale, abbMonth, charsetID); |
|
814 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
815 } |
|
816 #endif |
|
817 iTime_locale->mon[aMonth] = (const char*) timeLocale; |
|
818 timeLocale += strlen((char*) timeLocale) + 1; |
|
819 } |
|
820 |
|
821 } |
|
822 |
|
823 //Set day and abbreviated day name information |
|
824 const TText16* day = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnDayTableV2]()))[6]); |
|
825 if(day) |
|
826 { |
|
827 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
828 if(!localeName) |
|
829 { |
|
830 ConvertToMultiByteCustom((TUint8*)timeLocale, day); |
|
831 } |
|
832 else |
|
833 { |
|
834 #endif |
|
835 ConvertToMultiByteL((TUint8*)timeLocale, day, charsetID); |
|
836 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
837 } |
|
838 #endif |
|
839 iTime_locale->weekday[0] = (const char*) timeLocale; |
|
840 timeLocale += strlen((char*) timeLocale) + 1; |
|
841 } |
|
842 const TText16* abbDay = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnDayAbbTableV2]()))[6]); |
|
843 if(abbDay) |
|
844 { |
|
845 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
846 if(!localeName) |
|
847 { |
|
848 ConvertToMultiByteCustom((TUint8*)timeLocale, abbDay); |
|
849 } |
|
850 else |
|
851 { |
|
852 #endif |
|
853 ConvertToMultiByteL((TUint8*)timeLocale, abbDay, charsetID); |
|
854 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
855 } |
|
856 #endif |
|
857 iTime_locale->wday[0] = (const char*) timeLocale; |
|
858 timeLocale += strlen((char*) timeLocale) + 1; |
|
859 } |
|
860 |
|
861 for(TInt aDay = 0 ; aDay < WEEKDAYS - 1; aDay++) |
|
862 { |
|
863 const TText16* day = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnDayTableV2]()))[aDay]); |
|
864 if(day) |
|
865 { |
|
866 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
867 if(!localeName) |
|
868 { |
|
869 ConvertToMultiByteCustom((TUint8*)timeLocale, day); |
|
870 } |
|
871 else |
|
872 { |
|
873 #endif |
|
874 ConvertToMultiByteL((TUint8*)timeLocale, day, charsetID); |
|
875 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
876 } |
|
877 #endif |
|
878 iTime_locale->weekday[aDay + 1] = (const char*) timeLocale; |
|
879 timeLocale += strlen((char*) timeLocale) + 1; |
|
880 } |
|
881 const TText16* abbDay = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnDayAbbTableV2]()))[aDay]); |
|
882 if(abbDay) |
|
883 { |
|
884 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
885 if(!localeName) |
|
886 { |
|
887 ConvertToMultiByteCustom((TUint8*)timeLocale, abbDay); |
|
888 } |
|
889 else |
|
890 { |
|
891 #endif |
|
892 ConvertToMultiByteL((TUint8*)timeLocale, abbDay, charsetID); |
|
893 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
894 } |
|
895 #endif |
|
896 iTime_locale->wday[aDay + 1] = (const char*) timeLocale; |
|
897 timeLocale += strlen((char*) timeLocale) + 1; |
|
898 } |
|
899 |
|
900 } |
|
901 const TText16* am = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnAmPmTableV2]()))[0]); |
|
902 if(am) |
|
903 { |
|
904 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
905 if(!localeName) |
|
906 { |
|
907 ConvertToMultiByteCustom((TUint8*)timeLocale, am); |
|
908 } |
|
909 else |
|
910 { |
|
911 #endif |
|
912 ConvertToMultiByteL((TUint8*)timeLocale, am, charsetID); |
|
913 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
914 } |
|
915 #endif |
|
916 iTime_locale->am = (const char*) timeLocale; |
|
917 timeLocale += strlen((char*) timeLocale) + 1; |
|
918 } |
|
919 const TText16* pm = ((reinterpret_cast<TText*const*>((const TText*) iDataLanguage[FnAmPmTableV2]()))[1]); |
|
920 if(pm) |
|
921 { |
|
922 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
923 if(!localeName) |
|
924 { |
|
925 ConvertToMultiByteCustom((TUint8*)timeLocale, pm); |
|
926 } |
|
927 else |
|
928 { |
|
929 #endif |
|
930 ConvertToMultiByteL((TUint8*)timeLocale, pm, charsetID); |
|
931 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
932 } |
|
933 #endif |
|
934 iTime_locale->pm = (const char*) timeLocale; |
|
935 timeLocale += strlen((char*) timeLocale) + 1; |
|
936 } |
|
937 |
|
938 Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*) iDataRegion[FnTimeFormatSpecV2](), sizeof(TText) * (KMaxTimeFormatSpec+1)); |
|
939 TText* timeForm = iLocaleTimeDateFormat.iTimeFormatSpec; |
|
940 |
|
941 //Set time format(T_FMT) and am/pm time format(T_FMT_AMPM) string |
|
942 if(timeForm) |
|
943 { |
|
944 const TPtrC time(timeForm); |
|
945 TBuf8<TIME_FORMAT_LENGTH> timeFormat; |
|
946 timeFormat.Copy(time); |
|
947 |
|
948 TChar timeSeparator = iLocale.TimeSeparator(1); |
|
949 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> timeSeparator1; |
|
950 timeSeparator1.Append(timeSeparator); |
|
951 |
|
952 timeSeparator = iLocale.TimeSeparator(2); |
|
953 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> timeSeparator2; |
|
954 timeSeparator2.Append(timeSeparator); |
|
955 |
|
956 TTimeFormat time12hror24hr = iLocale.TimeFormat(); |
|
957 |
|
958 if(KErrNotFound != timeFormat.Locate('J')) |
|
959 { |
|
960 //Check for time format(12/24 hour format) |
|
961 if(time12hror24hr == ETime12) |
|
962 { |
|
963 strcpy((char*) timeLocale,TWELVE_HOUR_STR); |
|
964 } |
|
965 else |
|
966 { |
|
967 strcpy((char*) timeLocale,TWENTY_FOUR_HOUR_STR); |
|
968 } |
|
969 } |
|
970 |
|
971 else if(KErrNotFound != timeFormat.Locate('I')) |
|
972 { |
|
973 strcpy((char*) timeLocale,TWELVE_HOUR_STR); |
|
974 } |
|
975 |
|
976 else if(KErrNotFound != timeFormat.Locate('H')) |
|
977 { |
|
978 strcpy((char*) timeLocale,TWENTY_FOUR_HOUR_STR); |
|
979 } |
|
980 |
|
981 strncat((char*) timeLocale, (char*) timeSeparator1.Ptr(), timeSeparator1.Length()); |
|
982 strcat((char*) timeLocale, MINUTE_STR); |
|
983 strncat((char*) timeLocale, (char*) timeSeparator2.Ptr(), timeSeparator2.Length()); |
|
984 strcat((char*) timeLocale, SECOND_STR); |
|
985 |
|
986 if(time12hror24hr == ETime12) |
|
987 { |
|
988 |
|
989 if((KErrNotFound != timeFormat.Find(KAMPMSpace12hr)) || (KErrNotFound != timeFormat.Find(KAMPMSpace)) ) |
|
990 { |
|
991 if((KErrNotFound != timeFormat.Find(KAMPMNoSpace12hr)) || (KErrNotFound != timeFormat.Find(KAMPMNoSpace))) |
|
992 { |
|
993 strcat((char*) timeLocale, AMPM_NO_SPACE); |
|
994 } |
|
995 else |
|
996 { |
|
997 strcat((char*) timeLocale, AMPM_SPACE); |
|
998 } |
|
999 } |
|
1000 } |
|
1001 |
|
1002 iTime_locale->ampm_fmt = (const char*) timeLocale; |
|
1003 iTime_locale->X_fmt = iTime_locale->ampm_fmt; |
|
1004 timeLocale += strlen((char*) timeLocale) + 1; |
|
1005 } |
|
1006 |
|
1007 TDateFormat aDateFormat = iLocale.DateFormat(); |
|
1008 //Set date fromat string(D_FMT) |
|
1009 TChar dateSeparator = iLocale.DateSeparator(1); |
|
1010 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> dateSeparator1; |
|
1011 dateSeparator1.Append(dateSeparator); |
|
1012 |
|
1013 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> dateSeparator2; |
|
1014 dateSeparator = iLocale.DateSeparator(2); |
|
1015 dateSeparator2.Append(dateSeparator); |
|
1016 |
|
1017 //Americal date formt(mm/dd/YYYY) |
|
1018 if(EDateAmerican == aDateFormat) |
|
1019 { |
|
1020 strcpy((char*) timeLocale, MONTH_STR); |
|
1021 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1022 strcat((char*) timeLocale, DAY_STR); |
|
1023 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1024 strcat((char*) timeLocale, YEAR_STR); |
|
1025 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1026 } |
|
1027 |
|
1028 //European date format(dd/mm/YYYY) |
|
1029 if(EDateEuropean == aDateFormat) |
|
1030 { |
|
1031 strcpy((char*) timeLocale, DAY_STR); |
|
1032 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1033 strcat((char*) timeLocale, MONTH_STR); |
|
1034 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1035 strcat((char*) timeLocale, YEAR_STR); |
|
1036 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1037 } |
|
1038 |
|
1039 //Japanese date format(YYYY/mm/dd) |
|
1040 if(EDateJapanese == aDateFormat) |
|
1041 { |
|
1042 strcpy((char*) timeLocale, YEAR_STR); |
|
1043 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1044 strcat((char*) timeLocale, MONTH_STR); |
|
1045 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1046 strcat((char*) timeLocale, DAY_STR); |
|
1047 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1048 } |
|
1049 |
|
1050 iTime_locale->md_order = iTime_locale->c_fmt = iTime_locale->date_fmt = (const char*) L""; |
|
1051 ; |
|
1052 timeLocale = startAddress; |
|
1053 |
|
1054 |
|
1055 |
|
1056 return 0; |
|
1057 } |
|
1058 #endif |
|
1059 TInt CLocale::TimeLoadLocaleL(const char* localeName) |
|
1060 { |
|
1061 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
1062 |
|
1063 if( ! iOldDllPresent) |
|
1064 { |
|
1065 TInt ret = TimeLoadNewLocaleL( localeName ); // option 2 to load language and region dll both |
|
1066 if( ret == -1 ) |
|
1067 return -1; |
|
1068 return ret; |
|
1069 } |
|
1070 #endif |
|
1071 TText8* startAddress = timeLocale; |
|
1072 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1073 TInt charsetID = -1; |
|
1074 if(localeName) |
|
1075 { |
|
1076 charsetID = GetCharcaterSetIDL(localeName); |
|
1077 if(charsetID == -1) |
|
1078 { |
|
1079 return -1; |
|
1080 } |
|
1081 } |
|
1082 #else |
|
1083 TInt charsetID = GetCharcaterSetIDL(localeName); |
|
1084 if(charsetID == -1) |
|
1085 { |
|
1086 return -1; |
|
1087 } |
|
1088 #endif |
|
1089 |
|
1090 |
|
1091 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1092 else |
|
1093 { |
|
1094 iLocale.Refresh(); |
|
1095 } |
|
1096 #endif |
|
1097 //Set month and abbreviated month name information |
|
1098 for(TInt aMonth = 0 ; aMonth < MONTHS; aMonth++) |
|
1099 { |
|
1100 |
|
1101 const TText16* month = ((reinterpret_cast<TText*const*>((const TText*) iData[FnMonthTable]()))[aMonth]); |
|
1102 if(month) |
|
1103 { |
|
1104 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1105 if(!localeName) |
|
1106 { |
|
1107 ConvertToMultiByteCustom((TUint8*)timeLocale, month); |
|
1108 } |
|
1109 else |
|
1110 { |
|
1111 #endif |
|
1112 ConvertToMultiByteL((TUint8*)timeLocale, month, charsetID); |
|
1113 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1114 } |
|
1115 #endif |
|
1116 iTime_locale->month[aMonth] = (const char*) timeLocale; |
|
1117 iTime_locale->alt_month[aMonth] = (const char*) timeLocale; |
|
1118 timeLocale += strlen((char*) timeLocale) + 1; |
|
1119 } |
|
1120 |
|
1121 const TText16* abbMonth = ((reinterpret_cast<TText*const*>((const TText*) iData[FnMonthAbbTable]()))[aMonth]); |
|
1122 if(abbMonth) |
|
1123 { |
|
1124 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1125 if(!localeName) |
|
1126 { |
|
1127 ConvertToMultiByteCustom((TUint8*)timeLocale, abbMonth); |
|
1128 } |
|
1129 else |
|
1130 { |
|
1131 #endif |
|
1132 ConvertToMultiByteL((TUint8*)timeLocale, abbMonth, charsetID); |
|
1133 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1134 } |
|
1135 #endif |
|
1136 iTime_locale->mon[aMonth] = (const char*) timeLocale; |
|
1137 timeLocale += strlen((char*) timeLocale) + 1; |
|
1138 } |
|
1139 |
|
1140 } |
|
1141 |
|
1142 //Set day and abbreviated day name information |
|
1143 |
|
1144 const TText16* day = ((reinterpret_cast<TText*const*>((const TText*) iData[FnDayTable]()))[6]); |
|
1145 if(day) |
|
1146 { |
|
1147 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1148 if(!localeName) |
|
1149 { |
|
1150 ConvertToMultiByteCustom((TUint8*)timeLocale, day); |
|
1151 } |
|
1152 else |
|
1153 { |
|
1154 #endif |
|
1155 ConvertToMultiByteL((TUint8*)timeLocale, day, charsetID); |
|
1156 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1157 } |
|
1158 #endif |
|
1159 iTime_locale->weekday[0] = (const char*) timeLocale; |
|
1160 timeLocale += strlen((char*) timeLocale) + 1; |
|
1161 } |
|
1162 |
|
1163 |
|
1164 const TText16* abbDay = ((reinterpret_cast<TText*const*>((const TText*) iData[FnDayAbbTable]()))[6]); |
|
1165 if(abbDay) |
|
1166 { |
|
1167 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1168 if(!localeName) |
|
1169 { |
|
1170 ConvertToMultiByteCustom((TUint8*)timeLocale, abbDay); |
|
1171 } |
|
1172 else |
|
1173 { |
|
1174 #endif |
|
1175 |
|
1176 ConvertToMultiByteL((TUint8*)timeLocale, abbDay, charsetID); |
|
1177 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1178 } |
|
1179 #endif |
|
1180 iTime_locale->wday[0] = (const char*) timeLocale; |
|
1181 timeLocale += strlen((char*) timeLocale) + 1; |
|
1182 } |
|
1183 |
|
1184 for(TInt aDay = 0 ; aDay < WEEKDAYS - 1; aDay++) |
|
1185 { |
|
1186 |
|
1187 const TText16* day = ((reinterpret_cast<TText*const*>((const TText*) iData[FnDayTable]()))[aDay]); |
|
1188 if(day) |
|
1189 { |
|
1190 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1191 if(!localeName) |
|
1192 { |
|
1193 ConvertToMultiByteCustom((TUint8*)timeLocale, day); |
|
1194 } |
|
1195 else |
|
1196 { |
|
1197 #endif |
|
1198 ConvertToMultiByteL((TUint8*)timeLocale, day, charsetID); |
|
1199 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1200 } |
|
1201 #endif |
|
1202 iTime_locale->weekday[aDay + 1] = (const char*) timeLocale; |
|
1203 timeLocale += strlen((char*) timeLocale) + 1; |
|
1204 } |
|
1205 |
|
1206 |
|
1207 const TText16* abbDay = ((reinterpret_cast<TText*const*>((const TText*) iData[FnDayAbbTable]()))[aDay]); |
|
1208 if(abbDay) |
|
1209 { |
|
1210 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1211 if(!localeName) |
|
1212 { |
|
1213 ConvertToMultiByteCustom((TUint8*)timeLocale, abbDay); |
|
1214 } |
|
1215 else |
|
1216 { |
|
1217 #endif |
|
1218 ConvertToMultiByteL((TUint8*)timeLocale, abbDay, charsetID); |
|
1219 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1220 } |
|
1221 #endif |
|
1222 iTime_locale->wday[aDay + 1] = (const char*) timeLocale; |
|
1223 timeLocale += strlen((char*) timeLocale) + 1; |
|
1224 } |
|
1225 |
|
1226 } |
|
1227 |
|
1228 //Set AM string |
|
1229 |
|
1230 const TText16* am = ((reinterpret_cast<TText*const*>((const TText*) iData[FnAmPmTable]()))[0]); |
|
1231 if(am) |
|
1232 { |
|
1233 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1234 if(!localeName) |
|
1235 { |
|
1236 ConvertToMultiByteCustom((TUint8*)timeLocale, am); |
|
1237 } |
|
1238 else |
|
1239 { |
|
1240 #endif |
|
1241 ConvertToMultiByteL((TUint8*)timeLocale, am, charsetID); |
|
1242 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1243 } |
|
1244 #endif |
|
1245 iTime_locale->am = (const char*) timeLocale; |
|
1246 timeLocale += strlen((char*) timeLocale) + 1; |
|
1247 } |
|
1248 |
|
1249 //Set PM string |
|
1250 |
|
1251 const TText16* pm = ((reinterpret_cast<TText*const*>((const TText*) iData[FnAmPmTable]()))[1]); |
|
1252 if(pm) |
|
1253 { |
|
1254 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1255 if(!localeName) |
|
1256 { |
|
1257 ConvertToMultiByteCustom((TUint8*)timeLocale, pm); |
|
1258 } |
|
1259 else |
|
1260 { |
|
1261 #endif |
|
1262 ConvertToMultiByteL((TUint8*)timeLocale, pm, charsetID); |
|
1263 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1264 } |
|
1265 #endif |
|
1266 iTime_locale->pm = (const char*) timeLocale; |
|
1267 timeLocale += strlen((char*) timeLocale) + 1; |
|
1268 } |
|
1269 |
|
1270 |
|
1271 Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*) iData[FnTimeFormatSpec](), sizeof(TText) * (KMaxTimeFormatSpec+1)); |
|
1272 TText* timeForm = iLocaleTimeDateFormat.iTimeFormatSpec; |
|
1273 |
|
1274 //Set time format(T_FMT) and am/pm time format(T_FMT_AMPM) string |
|
1275 if(timeForm) |
|
1276 { |
|
1277 const TPtrC time(timeForm); |
|
1278 TBuf8<TIME_FORMAT_LENGTH> timeFormat; |
|
1279 timeFormat.Copy(time); |
|
1280 |
|
1281 TChar timeSeparator = iLocale.TimeSeparator(1); |
|
1282 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> timeSeparator1; |
|
1283 timeSeparator1.Append(timeSeparator); |
|
1284 |
|
1285 timeSeparator = iLocale.TimeSeparator(2); |
|
1286 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> timeSeparator2; |
|
1287 timeSeparator2.Append(timeSeparator); |
|
1288 |
|
1289 TTimeFormat time12hror24hr = iLocale.TimeFormat(); |
|
1290 |
|
1291 if(KErrNotFound != timeFormat.Locate('J')) |
|
1292 { |
|
1293 //Check for time format(12/24 hour format) |
|
1294 if(time12hror24hr == ETime12) |
|
1295 { |
|
1296 strcpy((char*) timeLocale,TWELVE_HOUR_STR); |
|
1297 } |
|
1298 else |
|
1299 { |
|
1300 strcpy((char*) timeLocale,TWENTY_FOUR_HOUR_STR); |
|
1301 } |
|
1302 } |
|
1303 |
|
1304 else if(KErrNotFound != timeFormat.Locate('I')) |
|
1305 { |
|
1306 strcpy((char*) timeLocale,TWELVE_HOUR_STR); |
|
1307 } |
|
1308 |
|
1309 else if(KErrNotFound != timeFormat.Locate('H')) |
|
1310 { |
|
1311 strcpy((char*) timeLocale,TWENTY_FOUR_HOUR_STR); |
|
1312 } |
|
1313 |
|
1314 strncat((char*) timeLocale, (char*) timeSeparator1.Ptr(), timeSeparator1.Length()); |
|
1315 strcat((char*) timeLocale, MINUTE_STR); |
|
1316 strncat((char*) timeLocale, (char*) timeSeparator2.Ptr(), timeSeparator2.Length()); |
|
1317 strcat((char*) timeLocale, SECOND_STR); |
|
1318 |
|
1319 if(time12hror24hr == ETime12) |
|
1320 { |
|
1321 |
|
1322 if((KErrNotFound != timeFormat.Find(KAMPMSpace12hr)) || (KErrNotFound != timeFormat.Find(KAMPMSpace)) ) |
|
1323 { |
|
1324 if((KErrNotFound != timeFormat.Find(KAMPMNoSpace12hr)) || (KErrNotFound != timeFormat.Find(KAMPMNoSpace))) |
|
1325 { |
|
1326 strcat((char*) timeLocale, AMPM_NO_SPACE); |
|
1327 } |
|
1328 else |
|
1329 { |
|
1330 strcat((char*) timeLocale, AMPM_SPACE); |
|
1331 } |
|
1332 } |
|
1333 } |
|
1334 |
|
1335 iTime_locale->ampm_fmt = (const char*) timeLocale; |
|
1336 iTime_locale->X_fmt = iTime_locale->ampm_fmt; |
|
1337 timeLocale += strlen((char*) timeLocale) + 1; |
|
1338 } |
|
1339 |
|
1340 TDateFormat aDateFormat = iLocale.DateFormat(); |
|
1341 //Set date fromat string(D_FMT) |
|
1342 TChar dateSeparator = iLocale.DateSeparator(1); |
|
1343 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> dateSeparator1; |
|
1344 dateSeparator1.Append(dateSeparator); |
|
1345 |
|
1346 TBuf8<DECIMAL_THOUSAND_DATE_TIME_SEPARATOR> dateSeparator2; |
|
1347 dateSeparator = iLocale.DateSeparator(2); |
|
1348 dateSeparator2.Append(dateSeparator); |
|
1349 |
|
1350 //Americal date formt(mm/dd/YYYY) |
|
1351 if(EDateAmerican == aDateFormat) |
|
1352 { |
|
1353 strcpy((char*) timeLocale, MONTH_STR); |
|
1354 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1355 strcat((char*) timeLocale, DAY_STR); |
|
1356 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1357 strcat((char*) timeLocale, YEAR_STR); |
|
1358 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1359 } |
|
1360 |
|
1361 //European date format(dd/mm/YYYY) |
|
1362 if(EDateEuropean == aDateFormat) |
|
1363 { |
|
1364 strcpy((char*) timeLocale, DAY_STR); |
|
1365 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1366 strcat((char*) timeLocale, MONTH_STR); |
|
1367 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1368 strcat((char*) timeLocale, YEAR_STR); |
|
1369 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1370 } |
|
1371 |
|
1372 //Japanese date format(YYYY/mm/dd) |
|
1373 if(EDateJapanese == aDateFormat) |
|
1374 { |
|
1375 strcpy((char*) timeLocale, YEAR_STR); |
|
1376 strncat((char*) timeLocale, (char*) dateSeparator1.Ptr(), dateSeparator1.Length()); |
|
1377 strcat((char*) timeLocale, MONTH_STR); |
|
1378 strncat((char*) timeLocale, (char*) dateSeparator2.Ptr(), dateSeparator2.Length()); |
|
1379 strcat((char*) timeLocale, DAY_STR); |
|
1380 iTime_locale->x_fmt = (const char*) timeLocale; |
|
1381 } |
|
1382 |
|
1383 iTime_locale->md_order = iTime_locale->c_fmt = iTime_locale->date_fmt = (const char*) L""; |
|
1384 ; |
|
1385 timeLocale = startAddress; |
|
1386 return 0; |
|
1387 |
|
1388 } |
|
1389 |
|
1390 struct lc_numeric_T* CLocale::GetCurrentNumericLocale(void) |
|
1391 { |
|
1392 |
|
1393 if(NULL != iNumeric_locale) |
|
1394 { |
|
1395 return iNumeric_locale; |
|
1396 } |
|
1397 return NULL; |
|
1398 |
|
1399 } |
|
1400 |
|
1401 struct lc_monetary_T* CLocale::GetCurrentMonetaryLocale(void) |
|
1402 { |
|
1403 if(NULL != iMonetary_locale) |
|
1404 { |
|
1405 return iMonetary_locale; |
|
1406 } |
|
1407 return NULL; |
|
1408 } |
|
1409 |
|
1410 struct lc_time_T* CLocale::GetCurrentTimeLocale(void) |
|
1411 { |
|
1412 if(NULL != iTime_locale) |
|
1413 { |
|
1414 return iTime_locale; |
|
1415 } |
|
1416 |
|
1417 return NULL; |
|
1418 } |
|
1419 |
|
1420 |
|
1421 TInt CLocale::LoadLocale(TDesC& aLocale) |
|
1422 { |
|
1423 TPtrC src(aLocale); |
|
1424 TBuf8<LOCALE_LENGTH> locale_name; |
|
1425 locale_name.Copy(src); |
|
1426 char locale[LOCALE_LENGTH]; |
|
1427 strncpy(locale, (char*) locale_name.Ptr(), locale_name.Length()); |
|
1428 locale[locale_name.Length()] = '\0'; |
|
1429 |
|
1430 if (NULL == strchr(locale, '.')) |
|
1431 { |
|
1432 return 0; |
|
1433 } |
|
1434 |
|
1435 // Open the file locale mapping(mapping of POSIX locale string to language variant DLL number) file |
|
1436 RFile file; |
|
1437 |
|
1438 #ifndef __EPOC32__ |
|
1439 _LIT(localeFile, "\\resource\\openc\\locales.txt"); |
|
1440 #else |
|
1441 TFileName localeFile; |
|
1442 GetInstallationDataDir(localeFile); |
|
1443 localeFile.Append(_L("locales.txt")); |
|
1444 #endif //__EPOC32__ |
|
1445 |
|
1446 int retVal = file.Open(Backend()->FileSession(), localeFile, EFileRead); |
|
1447 if(KErrNone != retVal) |
|
1448 { |
|
1449 return 0; |
|
1450 } |
|
1451 |
|
1452 int pos = 0; |
|
1453 TBuf8<LOCALE_LENGTH> localeInfo; |
|
1454 retVal = ReadALine(file, pos, localeInfo); |
|
1455 char* buffer = (char*) localeInfo.Ptr(); |
|
1456 |
|
1457 //Check whether locale is supported or not |
|
1458 int i = 0; |
|
1459 int flag = 0; |
|
1460 while( retVal > 0) |
|
1461 { |
|
1462 char str[LOCALE_LENGTH]; |
|
1463 while(buffer[i] != '=') |
|
1464 { |
|
1465 str[i] = buffer[i]; |
|
1466 i++; |
|
1467 } |
|
1468 str[i] = '\0'; |
|
1469 if(!strcmp(str,locale)) |
|
1470 { |
|
1471 flag = 1; |
|
1472 break; |
|
1473 } |
|
1474 i = 0; |
|
1475 retVal = ReadALine(file, pos, localeInfo); |
|
1476 buffer = (char*) localeInfo.Ptr(); |
|
1477 } |
|
1478 if(flag) |
|
1479 { |
|
1480 DllName.Copy(KDllName); |
|
1481 DllName.Append('.'); |
|
1482 i++; |
|
1483 int len = localeInfo.Length(); |
|
1484 while(i < len) |
|
1485 { |
|
1486 DllName.Append(buffer[i]); |
|
1487 i++; |
|
1488 } |
|
1489 file.Close(); |
|
1490 return 1; |
|
1491 } |
|
1492 |
|
1493 file.Close(); |
|
1494 return 0; |
|
1495 |
|
1496 } |
|
1497 |
|
1498 |
|
1499 TInt CLocale::ConvertToMultiByteL(TUint8* aNarrowCharString, const TText16* aWideCharString, TInt aCharsetUID) |
|
1500 { |
|
1501 //Create a handle to a file server session and connect to the file server. |
|
1502 //Push it on to cleanup stack |
|
1503 RFs fileSession; |
|
1504 User::LeaveIfError(fileSession.Connect()); |
|
1505 CleanupClosePushL(fileSession); |
|
1506 |
|
1507 //Allocate and constructs a CCnvCharacterSetConverter object |
|
1508 CCnvCharacterSetConverter* conv = CCnvCharacterSetConverter::NewLC(); |
|
1509 |
|
1510 //Search the character set array containing all of the character sets for which conversion is available |
|
1511 CCnvCharacterSetConverter::TAvailability avail = conv->PrepareToConvertToOrFromL(aCharsetUID, fileSession); |
|
1512 if(CCnvCharacterSetConverter::ENotAvailable == avail) |
|
1513 { |
|
1514 CleanupStack::PopAndDestroy(2); |
|
1515 *aNarrowCharString = '\0'; |
|
1516 return -1; |
|
1517 } |
|
1518 |
|
1519 const TPtrC16 unicodeText(aWideCharString); |
|
1520 TBuf8<NON_UNICODE_TEXT_BUFFER_LENGTH> nativeText; |
|
1521 |
|
1522 TInt retVal = KErrNone; |
|
1523 TInt aNumberOfUnconvertibleCharacters = 0; |
|
1524 TInt aIndexOfFirstByteOfFirstUnconvertibleCharacter = 0; |
|
1525 |
|
1526 //Convert text encoded in the Unicode character set (UCS-2) into other character sets |
|
1527 retVal = conv->ConvertFromUnicode(nativeText,unicodeText, aNumberOfUnconvertibleCharacters, aIndexOfFirstByteOfFirstUnconvertibleCharacter); |
|
1528 TInt returnCode = 0; |
|
1529 //Check for illegal characters in the input |
|
1530 if(retVal == CCnvCharacterSetConverter::EErrorIllFormedInput) |
|
1531 { |
|
1532 *aNarrowCharString = '\0'; |
|
1533 returnCode = -1; |
|
1534 } |
|
1535 |
|
1536 //Check for incomplete characters in the input, set the errno accordingly |
|
1537 else if(aNumberOfUnconvertibleCharacters) |
|
1538 { |
|
1539 *aNarrowCharString = '\0'; |
|
1540 returnCode = -1; |
|
1541 } |
|
1542 else |
|
1543 { |
|
1544 strncpy((char*) aNarrowCharString, (char*) nativeText.Ptr(), nativeText.Length()); |
|
1545 aNarrowCharString[nativeText.Length()] = '\0'; |
|
1546 returnCode = 0; |
|
1547 } |
|
1548 CleanupStack::PopAndDestroy(2); // conv, fileSession |
|
1549 return returnCode; |
|
1550 |
|
1551 } |
|
1552 |
|
1553 TInt CLocale::GetCharcaterSetIDL(const char* aLocaleName) |
|
1554 { |
|
1555 //extract the charcate set name from locale string |
|
1556 char* temp = strchr(aLocaleName, '.'); |
|
1557 char locale[LOCALE_LENGTH]; |
|
1558 if(NULL == temp) |
|
1559 { |
|
1560 return -1; |
|
1561 } |
|
1562 temp++; |
|
1563 int j= 0; |
|
1564 while((*temp != '@') && *temp != '\0') |
|
1565 { |
|
1566 locale[j++] = *temp++; |
|
1567 } |
|
1568 locale[j++] = '\0'; |
|
1569 |
|
1570 //Create a handle to a file server session and connect to the file server. |
|
1571 //Push it on to cleanup stack |
|
1572 RFs fileSession; |
|
1573 User::LeaveIfError(fileSession.Connect()); |
|
1574 CleanupClosePushL(fileSession); |
|
1575 |
|
1576 TInt characterSetUID = 0; |
|
1577 |
|
1578 //Allocate and constructs a CCnvCharacterSetConverter object |
|
1579 CCnvCharacterSetConverter* conv = CCnvCharacterSetConverter::NewLC() ; |
|
1580 |
|
1581 //Create an array identifying all the character sets for which conversion is available |
|
1582 CArrayFix<CCnvCharacterSetConverter::SCharacterSet> *charSet = CCnvCharacterSetConverter::CreateArrayOfCharacterSetsAvailableL(fileSession); |
|
1583 CleanupStack::PushL( charSet ); |
|
1584 |
|
1585 TInt i = 0; |
|
1586 //Get the number of character sets for which conversion is available |
|
1587 TInt count = charSet->Count(); |
|
1588 while(i < count) |
|
1589 { |
|
1590 CCnvCharacterSetConverter::SCharacterSet characterSet = charSet->At(i); |
|
1591 i++; |
|
1592 //Get the UID of character set for which conversion is available |
|
1593 TUint charSetUID = characterSet.Identifier(); |
|
1594 |
|
1595 const TBufC<CHARACTER_SET_NAME> charSetName = characterSet.NameIsFileName()?TParsePtrC(characterSet.Name()).Name():characterSet.Name(); |
|
1596 TBuf8<CHARACTER_SET_NAME> aCharSetname; |
|
1597 aCharSetname.Copy(charSetName); |
|
1598 |
|
1599 //Assign the character set UID |
|
1600 if(!aCharSetname.Compare(TPtrC8((const TText8*) locale))) |
|
1601 { |
|
1602 characterSetUID = charSetUID; |
|
1603 break; |
|
1604 } |
|
1605 |
|
1606 HBufC8* stdInterName = conv->ConvertCharacterSetIdentifierToStandardNameL(charSetUID, fileSession); |
|
1607 if(NULL != stdInterName) |
|
1608 { |
|
1609 if(!stdInterName->Compare(TPtrC8((const TText8*) locale))) |
|
1610 { |
|
1611 characterSetUID = charSetUID; |
|
1612 delete stdInterName; |
|
1613 stdInterName = NULL; |
|
1614 break; |
|
1615 } |
|
1616 delete stdInterName; |
|
1617 stdInterName = NULL; |
|
1618 } |
|
1619 } |
|
1620 |
|
1621 if(!characterSetUID) |
|
1622 { |
|
1623 characterSetUID = -1; |
|
1624 } |
|
1625 |
|
1626 CleanupStack::PopAndDestroy(3); //charSet, conv, fileSession |
|
1627 return characterSetUID; |
|
1628 } |
|
1629 |
|
1630 /* ReadALine : Reads one line at a time from specified file */ |
|
1631 inline TInt ReadALine(RFile& aFile, TInt& aPos, TDes8& aDesc) |
|
1632 { |
|
1633 TInt ret = aFile.Read(aPos, aDesc); |
|
1634 TChar delimOne = '\r'; |
|
1635 TChar delimTwo = '\n'; |
|
1636 |
|
1637 TInt len = aDesc.Length(); |
|
1638 if(!ret && len) |
|
1639 { |
|
1640 //Always assumes that each line will end with "\r\n" except the last line |
|
1641 TInt pos = aDesc.Locate(delimOne); |
|
1642 pos = aDesc.Locate(delimTwo); |
|
1643 |
|
1644 if(KErrNotFound != pos) |
|
1645 { |
|
1646 aPos = aPos + pos + 1; |
|
1647 len = pos - 1; |
|
1648 aDesc.SetLength(len); |
|
1649 } |
|
1650 else |
|
1651 { |
|
1652 aPos = aPos + len; |
|
1653 } |
|
1654 } |
|
1655 return len; |
|
1656 } |
|
1657 #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1658 |
|
1659 void CLocale::ConvertToMultiByteCustom(TUint8* aNarrowCharString, const TText16* aWideCharString) |
|
1660 { |
|
1661 const TPtrC unicodeText(aWideCharString); |
|
1662 TBuf8<NON_UNICODE_TEXT_BUFFER_LENGTH> nativeText; |
|
1663 nativeText.Copy(unicodeText); |
|
1664 strncpy((char*) aNarrowCharString, (char*) nativeText.Ptr(), nativeText.Length()); |
|
1665 aNarrowCharString[nativeText.Length()] = '\0'; |
|
1666 } |
|
1667 |
|
1668 TInt CLocale::SyncLocale(TLocaleAspect aspect) |
|
1669 { |
|
1670 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
1671 TBuf<NON_UNICODE_TEXT_BUFFER_LENGTH> reg_dllname; |
|
1672 #endif |
|
1673 TBuf<NON_UNICODE_TEXT_BUFFER_LENGTH> Kdname; |
|
1674 TExtendedLocale locale; |
|
1675 locale.LoadSystemSettings(); |
|
1676 locale.GetLocaleDllName(aspect,Kdname); |
|
1677 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
1678 // check if the new dlls is present then load it or go for old dll |
|
1679 if( Kdname.Find(_L("elocl.")) == KErrNotFound ) |
|
1680 { |
|
1681 iOldDllPresent = 0; |
|
1682 locale.GetLocaleDllName(ELocaleTimeDateSettings,reg_dllname); |
|
1683 return (GetSystemLocale(Kdname,reg_dllname )); |
|
1684 } |
|
1685 else |
|
1686 iOldDllPresent = 1; |
|
1687 #endif |
|
1688 return (GetSystemLocale(Kdname)); |
|
1689 } |
|
1690 |
|
1691 const TText* CLocale::GetLocaleName(void) |
|
1692 { |
|
1693 TPtrC dllname(DllName); |
|
1694 return dllname.Ptr(); |
|
1695 } |
|
1696 |
|
1697 |
|
1698 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL |
|
1699 |
|
1700 const TText* CLocale::GetCollateLocaleName(void) |
|
1701 { |
|
1702 TPtrC dllname(ColDllName); |
|
1703 return dllname.Ptr(); |
|
1704 } |
|
1705 #endif |
|
1706 |
|
1707 |
|
1708 #endif // SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT |
|
1709 |
|
1710 |
|
1711 |
|
1712 |