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

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

GetFileTime bugfix + FindResource(Ex)A/W changes + setup thread security objects during creation

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