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

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

Updates for TEB changes

File size: 33.8 KB
Line 
1/* $Id: lang.cpp,v 1.31 2000-11-21 11:35:08 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
31static ULONG defaultLanguage = 0;
32//******************************************************************************
33//******************************************************************************
34ULONG GetLanguageId()
35{
36 if(defaultLanguage == 0) {
37 switch(OSLibQueryCountry()) {
38 case CC_USA:
39 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
40 break;
41 case CC_CANADA:
42 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
43 break;
44 case CC_LATIN_AMERICA:
45 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
46 break;
47 case CC_GREECE:
48 defaultLanguage = MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
49 break;
50 case CC_NETHERLANDS:
51 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
52 break;
53 case CC_BELGIUM:
54 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN);
55 break;
56 case CC_FRANCE:
57 defaultLanguage = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
58 break;
59 case CC_SPAIN:
60 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
61 break;
62 case CC_ITALY:
63 defaultLanguage = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
64 break;
65 case CC_SWITZERLAND:
66 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
67 break;
68 case CC_AUSTRIA:
69 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
70 break;
71 case CC_UNITED_KINGDOM:
72 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
73 break;
74 case CC_DENMARK:
75 defaultLanguage = MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
76 break;
77 case CC_SWEDEN:
78 defaultLanguage = MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
79 break;
80 case CC_NORWAY:
81 defaultLanguage = MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
82 break;
83 case CC_WEST_GERMANY:
84 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
85 break;
86 case CC_MEXICO:
87 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
88 break;
89 case CC_BRAZIL:
90 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
91 break;
92 case CC_AUSTRALIA:
93 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
94 break;
95 case CC_NEW_ZEALAND:
96 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
97 break;
98 case CC_JAPAN:
99 defaultLanguage = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
100 break;
101 case CC_KOREA:
102 defaultLanguage = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
103 break;
104 case CC_CHINA:
105 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
106 break;
107 case CC_TAIWAN:
108 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
109 break;
110 case CC_TURKEY:
111 defaultLanguage = MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
112 break;
113 case CC_PORTUGAL:
114 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
115 break;
116 case CC_LUXEMBOURG:
117 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
118 break;
119 case CC_ICELAND:
120 defaultLanguage = MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
121 break;
122 case CC_FINLAND:
123 defaultLanguage = MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
124 break;
125 case CC_CZECH_REPUBLIC:
126 defaultLanguage = MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
127 break;
128 case CC_SLOVAK_REPUBLIC:
129 defaultLanguage = MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
130 break;
131 case CC_POLAND:
132 defaultLanguage = MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT);
133 break;
134 default:
135 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
136 break;
137 }
138 }
139 return defaultLanguage;
140}
141//******************************************************************************
142//******************************************************************************
143BOOL WIN32API IsValidCodePage(UINT CodePage)
144{
145 dprintf(("KERNEL32: IsValidCodePage %d not implemented", CodePage));
146 return(TRUE);
147}
148//******************************************************************************
149//******************************************************************************
150LCID WIN32API GetUserDefaultLCID(void)
151{
152 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
153 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
154}
155//******************************************************************************
156//******************************************************************************
157LCID WIN32API GetSystemDefaultLCID(void)
158{
159 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)));
160 return(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); //US English
161}
162//******************************************************************************
163//******************************************************************************
164LANGID WIN32API GetUserDefaultLangID()
165{
166 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
167 return(GetLanguageId());
168}
169//******************************************************************************
170//******************************************************************************
171LANGID WIN32API GetSystemDefaultLangID(void)
172{
173 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)));
174 return(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
175}
176
177//******************************************************************************
178//******************************************************************************
179static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
180{
181 if (wbuf)
182 {
183 if (*pLen > UniStrlen(lpUniStr))
184 UniStrcpy(wbuf,lpUniStr);
185 else
186 {
187 SetLastError(ERROR_INSUFFICIENT_BUFFER);
188 *pLen=0;
189 return FALSE;
190 }
191 }
192
193 *pLen=UniStrlen(lpUniStr)+1; // + null terminator
194
195 return TRUE;
196}
197//******************************************************************************
198//******************************************************************************
199static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
200{
201 if (wbuf)
202 {
203// if (*pLen >= sizeof(WCHAR))
204 if (*pLen >= 2)
205 {
206 wbuf[0]=(WCHAR)'0'+wcUniChar;
207 wbuf[1]=0;
208 }
209 else
210 {
211 SetLastError(ERROR_INSUFFICIENT_BUFFER);
212 *pLen=0;
213 return FALSE;
214 }
215 }
216
217 *pLen=2;
218
219 return TRUE;
220}
221
222/*****************************************************************************
223 * Name : DWORD GetLocaleInfoW
224 * Purpose : The GetLocaleInfoW function returns specific locale information
225 * Parameters: LCID lcid locale identifier
226 * LCTYPE LCType type of information
227 * LPSTRW wbuf address of buffer for information
228 * int len size of buffer
229 * Variables :
230 * Result : size of target buffer
231 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
232 *
233 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
234 * LOCALE_IMEASURE - return '0' like English US
235 * LOCALE_INEGNUMBER - return '1' like English US
236 * LOCALE_ICURRDIGITS - return '2' like English US
237 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
238 * LOCALE_SGROUPING and
239 * LOCALE_SMONGROUPING are tested only with Polish & English languages
240 * LOCALE_SMONTHNAME13 and
241 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
242 * LOCALE_FONTSIGNATURE - return empty string like English US
243 *
244 * Status : FULLY TESTED
245 *
246 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
247 *****************************************************************************/
248ODINFUNCTION4(int, GetLocaleInfoW, LCID, lcid, LCTYPE, LCType, LPWSTR, wbuf,
249 int, len)
250{
251 LocaleObject locale_object = NULL;
252 struct UniLconv *puni_lconv = NULL;
253 WCHAR *pInfoItem;
254 int rc;
255 COUNTRYCODE Country = {0};
256 COUNTRYINFO CtryInfo = {0};
257 ULONG ulInfoLen = 0;
258
259 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
260
261 if (len && (! wbuf) )
262 {
263 SetLastError(ERROR_INSUFFICIENT_BUFFER);
264 return 0;
265 }
266
267 if (wbuf) *wbuf==0;
268
269 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
270
271 if ( rc == ULS_SUCCESS )
272 {
273 UniQueryLocaleInfo(locale_object, &puni_lconv);
274
275 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
276
277 ulInfoLen = len; // Now we use this variable as returned length info
278
279 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
280
281 switch(LCType)
282 {
283 case LOCALE_SDECIMAL:
284 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
285 break;
286
287 case LOCALE_IMEASURE: // Fixme!
288 // only like English US
289 LocaleFromUniChar(0,wbuf,&ulInfoLen);
290 break;
291
292 case LOCALE_INEGNUMBER: // Fixme!
293 // only like English US
294 LocaleFromUniChar(1,wbuf,&ulInfoLen);
295 break;
296
297 case LOCALE_ICURRDIGITS:// Fixme!
298 // only like English US
299 LocaleFromUniChar(2,wbuf,&ulInfoLen);
300 break;
301
302 case LOCALE_STHOUSAND:
303 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
304 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
305 if(defaultLanguage == CC_CZECH_REPUBLIC) {
306 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
307 }
308 break;
309
310 case LOCALE_SGROUPING: // tested only with Polish & English
311 if (wbuf)
312 {
313 if (puni_lconv->grouping)
314 {
315 if (len >= 3*sizeof(WCHAR))
316 {
317 wbuf[0]='0'+*puni_lconv->grouping;
318 wbuf[1]=(WCHAR)';';
319 wbuf[2]=(WCHAR)'0';
320 wbuf[3]=0;
321 ulInfoLen=4;
322 }
323 else
324 {
325 SetLastError(ERROR_INSUFFICIENT_BUFFER);
326 break;
327 }
328 }
329 else
330 {
331 wbuf[0]=20; // Windows return space!!
332 ulInfoLen=2;
333 }
334 }
335 else
336 ulInfoLen=2;
337 break;
338
339 case LOCALE_SMONGROUPING: // tested only with Polish & English
340 if (wbuf)
341 {
342 if (puni_lconv->mon_grouping)
343 {
344 if (len >= 3*sizeof(WCHAR))
345 {
346 wbuf[0]='0'+*puni_lconv->mon_grouping;
347 wbuf[1]=(WCHAR)';';
348 wbuf[2]=(WCHAR)'0';
349 wbuf[3]=0;
350 ulInfoLen=4;
351 }
352 else
353 {
354 SetLastError(ERROR_INSUFFICIENT_BUFFER);
355 break;
356 }
357 }
358 else
359 {
360 wbuf[0]=20; // Windows return space!!
361 ulInfoLen=2;
362 }
363 }
364 else
365 ulInfoLen=2;
366 break;
367
368
369 case LOCALE_SCURRENCY:
370 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
371 break;
372
373 case LOCALE_SMONDECIMALSEP:
374 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
375 break;
376
377 case LOCALE_SMONTHOUSANDSEP:
378 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
379 break;
380
381 case LOCALE_SPOSITIVESIGN:
382 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
383 break;
384
385 case LOCALE_SNEGATIVESIGN:
386 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
387 break;
388
389 case LOCALE_IPOSSIGNPOSN:
390 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
391 break;
392
393 case LOCALE_INEGSIGNPOSN:
394 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
395 break;
396
397 case LOCALE_IPOSSYMPRECEDES:
398 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
399 break;
400
401 case LOCALE_IPOSSEPBYSPACE:
402 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
403 break;
404
405 case LOCALE_INEGSYMPRECEDES:
406 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
407 break;
408
409 case LOCALE_INEGSEPBYSPACE:
410 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
411 break;
412
413 case LOCALE_S1159:
414 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
415 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
416 UniFreeMem(pInfoItem);
417 break;
418
419 case LOCALE_S2359:
420 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
421 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
422 UniFreeMem(pInfoItem);
423 break;
424
425 case LOCALE_IDEFAULTLANGUAGE:
426 case LOCALE_ILANGUAGE:
427 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
428 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
429 UniFreeMem(pInfoItem);
430 break;
431
432 case LOCALE_INEGCURR:
433 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
434 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
435 UniFreeMem(pInfoItem);
436 break;
437
438 case LOCALE_ICURRENCY:
439 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
440 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
441 UniFreeMem(pInfoItem);
442 break;
443
444
445
446 case LOCALE_SNATIVELANGNAME:
447 case LOCALE_SLANGUAGE:
448 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
449 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
450 UniFreeMem(pInfoItem);
451 break;
452
453 case LOCALE_SABBREVLANGNAME:
454 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
455 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
456 UniFreeMem(pInfoItem);
457 break;
458
459 case LOCALE_IDEFAULTCOUNTRY:
460 case LOCALE_ICOUNTRY:
461 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
462 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
463 UniFreeMem(pInfoItem);
464 break;
465
466 case LOCALE_SENGLANGUAGE:
467 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
468 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
469 UniFreeMem(pInfoItem);
470 break;
471
472 case LOCALE_SENGCOUNTRY:
473 case LOCALE_SCOUNTRY:
474 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
475 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
476 UniFreeMem(pInfoItem);
477 break;
478
479 case LOCALE_SABBREVCTRYNAME:
480 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
481 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
482 UniFreeMem(pInfoItem);
483 break;
484
485 case LOCALE_SNATIVECTRYNAME:
486 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
487 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
488 UniFreeMem(pInfoItem);
489 break;
490
491 case LOCALE_SNATIVEDIGITS:
492 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
493 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
494 UniFreeMem(pInfoItem);
495 break;
496
497
498 case LOCALE_IDEFAULTCODEPAGE:
499 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
500 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
501 UniFreeMem(pInfoItem);
502 break;
503
504 case LOCALE_IDEFAULTANSICODEPAGE:
505 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
506 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
507 UniFreeMem(pInfoItem);
508 break;
509
510 case LOCALE_IDEFAULTMACCODEPAGE:
511 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
512 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
513 UniFreeMem(pInfoItem);
514 break;
515
516 case LOCALE_SLIST:
517 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
518 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
519 UniFreeMem(pInfoItem);
520 break;
521
522 case LOCALE_SINTLSYMBOL:
523 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
524 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
525 UniFreeMem(pInfoItem);
526 break;
527
528 case LOCALE_SDAYNAME7:
529 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
530 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
531 UniFreeMem(pInfoItem);
532 break;
533
534 case LOCALE_SDAYNAME1:
535 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
536 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
537 UniFreeMem(pInfoItem);
538 break;
539
540 case LOCALE_SDAYNAME2:
541 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
542 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
543 UniFreeMem(pInfoItem);
544 break;
545
546 case LOCALE_SDAYNAME3:
547 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
548 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
549 UniFreeMem(pInfoItem);
550 break;
551
552 case LOCALE_SDAYNAME4:
553 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
554 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
555 UniFreeMem(pInfoItem);
556 break;
557
558 case LOCALE_SDAYNAME5:
559 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
560 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
561 UniFreeMem(pInfoItem);
562 break;
563
564 case LOCALE_SDAYNAME6:
565 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
566 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
567 UniFreeMem(pInfoItem);
568 break;
569
570 case LOCALE_SABBREVDAYNAME7:
571 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
572 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
573 UniFreeMem(pInfoItem);
574 break;
575
576 case LOCALE_SABBREVDAYNAME1:
577 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
578 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
579 UniFreeMem(pInfoItem);
580 break;
581
582 case LOCALE_SABBREVDAYNAME2:
583 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
584 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
585 UniFreeMem(pInfoItem);
586 break;
587
588 case LOCALE_SABBREVDAYNAME3:
589 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
590 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
591 UniFreeMem(pInfoItem);
592 break;
593
594 case LOCALE_SABBREVDAYNAME4:
595 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
596 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
597 UniFreeMem(pInfoItem);
598 break;
599
600 case LOCALE_SABBREVDAYNAME5:
601 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
602 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
603 UniFreeMem(pInfoItem);
604 break;
605
606 case LOCALE_SABBREVDAYNAME6:
607 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
608 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
609 UniFreeMem(pInfoItem);
610 break;
611
612 case LOCALE_SMONTHNAME1:
613 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
614 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
615 UniFreeMem(pInfoItem);
616 break;
617
618 case LOCALE_SMONTHNAME2:
619 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
620 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
621 UniFreeMem(pInfoItem);
622 break;
623
624 case LOCALE_SMONTHNAME3:
625 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
626 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
627 UniFreeMem(pInfoItem);
628 break;
629
630 case LOCALE_SMONTHNAME4:
631 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
632 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
633 UniFreeMem(pInfoItem);
634 break;
635
636 case LOCALE_SMONTHNAME5:
637 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
638 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
639 UniFreeMem(pInfoItem);
640 break;
641
642 case LOCALE_SMONTHNAME6:
643 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
644 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
645 UniFreeMem(pInfoItem);
646 break;
647
648 case LOCALE_SMONTHNAME7:
649 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
650 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
651 UniFreeMem(pInfoItem);
652 break;
653
654 case LOCALE_SMONTHNAME8:
655 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
656 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
657 UniFreeMem(pInfoItem);
658 break;
659
660 case LOCALE_SMONTHNAME9:
661 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
662 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
663 UniFreeMem(pInfoItem);
664 break;
665
666 case LOCALE_SMONTHNAME10:
667 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
668 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
669 UniFreeMem(pInfoItem);
670 break;
671
672 case LOCALE_SMONTHNAME11:
673 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
674 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
675 UniFreeMem(pInfoItem);
676 break;
677
678 case LOCALE_SMONTHNAME12:
679 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
680 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
681 UniFreeMem(pInfoItem);
682 break;
683
684 case LOCALE_FONTSIGNATURE: // FixMe!!!
685 case LOCALE_SABBREVMONTHNAME13:
686 case LOCALE_SMONTHNAME13:
687 if(wbuf) {
688 *wbuf = 0;
689 }
690 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
691 break;
692
693 case LOCALE_SABBREVMONTHNAME1:
694 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
695 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
696 UniFreeMem(pInfoItem);
697 break;
698
699 case LOCALE_SABBREVMONTHNAME2:
700 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
701 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
702 UniFreeMem(pInfoItem);
703 break;
704
705 case LOCALE_SABBREVMONTHNAME3:
706 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
707 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
708 UniFreeMem(pInfoItem);
709 break;
710
711 case LOCALE_SABBREVMONTHNAME4:
712 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
713 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
714 UniFreeMem(pInfoItem);
715 break;
716
717 case LOCALE_SABBREVMONTHNAME5:
718 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
719 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
720 UniFreeMem(pInfoItem);
721 break;
722
723 case LOCALE_SABBREVMONTHNAME6:
724 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
725 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
726 UniFreeMem(pInfoItem);
727 break;
728
729 case LOCALE_SABBREVMONTHNAME7:
730 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
731 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
732 UniFreeMem(pInfoItem);
733 break;
734
735 case LOCALE_SABBREVMONTHNAME8:
736 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
737 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
738 UniFreeMem(pInfoItem);
739 break;
740
741 case LOCALE_SABBREVMONTHNAME9:
742 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
743 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
744 UniFreeMem(pInfoItem);
745 break;
746
747 case LOCALE_SABBREVMONTHNAME10:
748 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
749 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
750 UniFreeMem(pInfoItem);
751 break;
752
753 case LOCALE_SABBREVMONTHNAME11:
754 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
755 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
756 UniFreeMem(pInfoItem);
757 break;
758
759 case LOCALE_SABBREVMONTHNAME12:
760 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
761 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
762 UniFreeMem(pInfoItem);
763 break;
764
765 case LOCALE_SDATE:
766 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
767 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
768 UniFreeMem(pInfoItem);
769 break;
770
771 case LOCALE_STIME:
772 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
773 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
774 UniFreeMem(pInfoItem);
775 break;
776
777 case LOCALE_IDATE:
778 case LOCALE_ILDATE:
779 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
780 break;
781
782 case LOCALE_ITIME:
783 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
784 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
785 UniFreeMem(pInfoItem);
786 break;
787
788 case LOCALE_SSHORTDATE:
789 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
790 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
791 UniFreeMem(pInfoItem);
792 break;
793
794 case LOCALE_SLONGDATE:
795 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
796 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
797 UniFreeMem(pInfoItem);
798 break;
799
800
801 case LOCALE_STIMEFORMAT:
802 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
803 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
804 UniFreeMem(pInfoItem);
805 break;
806
807 case LOCALE_SISO639LANGNAME:
808 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
809 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
810 UniFreeMem(pInfoItem);
811 break;
812
813 case LOCALE_SISO3166CTRYNAME:
814 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
815 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
816 UniFreeMem(pInfoItem);
817 break;
818
819 default:
820 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
821 if (wbuf)
822 {
823 wbuf[0] = (WCHAR) '1';
824 wbuf[1] = 0;
825 }
826 ulInfoLen=2;
827 break;
828
829 }
830 UniFreeLocaleInfo(puni_lconv);
831 UniFreeLocaleObject(locale_object);
832 }
833 else
834 return (0);
835
836 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
837
838 return (ulInfoLen);
839}
840/*****************************************************************************
841 * Name : DWORD GetLocaleInfoA
842 * Purpose : The GetLocaleInfoA function returns specific locale information
843 * Parameters: LCID lcid locale identifier
844 * LCTYPE LCType type of information
845 * LPSTR buf address of buffer for information
846 * int len size of buffer
847 * Variables :
848 * Result : size of target buffer
849 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
850 * look into GetLocaleInfoW
851 *
852 * Status : TESTED
853 *
854 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
855 *****************************************************************************/
856ODINFUNCTION4(int, GetLocaleInfoA, LCID, lcid, LCTYPE, LCType, LPSTR, buf,
857 int, len)
858{
859 LPWSTR lpWStr;
860 int ret_len;
861
862 if (len && (! buf) )
863 {
864 SetLastError(ERROR_INSUFFICIENT_BUFFER);
865 return 0;
866 }
867
868 dprintf(("KERNEL32: OS2GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
869
870 if (buf)
871 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
872 else
873 lpWStr=NULL; // Query for buffer size
874
875 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
876
877 if (ret_len && buf)
878 UnicodeToAscii(lpWStr,buf);
879
880 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
881
882 dprintf(("KERNEL32: OS2GetLocaleInfoA returned %d\n",ret_len));
883
884 return (ret_len);
885}
886//******************************************************************************
887//******************************************************************************
888LCID WIN32API GetThreadLocale()
889{
890 TEB *teb = GetThreadTEB();
891
892 if(teb == NULL) {
893 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
894 return FALSE;
895 }
896 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
897 return(teb->o.odin.lcid);
898}
899//******************************************************************************
900//******************************************************************************
901BOOL WIN32API SetThreadLocale(LCID locale)
902{
903 TEB *teb = GetThreadTEB();
904
905 if(teb == NULL) {
906 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
907 return FALSE;
908 }
909 dprintf(("KERNEL32: SetThreadLocale %x", locale));
910 teb->o.odin.lcid = locale;
911 return(TRUE);
912}
913//******************************************************************************
914//******************************************************************************
915
916
917
918#if 0
919PHS: disabled for ole2nls.cpp
920
921/*****************************************************************************
922 * Name : BOOL SetLocaleInfoA
923 * Purpose : The SetLocaleInfoA function sets an item of locale information.
924 * It does so by making an entry in the process portion of the
925 * locale table. This setting only affects the user override portion
926 * of the locale settings; it does not set the system defaults.
927 * Only certain types of locale information, or LCTYPE values, can
928 * be set by this function. See the following Remarks section for a
929 * list of valid LCTYPE values.
930 * The locale information is always passed in as a null-terminated
931 * Unicode string in the Unicode (W) version of the function, and as
932 * a null-terminated ANSI string in the ANSI (A) version. No integers
933 * are allowed by this function; any numeric values must be specified
934 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
935 * noted in Locale Identifiers.
936 * Parameters: LCID Locale locale identifier
937 * LCTYPE LCType type of information to set
938 * LPCTSTR lpLCData pointer to information to set
939 * Variables :
940 * Result : TRUE / FALSE
941 * Remark :
942 * Status : UNTESTED STUB
943 *
944 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
945 *****************************************************************************/
946
947BOOL WIN32API SetLocaleInfoA(LCID Locale,
948 LCTYPE LCType,
949 LPCSTR lpLCData)
950{
951 dprintf(("KERNEL32: SetLocaleInfoA(%08xh,%08xh,%08xh) not implemented.\n",
952 Locale,
953 LCType,
954 lpLCData));
955
956 return (FALSE);
957}
958
959
960/*****************************************************************************
961 * Name : BOOL SetLocaleInfoW
962 * Purpose : The SetLocaleInfoW function sets an item of locale information.
963 * It does so by making an entry in the process portion of the
964 * locale table. This setting only affects the user override portion
965 * of the locale settings; it does not set the system defaults.
966 * Only certain types of locale information, or LCTYPE values, can
967 * be set by this function. See the following Remarks section for a
968 * list of valid LCTYPE values.
969 * The locale information is always passed in as a null-terminated
970 * Unicode string in the Unicode (W) version of the function, and as
971 * a null-terminated ANSI string in the ANSI (A) version. No integers
972 * are allowed by this function; any numeric values must be specified
973 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
974 * noted in Locale Identifiers.
975 * Parameters: LCID Locale locale identifier
976 * LCTYPE LCType type of information to set
977 * LPCTSTR lpLCData pointer to information to set
978 * Variables :
979 * Result : TRUE / FALSE
980 * Remark :
981 * Status : UNTESTED STUB
982 *
983 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
984 *****************************************************************************/
985
986BOOL WIN32API SetLocaleInfoW(LCID Locale,
987 LCTYPE LCType,
988 LPCWSTR lpLCData)
989{
990 dprintf(("KERNEL32: SetLocaleInfoW(%08xh,%08xh,%08xh) not implemented.\n",
991 Locale,
992 LCType,
993 lpLCData));
994
995 return (FALSE);
996}
997
998
999/*****************************************************************************
1000 * Name :
1001 * Purpose :
1002 * Parameters:
1003 * Variables :
1004 * Result :
1005 * Remark :
1006 * Status : UNTESTED STUB
1007 *
1008 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1009 *****************************************************************************/
1010
1011ODINFUNCTION3(DWORD,VerLanguageNameA,DWORD, wLang,
1012 LPSTR, szLang,
1013 DWORD, nSize)
1014{
1015 char buffer[80];
1016 LPCSTR name;
1017 DWORD result;
1018
1019 dprintf(("KERNEL32: VerLanguageNameA not implemented"));
1020
1021 /*
1022 * First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1023 * from the registry.
1024 */
1025
1026#if 0
1027PHS: disabled because if interlinkage with registry
1028 sprintf( buffer,
1029 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
1030 wLang );
1031
1032 result = RegQueryValueA(HKEY_LOCAL_MACHINE,
1033 buffer,
1034 szLang,
1035 (LPLONG)&nSize );
1036 if (result == ERROR_SUCCESS ||
1037 result == ERROR_MORE_DATA)
1038 return nSize;
1039#endif
1040
1041 /*
1042 * If that fails, use the internal table
1043 * (actually, Windows stores the names in a string table resource ...)
1044 */
1045
1046 lstrcpynA(szLang,
1047 "Language-Neutral",
1048 nSize);
1049
1050 return strlen(szLang);
1051}
1052
1053/*****************************************************************************
1054 * Name :
1055 * Purpose :
1056 * Parameters:
1057 * Variables :
1058 * Result :
1059 * Remark :
1060 * Status : UNTESTED STUB
1061 *
1062 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1063 *****************************************************************************/
1064
1065ODINFUNCTION3(DWORD,VerLanguageNameW,DWORD, wLang,
1066 LPWSTR, szLang,
1067 DWORD, nSize)
1068{
1069 LPSTR szLangA;
1070 DWORD rc;
1071
1072 if ( (szLang == NULL) ||
1073 (nSize == 0) ) // validate parameters
1074 return 0;
1075
1076 szLangA = (LPSTR)HEAP_malloc(nSize + 1);
1077 rc = VerLanguageNameA(wLang,
1078 szLangA,
1079 nSize);
1080 if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
1081 AsciiToUnicodeN(szLangA,
1082 szLang,
1083 nSize);
1084 HEAP_free(szLangA);
1085 return rc;
1086}
1087
1088
1089#endif
Note: See TracBrowser for help on using the repository browser.