source: trunk/src/kernel32/lang.cpp@ 6511

Last change on this file since 6511 was 6511, checked in by sandervl, 24 years ago

minor updates

File size: 27.9 KB
Line 
1/* $Id: lang.cpp,v 1.37 2001-08-10 19:32:30 sandervl Exp $ */
2/*
3 * Win32 language API functions for OS/2
4 *
5 * Copyright 1998 Sander van Leeuwen
6 * Copyright 1998 Patrick Haller
7 * Copyright 1999 Przemyslaw Dobrowolski
8 *
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13#include <os2win.h>
14#include <winnls.h>
15#include <stdlib.h>
16#include <stdio.h>
17#include <string.h>
18#include <odinwrap.h>
19#include <heapstring.h>
20#include <win\winreg.h>
21#include <winos2def.h>
22#include "unicode.h"
23#include "oslibmisc.h"
24#include <wprocess.h>
25#include <uniconv.h>
26
27#define DBG_LOCALLOG DBG_lang
28#include "dbglocal.h"
29
30ODINDEBUGCHANNEL(KERNEL32-LANG)
31
32static ULONG defaultLanguage = 0;
33//******************************************************************************
34//******************************************************************************
35ULONG GetLanguageId()
36{
37 if(defaultLanguage == 0) {
38 switch(OSLibQueryCountry()) {
39 case CC_USA:
40 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
41 break;
42 case CC_CANADA:
43 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
44 break;
45 case CC_LATIN_AMERICA:
46 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
47 break;
48 case CC_GREECE:
49 defaultLanguage = MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
50 break;
51 case CC_NETHERLANDS:
52 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
53 break;
54 case CC_BELGIUM:
55 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN);
56 break;
57 case CC_FRANCE:
58 defaultLanguage = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
59 break;
60 case CC_SPAIN:
61 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
62 break;
63 case CC_ITALY:
64 defaultLanguage = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
65 break;
66 case CC_SWITZERLAND:
67 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
68 break;
69 case CC_AUSTRIA:
70 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
71 break;
72 case CC_UNITED_KINGDOM:
73 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
74 break;
75 case CC_DENMARK:
76 defaultLanguage = MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
77 break;
78 case CC_SWEDEN:
79 defaultLanguage = MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
80 break;
81 case CC_NORWAY:
82 defaultLanguage = MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
83 break;
84 case CC_WEST_GERMANY:
85 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
86 break;
87 case CC_MEXICO:
88 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
89 break;
90 case CC_BRAZIL:
91 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
92 break;
93 case CC_AUSTRALIA:
94 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
95 break;
96 case CC_NEW_ZEALAND:
97 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
98 break;
99 case CC_JAPAN:
100 defaultLanguage = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
101 break;
102 case CC_KOREA:
103 defaultLanguage = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
104 break;
105 case CC_CHINA:
106 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
107 break;
108 case CC_TAIWAN:
109 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
110 break;
111 case CC_TURKEY:
112 defaultLanguage = MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
113 break;
114 case CC_PORTUGAL:
115 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
116 break;
117 case CC_LUXEMBOURG:
118 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
119 break;
120 case CC_ICELAND:
121 defaultLanguage = MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
122 break;
123 case CC_FINLAND:
124 defaultLanguage = MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
125 break;
126 case CC_CZECH_REPUBLIC:
127 defaultLanguage = MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
128 break;
129 case CC_SLOVAK_REPUBLIC:
130 defaultLanguage = MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
131 break;
132 case CC_POLAND:
133 defaultLanguage = MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT);
134 break;
135 default:
136 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
137 break;
138 }
139 }
140 return defaultLanguage;
141}
142//******************************************************************************
143//******************************************************************************
144LCID WIN32API GetUserDefaultLCID(void)
145{
146 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
147 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
148}
149//******************************************************************************
150//******************************************************************************
151LCID WIN32API GetSystemDefaultLCID(void)
152{
153 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", GetUserDefaultLCID()));
154 return GetUserDefaultLCID();
155}
156//******************************************************************************
157//******************************************************************************
158LANGID WIN32API GetUserDefaultLangID()
159{
160 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
161 return(GetLanguageId());
162}
163//******************************************************************************
164//******************************************************************************
165LANGID WIN32API GetSystemDefaultLangID(void)
166{
167 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", GetUserDefaultLangID()));
168 return GetUserDefaultLangID();
169}
170
171//******************************************************************************
172//******************************************************************************
173static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
174{
175 if (wbuf)
176 {
177 if (*pLen > UniStrlen(lpUniStr))
178 UniStrcpy(wbuf,lpUniStr);
179 else
180 {
181 SetLastError(ERROR_INSUFFICIENT_BUFFER);
182 *pLen=0;
183 return FALSE;
184 }
185 }
186
187 *pLen=UniStrlen(lpUniStr)+1; // + null terminator
188
189 return TRUE;
190}
191//******************************************************************************
192//******************************************************************************
193static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
194{
195 if (wbuf)
196 {
197// if (*pLen >= sizeof(WCHAR))
198 if (*pLen >= 2)
199 {
200 wbuf[0]=(WCHAR)'0'+wcUniChar;
201 wbuf[1]=0;
202 }
203 else
204 {
205 SetLastError(ERROR_INSUFFICIENT_BUFFER);
206 *pLen=0;
207 return FALSE;
208 }
209 }
210
211 *pLen=2;
212
213 return TRUE;
214}
215
216/*****************************************************************************
217 * Name : DWORD GetLocaleInfoW
218 * Purpose : The GetLocaleInfoW function returns specific locale information
219 * Parameters: LCID lcid locale identifier
220 * LCTYPE LCType type of information
221 * LPSTRW wbuf address of buffer for information
222 * int len size of buffer
223 * Variables :
224 * Result : size of target buffer
225 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
226 *
227 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
228 * LOCALE_IMEASURE - return '0' like English US
229 * LOCALE_INEGNUMBER - return '1' like English US
230 * LOCALE_ICURRDIGITS - return '2' like English US
231 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
232 * LOCALE_SGROUPING and
233 * LOCALE_SMONGROUPING are tested only with Polish & English languages
234 * LOCALE_SMONTHNAME13 and
235 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
236 * LOCALE_FONTSIGNATURE - return empty string like English US
237 *
238 * Status : FULLY TESTED
239 *
240 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
241 *****************************************************************************/
242ODINFUNCTION4(int, GetLocaleInfoW, LCID, lcid, LCTYPE, LCType, LPWSTR, wbuf,
243 int, len)
244{
245 LocaleObject locale_object = NULL;
246 struct UniLconv *puni_lconv = NULL;
247 WCHAR *pInfoItem;
248 int rc;
249 COUNTRYCODE Country = {0};
250 COUNTRYINFO CtryInfo = {0};
251 ULONG ulInfoLen = 0;
252
253 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
254
255 if (len && (! wbuf) )
256 {
257 SetLastError(ERROR_INSUFFICIENT_BUFFER);
258 return 0;
259 }
260
261 if (wbuf) *wbuf==0;
262
263 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
264
265 if ( rc == ULS_SUCCESS )
266 {
267 UniQueryLocaleInfo(locale_object, &puni_lconv);
268
269 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
270
271 ulInfoLen = len; // Now we use this variable as returned length info
272
273 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
274
275 switch(LCType)
276 {
277 case LOCALE_SDECIMAL:
278 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
279 break;
280
281 case LOCALE_IMEASURE: // Fixme!
282 // only like English US
283 LocaleFromUniChar(0,wbuf,&ulInfoLen);
284 break;
285
286 case LOCALE_INEGNUMBER: // Fixme!
287 // only like English US
288 LocaleFromUniChar(1,wbuf,&ulInfoLen);
289 break;
290
291 case LOCALE_ICURRDIGITS:// Fixme!
292 // only like English US
293 LocaleFromUniChar(2,wbuf,&ulInfoLen);
294 break;
295
296 case LOCALE_STHOUSAND:
297 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
298 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
299 if(defaultLanguage == CC_CZECH_REPUBLIC) {
300 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
301 }
302 break;
303
304 case LOCALE_SGROUPING: // tested only with Polish & English
305 if (wbuf)
306 {
307 if (puni_lconv->grouping)
308 {
309 if (len >= 3*sizeof(WCHAR))
310 {
311 wbuf[0]='0'+*puni_lconv->grouping;
312 wbuf[1]=(WCHAR)';';
313 wbuf[2]=(WCHAR)'0';
314 wbuf[3]=0;
315 ulInfoLen=4;
316 }
317 else
318 {
319 SetLastError(ERROR_INSUFFICIENT_BUFFER);
320 break;
321 }
322 }
323 else
324 {
325 wbuf[0]=20; // Windows return space!!
326 ulInfoLen=2;
327 }
328 }
329 else
330 ulInfoLen=2;
331 break;
332
333 case LOCALE_SMONGROUPING: // tested only with Polish & English
334 if (wbuf)
335 {
336 if (puni_lconv->mon_grouping)
337 {
338 if (len >= 3*sizeof(WCHAR))
339 {
340 wbuf[0]='0'+*puni_lconv->mon_grouping;
341 wbuf[1]=(WCHAR)';';
342 wbuf[2]=(WCHAR)'0';
343 wbuf[3]=0;
344 ulInfoLen=4;
345 }
346 else
347 {
348 SetLastError(ERROR_INSUFFICIENT_BUFFER);
349 break;
350 }
351 }
352 else
353 {
354 wbuf[0]=20; // Windows return space!!
355 ulInfoLen=2;
356 }
357 }
358 else
359 ulInfoLen=2;
360 break;
361
362
363 case LOCALE_SCURRENCY:
364 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
365 break;
366
367 case LOCALE_SMONDECIMALSEP:
368 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
369 break;
370
371 case LOCALE_SMONTHOUSANDSEP:
372 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
373 break;
374
375 case LOCALE_SPOSITIVESIGN:
376 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
377 break;
378
379 case LOCALE_SNEGATIVESIGN:
380 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
381 break;
382
383 case LOCALE_IPOSSIGNPOSN:
384 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
385 break;
386
387 case LOCALE_INEGSIGNPOSN:
388 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
389 break;
390
391 case LOCALE_IPOSSYMPRECEDES:
392 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
393 break;
394
395 case LOCALE_IPOSSEPBYSPACE:
396 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
397 break;
398
399 case LOCALE_INEGSYMPRECEDES:
400 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
401 break;
402
403 case LOCALE_INEGSEPBYSPACE:
404 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
405 break;
406
407 case LOCALE_S1159:
408 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
409 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
410 UniFreeMem(pInfoItem);
411 break;
412
413 case LOCALE_S2359:
414 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
415 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
416 UniFreeMem(pInfoItem);
417 break;
418
419 case LOCALE_IDEFAULTLANGUAGE:
420 strcpyW(wbuf, (LPWSTR)L"0409");
421 ulInfoLen = 5;
422 break;
423 case LOCALE_ILANGUAGE:
424 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
425 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
426 UniFreeMem(pInfoItem);
427 break;
428
429 case LOCALE_INEGCURR:
430 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
431 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
432 UniFreeMem(pInfoItem);
433 break;
434
435 case LOCALE_ICURRENCY:
436 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
437 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
438 UniFreeMem(pInfoItem);
439 break;
440
441
442
443 case LOCALE_SNATIVELANGNAME:
444 case LOCALE_SLANGUAGE:
445 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
446 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
447 UniFreeMem(pInfoItem);
448 break;
449
450 case LOCALE_SABBREVLANGNAME:
451 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
452 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
453 UniFreeMem(pInfoItem);
454 break;
455
456 case LOCALE_IDEFAULTCOUNTRY:
457 case LOCALE_ICOUNTRY:
458 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
459 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
460 UniFreeMem(pInfoItem);
461 break;
462
463 case LOCALE_SENGLANGUAGE:
464 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
465 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
466 UniFreeMem(pInfoItem);
467 break;
468
469 case LOCALE_SENGCOUNTRY:
470 case LOCALE_SCOUNTRY:
471 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
472 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
473 UniFreeMem(pInfoItem);
474 break;
475
476 case LOCALE_SABBREVCTRYNAME:
477 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
478 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
479 UniFreeMem(pInfoItem);
480 break;
481
482 case LOCALE_SNATIVECTRYNAME:
483 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
484 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
485 UniFreeMem(pInfoItem);
486 break;
487
488 case LOCALE_SNATIVEDIGITS:
489 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
490 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
491 UniFreeMem(pInfoItem);
492 break;
493
494
495 case LOCALE_IDEFAULTCODEPAGE:
496 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
497 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
498 UniFreeMem(pInfoItem);
499 break;
500
501 case LOCALE_IDEFAULTANSICODEPAGE:
502 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
503 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
504 UniFreeMem(pInfoItem);
505 break;
506
507 case LOCALE_IDEFAULTMACCODEPAGE:
508 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
509 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
510 UniFreeMem(pInfoItem);
511 break;
512
513 case LOCALE_SLIST:
514 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
515 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
516 UniFreeMem(pInfoItem);
517 break;
518
519 case LOCALE_SINTLSYMBOL:
520 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
521 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
522 UniFreeMem(pInfoItem);
523 break;
524
525 case LOCALE_IFIRSTDAYOFWEEK:
526 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
527 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
528 UniFreeMem(pInfoItem);
529 break;
530
531 case LOCALE_SDAYNAME7:
532 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
533 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
534 UniFreeMem(pInfoItem);
535 break;
536
537 case LOCALE_SDAYNAME1:
538 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
539 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
540 UniFreeMem(pInfoItem);
541 break;
542
543 case LOCALE_SDAYNAME2:
544 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
545 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
546 UniFreeMem(pInfoItem);
547 break;
548
549 case LOCALE_SDAYNAME3:
550 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
551 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
552 UniFreeMem(pInfoItem);
553 break;
554
555 case LOCALE_SDAYNAME4:
556 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
557 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
558 UniFreeMem(pInfoItem);
559 break;
560
561 case LOCALE_SDAYNAME5:
562 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
563 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
564 UniFreeMem(pInfoItem);
565 break;
566
567 case LOCALE_SDAYNAME6:
568 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
569 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
570 UniFreeMem(pInfoItem);
571 break;
572
573 case LOCALE_SABBREVDAYNAME7:
574 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
575 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
576 UniFreeMem(pInfoItem);
577 break;
578
579 case LOCALE_SABBREVDAYNAME1:
580 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
581 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
582 UniFreeMem(pInfoItem);
583 break;
584
585 case LOCALE_SABBREVDAYNAME2:
586 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
587 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
588 UniFreeMem(pInfoItem);
589 break;
590
591 case LOCALE_SABBREVDAYNAME3:
592 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
593 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
594 UniFreeMem(pInfoItem);
595 break;
596
597 case LOCALE_SABBREVDAYNAME4:
598 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
599 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
600 UniFreeMem(pInfoItem);
601 break;
602
603 case LOCALE_SABBREVDAYNAME5:
604 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
605 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
606 UniFreeMem(pInfoItem);
607 break;
608
609 case LOCALE_SABBREVDAYNAME6:
610 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
611 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
612 UniFreeMem(pInfoItem);
613 break;
614
615 case LOCALE_SMONTHNAME1:
616 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
617 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
618 UniFreeMem(pInfoItem);
619 break;
620
621 case LOCALE_SMONTHNAME2:
622 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
623 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
624 UniFreeMem(pInfoItem);
625 break;
626
627 case LOCALE_SMONTHNAME3:
628 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
629 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
630 UniFreeMem(pInfoItem);
631 break;
632
633 case LOCALE_SMONTHNAME4:
634 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
635 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
636 UniFreeMem(pInfoItem);
637 break;
638
639 case LOCALE_SMONTHNAME5:
640 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
641 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
642 UniFreeMem(pInfoItem);
643 break;
644
645 case LOCALE_SMONTHNAME6:
646 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
647 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
648 UniFreeMem(pInfoItem);
649 break;
650
651 case LOCALE_SMONTHNAME7:
652 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
653 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
654 UniFreeMem(pInfoItem);
655 break;
656
657 case LOCALE_SMONTHNAME8:
658 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
659 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
660 UniFreeMem(pInfoItem);
661 break;
662
663 case LOCALE_SMONTHNAME9:
664 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
665 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
666 UniFreeMem(pInfoItem);
667 break;
668
669 case LOCALE_SMONTHNAME10:
670 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
671 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
672 UniFreeMem(pInfoItem);
673 break;
674
675 case LOCALE_SMONTHNAME11:
676 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
677 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
678 UniFreeMem(pInfoItem);
679 break;
680
681 case LOCALE_SMONTHNAME12:
682 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
683 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
684 UniFreeMem(pInfoItem);
685 break;
686
687 case LOCALE_FONTSIGNATURE: // FixMe!!!
688 case LOCALE_SABBREVMONTHNAME13:
689 case LOCALE_SMONTHNAME13:
690 if(wbuf) {
691 *wbuf = 0;
692 }
693 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
694 break;
695
696 case LOCALE_SABBREVMONTHNAME1:
697 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
698 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
699 UniFreeMem(pInfoItem);
700 break;
701
702 case LOCALE_SABBREVMONTHNAME2:
703 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
704 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
705 UniFreeMem(pInfoItem);
706 break;
707
708 case LOCALE_SABBREVMONTHNAME3:
709 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
710 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
711 UniFreeMem(pInfoItem);
712 break;
713
714 case LOCALE_SABBREVMONTHNAME4:
715 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
716 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
717 UniFreeMem(pInfoItem);
718 break;
719
720 case LOCALE_SABBREVMONTHNAME5:
721 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
722 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
723 UniFreeMem(pInfoItem);
724 break;
725
726 case LOCALE_SABBREVMONTHNAME6:
727 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
728 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
729 UniFreeMem(pInfoItem);
730 break;
731
732 case LOCALE_SABBREVMONTHNAME7:
733 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
734 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
735 UniFreeMem(pInfoItem);
736 break;
737
738 case LOCALE_SABBREVMONTHNAME8:
739 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
740 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
741 UniFreeMem(pInfoItem);
742 break;
743
744 case LOCALE_SABBREVMONTHNAME9:
745 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
746 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
747 UniFreeMem(pInfoItem);
748 break;
749
750 case LOCALE_SABBREVMONTHNAME10:
751 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
752 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
753 UniFreeMem(pInfoItem);
754 break;
755
756 case LOCALE_SABBREVMONTHNAME11:
757 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
758 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
759 UniFreeMem(pInfoItem);
760 break;
761
762 case LOCALE_SABBREVMONTHNAME12:
763 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
764 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
765 UniFreeMem(pInfoItem);
766 break;
767
768 case LOCALE_SDATE:
769 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
770 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
771 UniFreeMem(pInfoItem);
772 break;
773
774 case LOCALE_STIME:
775 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
776 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
777 UniFreeMem(pInfoItem);
778 break;
779
780 case LOCALE_IDATE:
781 case LOCALE_ILDATE:
782 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
783 break;
784
785 case LOCALE_ITIME:
786 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
787 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
788 UniFreeMem(pInfoItem);
789 break;
790
791 case LOCALE_SSHORTDATE:
792 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
793 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
794 UniFreeMem(pInfoItem);
795 break;
796
797 case LOCALE_SLONGDATE:
798 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
799 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
800 UniFreeMem(pInfoItem);
801 break;
802
803
804 case LOCALE_STIMEFORMAT:
805 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
806 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
807 UniFreeMem(pInfoItem);
808 break;
809
810 case LOCALE_SISO639LANGNAME:
811 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
812 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
813 UniFreeMem(pInfoItem);
814 break;
815
816 case LOCALE_SISO3166CTRYNAME:
817 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
818 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
819 UniFreeMem(pInfoItem);
820 break;
821
822 default:
823 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
824 if (wbuf)
825 {
826 wbuf[0] = (WCHAR) '1';
827 wbuf[1] = 0;
828 }
829 ulInfoLen=2;
830 break;
831
832 }
833 UniFreeLocaleInfo(puni_lconv);
834 UniFreeLocaleObject(locale_object);
835 }
836 else
837 return (0);
838
839 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
840
841 return (ulInfoLen);
842}
843/*****************************************************************************
844 * Name : DWORD GetLocaleInfoA
845 * Purpose : The GetLocaleInfoA function returns specific locale information
846 * Parameters: LCID lcid locale identifier
847 * LCTYPE LCType type of information
848 * LPSTR buf address of buffer for information
849 * int len size of buffer
850 * Variables :
851 * Result : size of target buffer
852 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
853 * look into GetLocaleInfoW
854 *
855 * Status : TESTED
856 *
857 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
858 *****************************************************************************/
859ODINFUNCTION4(int, GetLocaleInfoA, LCID, lcid, LCTYPE, LCType, LPSTR, buf,
860 int, len)
861{
862 LPWSTR lpWStr;
863 int ret_len;
864
865 if (len && (! buf) )
866 {
867 SetLastError(ERROR_INSUFFICIENT_BUFFER);
868 return 0;
869 }
870
871 dprintf(("KERNEL32: GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
872
873 if (buf)
874 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
875 else
876 lpWStr=NULL; // Query for buffer size
877
878 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
879
880 if (ret_len && buf)
881 UnicodeToAscii(lpWStr,buf);
882
883 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
884
885 dprintf(("KERNEL32: GetLocaleInfoA returned %d -> %s",ret_len, (ret_len) ? buf : NULL));
886
887 return (ret_len);
888}
889//******************************************************************************
890//******************************************************************************
891LCID WIN32API GetThreadLocale()
892{
893 TEB *teb = GetThreadTEB();
894
895 if(teb == NULL) {
896 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
897 return FALSE;
898 }
899 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
900 return(teb->o.odin.lcid);
901}
902//******************************************************************************
903//******************************************************************************
904BOOL WIN32API SetThreadLocale(LCID locale)
905{
906 TEB *teb = GetThreadTEB();
907
908 if(teb == NULL) {
909 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
910 return FALSE;
911 }
912 dprintf(("KERNEL32: SetThreadLocale %x", locale));
913 teb->o.odin.lcid = locale;
914 return(TRUE);
915}
916//******************************************************************************
917//******************************************************************************
Note: See TracBrowser for help on using the repository browser.