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

Last change on this file since 2802 was 2802, checked in by sandervl, 26 years ago

Added new logging feature

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