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

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

DT: LOCALE_IFIRSTDAYOFWEEK fix

File size: 33.7 KB
Line 
1/* $Id: lang.cpp,v 1.35 2001-05-19 08:24:47 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 case LOCALE_ILANGUAGE:
421 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
422 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
423 UniFreeMem(pInfoItem);
424 break;
425
426 case LOCALE_INEGCURR:
427 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
428 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
429 UniFreeMem(pInfoItem);
430 break;
431
432 case LOCALE_ICURRENCY:
433 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
434 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
435 UniFreeMem(pInfoItem);
436 break;
437
438
439
440 case LOCALE_SNATIVELANGNAME:
441 case LOCALE_SLANGUAGE:
442 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
443 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
444 UniFreeMem(pInfoItem);
445 break;
446
447 case LOCALE_SABBREVLANGNAME:
448 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
449 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
450 UniFreeMem(pInfoItem);
451 break;
452
453 case LOCALE_IDEFAULTCOUNTRY:
454 case LOCALE_ICOUNTRY:
455 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
456 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
457 UniFreeMem(pInfoItem);
458 break;
459
460 case LOCALE_SENGLANGUAGE:
461 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
462 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
463 UniFreeMem(pInfoItem);
464 break;
465
466 case LOCALE_SENGCOUNTRY:
467 case LOCALE_SCOUNTRY:
468 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
469 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
470 UniFreeMem(pInfoItem);
471 break;
472
473 case LOCALE_SABBREVCTRYNAME:
474 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
475 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
476 UniFreeMem(pInfoItem);
477 break;
478
479 case LOCALE_SNATIVECTRYNAME:
480 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
481 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
482 UniFreeMem(pInfoItem);
483 break;
484
485 case LOCALE_SNATIVEDIGITS:
486 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
487 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
488 UniFreeMem(pInfoItem);
489 break;
490
491
492 case LOCALE_IDEFAULTCODEPAGE:
493 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
494 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
495 UniFreeMem(pInfoItem);
496 break;
497
498 case LOCALE_IDEFAULTANSICODEPAGE:
499 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
500 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
501 UniFreeMem(pInfoItem);
502 break;
503
504 case LOCALE_IDEFAULTMACCODEPAGE:
505 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
506 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
507 UniFreeMem(pInfoItem);
508 break;
509
510 case LOCALE_SLIST:
511 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
512 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
513 UniFreeMem(pInfoItem);
514 break;
515
516 case LOCALE_SINTLSYMBOL:
517 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
518 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
519 UniFreeMem(pInfoItem);
520 break;
521
522 case LOCALE_IFIRSTDAYOFWEEK:
523 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
524 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
525 UniFreeMem(pInfoItem);
526 if ((++wbuf[0])=='7') wbuf[0]='0';
527 break;
528
529 case LOCALE_SDAYNAME7:
530 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
531 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
532 UniFreeMem(pInfoItem);
533 break;
534
535 case LOCALE_SDAYNAME1:
536 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
537 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
538 UniFreeMem(pInfoItem);
539 break;
540
541 case LOCALE_SDAYNAME2:
542 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
543 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
544 UniFreeMem(pInfoItem);
545 break;
546
547 case LOCALE_SDAYNAME3:
548 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
549 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
550 UniFreeMem(pInfoItem);
551 break;
552
553 case LOCALE_SDAYNAME4:
554 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
555 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
556 UniFreeMem(pInfoItem);
557 break;
558
559 case LOCALE_SDAYNAME5:
560 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
561 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
562 UniFreeMem(pInfoItem);
563 break;
564
565 case LOCALE_SDAYNAME6:
566 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
567 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
568 UniFreeMem(pInfoItem);
569 break;
570
571 case LOCALE_SABBREVDAYNAME7:
572 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
573 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
574 UniFreeMem(pInfoItem);
575 break;
576
577 case LOCALE_SABBREVDAYNAME1:
578 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
579 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
580 UniFreeMem(pInfoItem);
581 break;
582
583 case LOCALE_SABBREVDAYNAME2:
584 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
585 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
586 UniFreeMem(pInfoItem);
587 break;
588
589 case LOCALE_SABBREVDAYNAME3:
590 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
591 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
592 UniFreeMem(pInfoItem);
593 break;
594
595 case LOCALE_SABBREVDAYNAME4:
596 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
597 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
598 UniFreeMem(pInfoItem);
599 break;
600
601 case LOCALE_SABBREVDAYNAME5:
602 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
603 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
604 UniFreeMem(pInfoItem);
605 break;
606
607 case LOCALE_SABBREVDAYNAME6:
608 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
609 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
610 UniFreeMem(pInfoItem);
611 break;
612
613 case LOCALE_SMONTHNAME1:
614 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
615 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
616 UniFreeMem(pInfoItem);
617 break;
618
619 case LOCALE_SMONTHNAME2:
620 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
621 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
622 UniFreeMem(pInfoItem);
623 break;
624
625 case LOCALE_SMONTHNAME3:
626 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
627 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
628 UniFreeMem(pInfoItem);
629 break;
630
631 case LOCALE_SMONTHNAME4:
632 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
633 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
634 UniFreeMem(pInfoItem);
635 break;
636
637 case LOCALE_SMONTHNAME5:
638 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
639 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
640 UniFreeMem(pInfoItem);
641 break;
642
643 case LOCALE_SMONTHNAME6:
644 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
645 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
646 UniFreeMem(pInfoItem);
647 break;
648
649 case LOCALE_SMONTHNAME7:
650 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
651 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
652 UniFreeMem(pInfoItem);
653 break;
654
655 case LOCALE_SMONTHNAME8:
656 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
657 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
658 UniFreeMem(pInfoItem);
659 break;
660
661 case LOCALE_SMONTHNAME9:
662 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
663 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
664 UniFreeMem(pInfoItem);
665 break;
666
667 case LOCALE_SMONTHNAME10:
668 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
669 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
670 UniFreeMem(pInfoItem);
671 break;
672
673 case LOCALE_SMONTHNAME11:
674 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
675 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
676 UniFreeMem(pInfoItem);
677 break;
678
679 case LOCALE_SMONTHNAME12:
680 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
681 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
682 UniFreeMem(pInfoItem);
683 break;
684
685 case LOCALE_FONTSIGNATURE: // FixMe!!!
686 case LOCALE_SABBREVMONTHNAME13:
687 case LOCALE_SMONTHNAME13:
688 if(wbuf) {
689 *wbuf = 0;
690 }
691 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
692 break;
693
694 case LOCALE_SABBREVMONTHNAME1:
695 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
696 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
697 UniFreeMem(pInfoItem);
698 break;
699
700 case LOCALE_SABBREVMONTHNAME2:
701 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
702 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
703 UniFreeMem(pInfoItem);
704 break;
705
706 case LOCALE_SABBREVMONTHNAME3:
707 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
708 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
709 UniFreeMem(pInfoItem);
710 break;
711
712 case LOCALE_SABBREVMONTHNAME4:
713 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
714 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
715 UniFreeMem(pInfoItem);
716 break;
717
718 case LOCALE_SABBREVMONTHNAME5:
719 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
720 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
721 UniFreeMem(pInfoItem);
722 break;
723
724 case LOCALE_SABBREVMONTHNAME6:
725 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
726 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
727 UniFreeMem(pInfoItem);
728 break;
729
730 case LOCALE_SABBREVMONTHNAME7:
731 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
732 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
733 UniFreeMem(pInfoItem);
734 break;
735
736 case LOCALE_SABBREVMONTHNAME8:
737 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
738 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
739 UniFreeMem(pInfoItem);
740 break;
741
742 case LOCALE_SABBREVMONTHNAME9:
743 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
744 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
745 UniFreeMem(pInfoItem);
746 break;
747
748 case LOCALE_SABBREVMONTHNAME10:
749 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
750 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
751 UniFreeMem(pInfoItem);
752 break;
753
754 case LOCALE_SABBREVMONTHNAME11:
755 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
756 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
757 UniFreeMem(pInfoItem);
758 break;
759
760 case LOCALE_SABBREVMONTHNAME12:
761 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
762 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
763 UniFreeMem(pInfoItem);
764 break;
765
766 case LOCALE_SDATE:
767 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
768 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
769 UniFreeMem(pInfoItem);
770 break;
771
772 case LOCALE_STIME:
773 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
774 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
775 UniFreeMem(pInfoItem);
776 break;
777
778 case LOCALE_IDATE:
779 case LOCALE_ILDATE:
780 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
781 break;
782
783 case LOCALE_ITIME:
784 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
785 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
786 UniFreeMem(pInfoItem);
787 break;
788
789 case LOCALE_SSHORTDATE:
790 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
791 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
792 UniFreeMem(pInfoItem);
793 break;
794
795 case LOCALE_SLONGDATE:
796 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
797 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
798 UniFreeMem(pInfoItem);
799 break;
800
801
802 case LOCALE_STIMEFORMAT:
803 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
804 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
805 UniFreeMem(pInfoItem);
806 break;
807
808 case LOCALE_SISO639LANGNAME:
809 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
810 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
811 UniFreeMem(pInfoItem);
812 break;
813
814 case LOCALE_SISO3166CTRYNAME:
815 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
816 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
817 UniFreeMem(pInfoItem);
818 break;
819
820 default:
821 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
822 if (wbuf)
823 {
824 wbuf[0] = (WCHAR) '1';
825 wbuf[1] = 0;
826 }
827 ulInfoLen=2;
828 break;
829
830 }
831 UniFreeLocaleInfo(puni_lconv);
832 UniFreeLocaleObject(locale_object);
833 }
834 else
835 return (0);
836
837 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
838
839 return (ulInfoLen);
840}
841/*****************************************************************************
842 * Name : DWORD GetLocaleInfoA
843 * Purpose : The GetLocaleInfoA function returns specific locale information
844 * Parameters: LCID lcid locale identifier
845 * LCTYPE LCType type of information
846 * LPSTR buf address of buffer for information
847 * int len size of buffer
848 * Variables :
849 * Result : size of target buffer
850 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
851 * look into GetLocaleInfoW
852 *
853 * Status : TESTED
854 *
855 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
856 *****************************************************************************/
857ODINFUNCTION4(int, GetLocaleInfoA, LCID, lcid, LCTYPE, LCType, LPSTR, buf,
858 int, len)
859{
860 LPWSTR lpWStr;
861 int ret_len;
862
863 if (len && (! buf) )
864 {
865 SetLastError(ERROR_INSUFFICIENT_BUFFER);
866 return 0;
867 }
868
869 dprintf(("KERNEL32: OS2GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
870
871 if (buf)
872 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
873 else
874 lpWStr=NULL; // Query for buffer size
875
876 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
877
878 if (ret_len && buf)
879 UnicodeToAscii(lpWStr,buf);
880
881 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
882
883 dprintf(("KERNEL32: OS2GetLocaleInfoA returned %d\n",ret_len));
884
885 return (ret_len);
886}
887//******************************************************************************
888//******************************************************************************
889LCID WIN32API GetThreadLocale()
890{
891 TEB *teb = GetThreadTEB();
892
893 if(teb == NULL) {
894 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
895 return FALSE;
896 }
897 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
898 return(teb->o.odin.lcid);
899}
900//******************************************************************************
901//******************************************************************************
902BOOL WIN32API SetThreadLocale(LCID locale)
903{
904 TEB *teb = GetThreadTEB();
905
906 if(teb == NULL) {
907 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
908 return FALSE;
909 }
910 dprintf(("KERNEL32: SetThreadLocale %x", locale));
911 teb->o.odin.lcid = locale;
912 return(TRUE);
913}
914//******************************************************************************
915//******************************************************************************
916
917
918
919#if 0
920PHS: disabled for ole2nls.cpp
921
922/*****************************************************************************
923 * Name : BOOL SetLocaleInfoA
924 * Purpose : The SetLocaleInfoA function sets an item of locale information.
925 * It does so by making an entry in the process portion of the
926 * locale table. This setting only affects the user override portion
927 * of the locale settings; it does not set the system defaults.
928 * Only certain types of locale information, or LCTYPE values, can
929 * be set by this function. See the following Remarks section for a
930 * list of valid LCTYPE values.
931 * The locale information is always passed in as a null-terminated
932 * Unicode string in the Unicode (W) version of the function, and as
933 * a null-terminated ANSI string in the ANSI (A) version. No integers
934 * are allowed by this function; any numeric values must be specified
935 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
936 * noted in Locale Identifiers.
937 * Parameters: LCID Locale locale identifier
938 * LCTYPE LCType type of information to set
939 * LPCTSTR lpLCData pointer to information to set
940 * Variables :
941 * Result : TRUE / FALSE
942 * Remark :
943 * Status : UNTESTED STUB
944 *
945 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
946 *****************************************************************************/
947
948BOOL WIN32API SetLocaleInfoA(LCID Locale,
949 LCTYPE LCType,
950 LPCSTR lpLCData)
951{
952 dprintf(("KERNEL32: SetLocaleInfoA(%08xh,%08xh,%08xh) not implemented.\n",
953 Locale,
954 LCType,
955 lpLCData));
956
957 return (FALSE);
958}
959
960
961/*****************************************************************************
962 * Name : BOOL SetLocaleInfoW
963 * Purpose : The SetLocaleInfoW function sets an item of locale information.
964 * It does so by making an entry in the process portion of the
965 * locale table. This setting only affects the user override portion
966 * of the locale settings; it does not set the system defaults.
967 * Only certain types of locale information, or LCTYPE values, can
968 * be set by this function. See the following Remarks section for a
969 * list of valid LCTYPE values.
970 * The locale information is always passed in as a null-terminated
971 * Unicode string in the Unicode (W) version of the function, and as
972 * a null-terminated ANSI string in the ANSI (A) version. No integers
973 * are allowed by this function; any numeric values must be specified
974 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
975 * noted in Locale Identifiers.
976 * Parameters: LCID Locale locale identifier
977 * LCTYPE LCType type of information to set
978 * LPCTSTR lpLCData pointer to information to set
979 * Variables :
980 * Result : TRUE / FALSE
981 * Remark :
982 * Status : UNTESTED STUB
983 *
984 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
985 *****************************************************************************/
986
987BOOL WIN32API SetLocaleInfoW(LCID Locale,
988 LCTYPE LCType,
989 LPCWSTR lpLCData)
990{
991 dprintf(("KERNEL32: SetLocaleInfoW(%08xh,%08xh,%08xh) not implemented.\n",
992 Locale,
993 LCType,
994 lpLCData));
995
996 return (FALSE);
997}
998
999
1000/*****************************************************************************
1001 * Name :
1002 * Purpose :
1003 * Parameters:
1004 * Variables :
1005 * Result :
1006 * Remark :
1007 * Status : UNTESTED STUB
1008 *
1009 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1010 *****************************************************************************/
1011
1012ODINFUNCTION3(DWORD,VerLanguageNameA,DWORD, wLang,
1013 LPSTR, szLang,
1014 DWORD, nSize)
1015{
1016 char buffer[80];
1017 LPCSTR name;
1018 DWORD result;
1019
1020 dprintf(("KERNEL32: VerLanguageNameA not implemented"));
1021
1022 /*
1023 * First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1024 * from the registry.
1025 */
1026
1027#if 0
1028PHS: disabled because if interlinkage with registry
1029 sprintf( buffer,
1030 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
1031 wLang );
1032
1033 result = RegQueryValueA(HKEY_LOCAL_MACHINE,
1034 buffer,
1035 szLang,
1036 (LPLONG)&nSize );
1037 if (result == ERROR_SUCCESS ||
1038 result == ERROR_MORE_DATA)
1039 return nSize;
1040#endif
1041
1042 /*
1043 * If that fails, use the internal table
1044 * (actually, Windows stores the names in a string table resource ...)
1045 */
1046
1047 lstrcpynA(szLang,
1048 "Language-Neutral",
1049 nSize);
1050
1051 return strlen(szLang);
1052}
1053
1054/*****************************************************************************
1055 * Name :
1056 * Purpose :
1057 * Parameters:
1058 * Variables :
1059 * Result :
1060 * Remark :
1061 * Status : UNTESTED STUB
1062 *
1063 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1064 *****************************************************************************/
1065
1066ODINFUNCTION3(DWORD,VerLanguageNameW,DWORD, wLang,
1067 LPWSTR, szLang,
1068 DWORD, nSize)
1069{
1070 LPSTR szLangA;
1071 DWORD rc;
1072
1073 if ( (szLang == NULL) ||
1074 (nSize == 0) ) // validate parameters
1075 return 0;
1076
1077 szLangA = (LPSTR)HEAP_malloc(nSize + 1);
1078 rc = VerLanguageNameA(wLang,
1079 szLangA,
1080 nSize);
1081 if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
1082 AsciiToUnicodeN(szLangA,
1083 szLang,
1084 nSize);
1085 HEAP_free(szLangA);
1086 return rc;
1087}
1088
1089
1090#endif
1091
Note: See TracBrowser for help on using the repository browser.