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

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

codepage updates

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