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

Last change on this file since 4050 was 4050, checked in by sandervl, 25 years ago

Logging level 2 for GetUserDefaultLCID & GetSystemDefaultLCID

File size: 35.3 KB
Line 
1/* $Id: lang.cpp,v 1.26 2000-08-19 18:36:41 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
26#define DBG_LOCALLOG DBG_lang
27#include "dbglocal.h"
28
29ODINDEBUGCHANNEL(KERNEL32-LANG)
30
31//******************************************************************************
32//******************************************************************************
33ULONG GetLanguageId()
34{
35 static ULONG defaultLanguage = 0;
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//******************************************************************************
144BOOL WIN32API IsValidCodePage(UINT CodePage)
145{
146 dprintf(("KERNEL32: IsValidCodePage %d not implemented", CodePage));
147 return(TRUE);
148}
149//******************************************************************************
150//******************************************************************************
151LCID WIN32API GetUserDefaultLCID(void)
152{
153 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
154 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
155}
156//******************************************************************************
157//******************************************************************************
158LCID WIN32API GetSystemDefaultLCID(void)
159{
160 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)));
161 return(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); //US English
162}
163//******************************************************************************
164//******************************************************************************
165LANGID WIN32API GetUserDefaultLangID()
166{
167 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
168 return(GetLanguageId());
169}
170//******************************************************************************
171//******************************************************************************
172LANGID WIN32API GetSystemDefaultLangID(void)
173{
174 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)));
175 return(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
176}
177
178//******************************************************************************
179//******************************************************************************
180static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
181{
182 if (wbuf)
183 {
184 if (*pLen > UniStrlen(lpUniStr))
185 UniStrcpy(wbuf,lpUniStr);
186 else
187 {
188 SetLastError(ERROR_INSUFFICIENT_BUFFER);
189 *pLen=0;
190 return FALSE;
191 }
192 }
193
194 *pLen=UniStrlen(lpUniStr)+1; // + null terminator
195
196 return TRUE;
197}
198//******************************************************************************
199//******************************************************************************
200static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
201{
202 if (wbuf)
203 {
204// if (*pLen >= sizeof(WCHAR))
205 if (*pLen >= 2)
206 {
207 wbuf[0]=(WCHAR)'0'+wcUniChar;
208 wbuf[1]=0;
209 }
210 else
211 {
212 SetLastError(ERROR_INSUFFICIENT_BUFFER);
213 *pLen=0;
214 return FALSE;
215 }
216 }
217
218 *pLen=2;
219
220 return TRUE;
221}
222
223/*****************************************************************************
224 * Name : DWORD GetLocaleInfoW
225 * Purpose : The GetLocaleInfoW function returns specific locale information
226 * Parameters: LCID lcid locale identifier
227 * LCTYPE LCType type of information
228 * LPSTRW wbuf address of buffer for information
229 * int len size of buffer
230 * Variables :
231 * Result : size of target buffer
232 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
233 *
234 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
235 * LOCALE_IMEASURE - return '0' like English US
236 * LOCALE_INEGNUMBER - return '1' like English US
237 * LOCALE_ICURRDIGITS - return '2' like English US
238 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
239 * LOCALE_SGROUPING and
240 * LOCALE_SMONGROUPING are tested only with Polish & English languages
241 * LOCALE_SMONTHNAME13 and
242 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
243 * LOCALE_FONTSIGNATURE - return empty string like English US
244 *
245 * Status : FULLY TESTED
246 *
247 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
248 *****************************************************************************/
249ODINFUNCTION4(int, GetLocaleInfoW, LCID, lcid, LCTYPE, LCType, LPWSTR, wbuf,
250 int, len)
251{
252 LocaleObject locale_object = NULL;
253 struct UniLconv *puni_lconv = NULL;
254 WCHAR *pInfoItem;
255 int rc;
256 COUNTRYCODE Country = {0};
257 COUNTRYINFO CtryInfo = {0};
258 ULONG ulInfoLen = 0;
259
260 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
261
262 if (len && (! wbuf) )
263 {
264 SetLastError(ERROR_INSUFFICIENT_BUFFER);
265 return 0;
266 }
267
268 if (wbuf) *wbuf==0;
269
270 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
271
272 if ( rc == ULS_SUCCESS )
273 {
274 UniQueryLocaleInfo(locale_object, &puni_lconv);
275
276 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
277
278 ulInfoLen = len; // Now we use this variable as returned length info
279
280 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
281
282 switch(LCType)
283 {
284 case LOCALE_SDECIMAL:
285 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
286 break;
287
288 case LOCALE_IMEASURE: // Fixme!
289 // only like English US
290 LocaleFromUniChar(0,wbuf,&ulInfoLen);
291 break;
292
293 case LOCALE_INEGNUMBER: // Fixme!
294 // only like English US
295 LocaleFromUniChar(1,wbuf,&ulInfoLen);
296 break;
297
298 case LOCALE_ICURRDIGITS:// Fixme!
299 // only like English US
300 LocaleFromUniChar(2,wbuf,&ulInfoLen);
301 break;
302
303 case LOCALE_STHOUSAND:
304 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
305 break;
306
307 case LOCALE_SGROUPING: // tested only with Polish & English
308 if (wbuf)
309 {
310 if (puni_lconv->grouping)
311 {
312 if (len >= 3*sizeof(WCHAR))
313 {
314 wbuf[0]='0'+*puni_lconv->grouping;
315 wbuf[1]=(WCHAR)';';
316 wbuf[2]=(WCHAR)'0';
317 wbuf[3]=0;
318 ulInfoLen=4;
319 }
320 else
321 {
322 SetLastError(ERROR_INSUFFICIENT_BUFFER);
323 break;
324 }
325 }
326 else
327 {
328 wbuf[0]=20; // Windows return space!!
329 ulInfoLen=2;
330 }
331 }
332 else
333 ulInfoLen=2;
334 break;
335
336 case LOCALE_SMONGROUPING: // tested only with Polish & English
337 if (wbuf)
338 {
339 if (puni_lconv->mon_grouping)
340 {
341 if (len >= 3*sizeof(WCHAR))
342 {
343 wbuf[0]='0'+*puni_lconv->mon_grouping;
344 wbuf[1]=(WCHAR)';';
345 wbuf[2]=(WCHAR)'0';
346 wbuf[3]=0;
347 ulInfoLen=4;
348 }
349 else
350 {
351 SetLastError(ERROR_INSUFFICIENT_BUFFER);
352 break;
353 }
354 }
355 else
356 {
357 wbuf[0]=20; // Windows return space!!
358 ulInfoLen=2;
359 }
360 }
361 else
362 ulInfoLen=2;
363 break;
364
365
366 case LOCALE_SCURRENCY:
367 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
368 break;
369
370 case LOCALE_SMONDECIMALSEP:
371 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
372 break;
373
374 case LOCALE_SMONTHOUSANDSEP:
375 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
376 break;
377
378 case LOCALE_SPOSITIVESIGN:
379 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
380 break;
381
382 case LOCALE_SNEGATIVESIGN:
383 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
384 break;
385
386 case LOCALE_IPOSSIGNPOSN:
387 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
388 break;
389
390 case LOCALE_INEGSIGNPOSN:
391 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
392 break;
393
394 case LOCALE_IPOSSYMPRECEDES:
395 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
396 break;
397
398 case LOCALE_IPOSSEPBYSPACE:
399 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
400 break;
401
402 case LOCALE_INEGSYMPRECEDES:
403 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
404 break;
405
406 case LOCALE_INEGSEPBYSPACE:
407 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
408 break;
409
410 case LOCALE_S1159:
411 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
412 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
413 UniFreeMem(pInfoItem);
414 break;
415
416 case LOCALE_S2359:
417 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
418 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
419 UniFreeMem(pInfoItem);
420 break;
421
422 case LOCALE_IDEFAULTLANGUAGE:
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_SDAYNAME7:
526 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
527 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
528 UniFreeMem(pInfoItem);
529 break;
530
531 case LOCALE_SDAYNAME1:
532 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
533 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
534 UniFreeMem(pInfoItem);
535 break;
536
537 case LOCALE_SDAYNAME2:
538 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
539 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
540 UniFreeMem(pInfoItem);
541 break;
542
543 case LOCALE_SDAYNAME3:
544 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
545 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
546 UniFreeMem(pInfoItem);
547 break;
548
549 case LOCALE_SDAYNAME4:
550 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
551 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
552 UniFreeMem(pInfoItem);
553 break;
554
555 case LOCALE_SDAYNAME5:
556 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
557 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
558 UniFreeMem(pInfoItem);
559 break;
560
561 case LOCALE_SDAYNAME6:
562 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
563 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
564 UniFreeMem(pInfoItem);
565 break;
566
567 case LOCALE_SABBREVDAYNAME7:
568 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
569 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
570 UniFreeMem(pInfoItem);
571 break;
572
573 case LOCALE_SABBREVDAYNAME1:
574 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
575 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
576 UniFreeMem(pInfoItem);
577 break;
578
579 case LOCALE_SABBREVDAYNAME2:
580 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
581 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
582 UniFreeMem(pInfoItem);
583 break;
584
585 case LOCALE_SABBREVDAYNAME3:
586 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
587 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
588 UniFreeMem(pInfoItem);
589 break;
590
591 case LOCALE_SABBREVDAYNAME4:
592 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
593 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
594 UniFreeMem(pInfoItem);
595 break;
596
597 case LOCALE_SABBREVDAYNAME5:
598 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
599 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
600 UniFreeMem(pInfoItem);
601 break;
602
603 case LOCALE_SABBREVDAYNAME6:
604 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
605 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
606 UniFreeMem(pInfoItem);
607 break;
608
609 case LOCALE_SMONTHNAME1:
610 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
611 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
612 UniFreeMem(pInfoItem);
613 break;
614
615 case LOCALE_SMONTHNAME2:
616 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
617 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
618 UniFreeMem(pInfoItem);
619 break;
620
621 case LOCALE_SMONTHNAME3:
622 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
623 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
624 UniFreeMem(pInfoItem);
625 break;
626
627 case LOCALE_SMONTHNAME4:
628 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
629 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
630 UniFreeMem(pInfoItem);
631 break;
632
633 case LOCALE_SMONTHNAME5:
634 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
635 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
636 UniFreeMem(pInfoItem);
637 break;
638
639 case LOCALE_SMONTHNAME6:
640 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
641 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
642 UniFreeMem(pInfoItem);
643 break;
644
645 case LOCALE_SMONTHNAME7:
646 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
647 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
648 UniFreeMem(pInfoItem);
649 break;
650
651 case LOCALE_SMONTHNAME8:
652 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
653 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
654 UniFreeMem(pInfoItem);
655 break;
656
657 case LOCALE_SMONTHNAME9:
658 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
659 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
660 UniFreeMem(pInfoItem);
661 break;
662
663 case LOCALE_SMONTHNAME10:
664 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
665 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
666 UniFreeMem(pInfoItem);
667 break;
668
669 case LOCALE_SMONTHNAME11:
670 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
671 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
672 UniFreeMem(pInfoItem);
673 break;
674
675 case LOCALE_SMONTHNAME12:
676 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
677 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
678 UniFreeMem(pInfoItem);
679 break;
680
681 case LOCALE_FONTSIGNATURE: // FixMe!!!
682 case LOCALE_SABBREVMONTHNAME13:
683 case LOCALE_SMONTHNAME13:
684 if(wbuf) {
685 *wbuf = 0;
686 }
687 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
688 break;
689
690 case LOCALE_SABBREVMONTHNAME1:
691 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
692 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
693 UniFreeMem(pInfoItem);
694 break;
695
696 case LOCALE_SABBREVMONTHNAME2:
697 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
698 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
699 UniFreeMem(pInfoItem);
700 break;
701
702 case LOCALE_SABBREVMONTHNAME3:
703 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
704 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
705 UniFreeMem(pInfoItem);
706 break;
707
708 case LOCALE_SABBREVMONTHNAME4:
709 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
710 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
711 UniFreeMem(pInfoItem);
712 break;
713
714 case LOCALE_SABBREVMONTHNAME5:
715 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
716 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
717 UniFreeMem(pInfoItem);
718 break;
719
720 case LOCALE_SABBREVMONTHNAME6:
721 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
722 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
723 UniFreeMem(pInfoItem);
724 break;
725
726 case LOCALE_SABBREVMONTHNAME7:
727 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
728 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
729 UniFreeMem(pInfoItem);
730 break;
731
732 case LOCALE_SABBREVMONTHNAME8:
733 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
734 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
735 UniFreeMem(pInfoItem);
736 break;
737
738 case LOCALE_SABBREVMONTHNAME9:
739 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
740 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
741 UniFreeMem(pInfoItem);
742 break;
743
744 case LOCALE_SABBREVMONTHNAME10:
745 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
746 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
747 UniFreeMem(pInfoItem);
748 break;
749
750 case LOCALE_SABBREVMONTHNAME11:
751 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
752 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
753 UniFreeMem(pInfoItem);
754 break;
755
756 case LOCALE_SABBREVMONTHNAME12:
757 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
758 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
759 UniFreeMem(pInfoItem);
760 break;
761
762 case LOCALE_SDATE:
763 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
764 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
765 UniFreeMem(pInfoItem);
766 break;
767
768 case LOCALE_STIME:
769 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
770 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
771 UniFreeMem(pInfoItem);
772 break;
773
774 case LOCALE_IDATE:
775 case LOCALE_ILDATE:
776 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
777 break;
778
779 case LOCALE_ITIME:
780 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
781 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
782 UniFreeMem(pInfoItem);
783 break;
784
785 case LOCALE_SSHORTDATE:
786 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
787 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
788 UniFreeMem(pInfoItem);
789 break;
790
791 case LOCALE_SLONGDATE:
792 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
793 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
794 UniFreeMem(pInfoItem);
795 break;
796
797
798 case LOCALE_STIMEFORMAT:
799 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
800 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
801 UniFreeMem(pInfoItem);
802 break;
803
804 case LOCALE_SISO639LANGNAME:
805 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
806 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
807 UniFreeMem(pInfoItem);
808 break;
809
810 case LOCALE_SISO3166CTRYNAME:
811 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
812 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
813 UniFreeMem(pInfoItem);
814 break;
815
816 default:
817 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
818 if (wbuf)
819 {
820 wbuf[0] = (WCHAR) '1';
821 wbuf[1] = 0;
822 }
823 ulInfoLen=2;
824 break;
825
826 }
827 UniFreeLocaleInfo(puni_lconv);
828 UniFreeLocaleObject(locale_object);
829 }
830 else
831 return (0);
832
833 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
834
835 return (ulInfoLen);
836}
837/*****************************************************************************
838 * Name : DWORD GetLocaleInfoA
839 * Purpose : The GetLocaleInfoA function returns specific locale information
840 * Parameters: LCID lcid locale identifier
841 * LCTYPE LCType type of information
842 * LPSTR buf address of buffer for information
843 * int len size of buffer
844 * Variables :
845 * Result : size of target buffer
846 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
847 * look into GetLocaleInfoW
848 *
849 * Status : TESTED
850 *
851 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
852 *****************************************************************************/
853ODINFUNCTION4(int, GetLocaleInfoA, LCID, lcid, LCTYPE, LCType, LPSTR, buf,
854 int, len)
855{
856 LPWSTR lpWStr;
857 int ret_len;
858
859 if (len && (! buf) )
860 {
861 SetLastError(ERROR_INSUFFICIENT_BUFFER);
862 return 0;
863 }
864
865 dprintf(("KERNEL32: OS2GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
866
867 if (buf)
868 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
869 else
870 lpWStr=NULL; // Query for buffer size
871
872 ret_len = ODIN_GetLocaleInfoW(lcid, LCType, lpWStr, len);
873
874 if (ret_len && buf)
875 UnicodeToAscii(lpWStr,buf);
876
877 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
878
879 dprintf(("KERNEL32: OS2GetLocaleInfoA returned %d\n",ret_len));
880
881 return (ret_len);
882}
883//******************************************************************************
884//******************************************************************************
885BOOL WIN32API IsValidLocale(LCID Locale, DWORD dwFlags)
886{
887 dprintf(("KERNEL32: IsValidLocale, always returns TRUE\n"));
888 return(TRUE);
889}
890//******************************************************************************
891//******************************************************************************
892LCID WIN32API GetThreadLocale()
893{
894 THDB *thdb = GetThreadTHDB();
895
896 if(thdb == NULL) {
897 dprintf(("KERNEL32: ERROR: GetThreadLocale thdb == NULL!"));
898 return FALSE;
899 }
900 dprintf(("KERNEL32: GetThreadLocale returned %x", thdb->lcid));
901 return(thdb->lcid);
902}
903//******************************************************************************
904//******************************************************************************
905BOOL WIN32API SetThreadLocale(LCID locale)
906{
907 THDB *thdb = GetThreadTHDB();
908
909 if(thdb == NULL) {
910 dprintf(("KERNEL32: ERROR SetThreadLocale thdb == NULL!"));
911 return FALSE;
912 }
913 dprintf(("KERNEL32: SetThreadLocale %x", locale));
914 thdb->lcid = locale;
915 return(TRUE);
916}
917//******************************************************************************
918//******************************************************************************
919BOOL WIN32API EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc,
920 DWORD dwFlags)
921{
922 char buffer[32];
923
924 dprintf(("EnumSystemLocalesA %X %X\n", lpLocaleEnumProc, dwFlags));
925 if(lpLocaleEnumProc == NULL || ((dwFlags & LCID_INSTALLED) && (dwFlags & LCID_SUPPORTED))) {
926 dprintf(("Invalid parameter\n"));
927 SetLastError(ERROR_INVALID_PARAMETER);
928 return(FALSE);
929 }
930
931 sprintf(buffer, "%08lx", GetUserDefaultLCID());
932 lpLocaleEnumProc(buffer);
933 return(TRUE);
934}
935//******************************************************************************
936//******************************************************************************
937BOOL WIN32API EnumSystemLocalesW(LOCALE_ENUMPROCW lpLocaleEnumProc,
938 DWORD dwFlags)
939{
940 WCHAR bufferW[32];
941 char bufferA[32];
942
943 dprintf(("EnumSystemLocalesW %X %X\n", lpLocaleEnumProc, dwFlags));
944 if(lpLocaleEnumProc == NULL || ((dwFlags & LCID_INSTALLED) && (dwFlags & LCID_SUPPORTED))) {
945 dprintf(("Invalid parameter\n"));
946 SetLastError(ERROR_INVALID_PARAMETER);
947 return(FALSE);
948 }
949 sprintf(bufferA, "%08lx", GetUserDefaultLCID());
950 lstrcpyAtoW(bufferW, bufferA);
951
952 lpLocaleEnumProc(bufferW);
953 return(TRUE);
954}
955//******************************************************************************
956//******************************************************************************
957
958
959/*****************************************************************************
960 * Name : BOOL SetLocaleInfoA
961 * Purpose : The SetLocaleInfoA function sets an item of locale information.
962 * It does so by making an entry in the process portion of the
963 * locale table. This setting only affects the user override portion
964 * of the locale settings; it does not set the system defaults.
965 * Only certain types of locale information, or LCTYPE values, can
966 * be set by this function. See the following Remarks section for a
967 * list of valid LCTYPE values.
968 * The locale information is always passed in as a null-terminated
969 * Unicode string in the Unicode (W) version of the function, and as
970 * a null-terminated ANSI string in the ANSI (A) version. No integers
971 * are allowed by this function; any numeric values must be specified
972 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
973 * noted in Locale Identifiers.
974 * Parameters: LCID Locale locale identifier
975 * LCTYPE LCType type of information to set
976 * LPCTSTR lpLCData pointer to information to set
977 * Variables :
978 * Result : TRUE / FALSE
979 * Remark :
980 * Status : UNTESTED STUB
981 *
982 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
983 *****************************************************************************/
984
985BOOL WIN32API SetLocaleInfoA(LCID Locale,
986 LCTYPE LCType,
987 LPCSTR lpLCData)
988{
989 dprintf(("KERNEL32: SetLocaleInfoA(%08xh,%08xh,%08xh) not implemented.\n",
990 Locale,
991 LCType,
992 lpLCData));
993
994 return (FALSE);
995}
996
997
998/*****************************************************************************
999 * Name : BOOL SetLocaleInfoW
1000 * Purpose : The SetLocaleInfoW function sets an item of locale information.
1001 * It does so by making an entry in the process portion of the
1002 * locale table. This setting only affects the user override portion
1003 * of the locale settings; it does not set the system defaults.
1004 * Only certain types of locale information, or LCTYPE values, can
1005 * be set by this function. See the following Remarks section for a
1006 * list of valid LCTYPE values.
1007 * The locale information is always passed in as a null-terminated
1008 * Unicode string in the Unicode (W) version of the function, and as
1009 * a null-terminated ANSI string in the ANSI (A) version. No integers
1010 * are allowed by this function; any numeric values must be specified
1011 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
1012 * noted in Locale Identifiers.
1013 * Parameters: LCID Locale locale identifier
1014 * LCTYPE LCType type of information to set
1015 * LPCTSTR lpLCData pointer to information to set
1016 * Variables :
1017 * Result : TRUE / FALSE
1018 * Remark :
1019 * Status : UNTESTED STUB
1020 *
1021 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
1022 *****************************************************************************/
1023
1024BOOL WIN32API SetLocaleInfoW(LCID Locale,
1025 LCTYPE LCType,
1026 LPCWSTR lpLCData)
1027{
1028 dprintf(("KERNEL32: SetLocaleInfoW(%08xh,%08xh,%08xh) not implemented.\n",
1029 Locale,
1030 LCType,
1031 lpLCData));
1032
1033 return (FALSE);
1034}
1035
1036
1037/*****************************************************************************
1038 * Name :
1039 * Purpose :
1040 * Parameters:
1041 * Variables :
1042 * Result :
1043 * Remark :
1044 * Status : UNTESTED STUB
1045 *
1046 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1047 *****************************************************************************/
1048
1049ODINFUNCTION3(DWORD,VerLanguageNameA,DWORD, wLang,
1050 LPSTR, szLang,
1051 DWORD, nSize)
1052{
1053 char buffer[80];
1054 LPCSTR name;
1055 DWORD result;
1056
1057 dprintf(("KERNEL32: VerLanguageNameA not implemented"));
1058
1059 /*
1060 * First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1061 * from the registry.
1062 */
1063
1064#if 0
1065PHS: disabled because if interlinkage with registry
1066 sprintf( buffer,
1067 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
1068 wLang );
1069
1070 result = RegQueryValueA(HKEY_LOCAL_MACHINE,
1071 buffer,
1072 szLang,
1073 (LPLONG)&nSize );
1074 if (result == ERROR_SUCCESS ||
1075 result == ERROR_MORE_DATA)
1076 return nSize;
1077#endif
1078
1079 /*
1080 * If that fails, use the internal table
1081 * (actually, Windows stores the names in a string table resource ...)
1082 */
1083
1084 lstrcpynA(szLang,
1085 "Language-Neutral",
1086 nSize);
1087
1088 return strlen(szLang);
1089}
1090
1091/*****************************************************************************
1092 * Name :
1093 * Purpose :
1094 * Parameters:
1095 * Variables :
1096 * Result :
1097 * Remark :
1098 * Status : UNTESTED STUB
1099 *
1100 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1101 *****************************************************************************/
1102
1103ODINFUNCTION3(DWORD,VerLanguageNameW,DWORD, wLang,
1104 LPWSTR, szLang,
1105 DWORD, nSize)
1106{
1107 LPSTR szLangA;
1108 DWORD rc;
1109
1110 if ( (szLang == NULL) ||
1111 (nSize == 0) ) // validate parameters
1112 return 0;
1113
1114 szLangA = (LPSTR)HEAP_malloc(nSize + 1);
1115 rc = VerLanguageNameA(wLang,
1116 szLangA,
1117 nSize);
1118 if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
1119 AsciiToUnicodeN(szLangA,
1120 szLang,
1121 nSize);
1122 HEAP_free(szLangA);
1123 return rc;
1124}
1125
1126
Note: See TracBrowser for help on using the repository browser.