From 98ac389c31574b19b9def5dad96f5c6a964ede65 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 4 Dec 2004 13:59:41 +0000 Subject: [PATCH] Implement GetSystemDefaultUILanguage() and IsValidLocale(). svn path=/trunk/; revision=11911 --- reactos/lib/kernel32/misc/lang.c | 288 ++++++++++++++++++++---------- reactos/lib/kernel32/misc/stubs.c | 16 +- 2 files changed, 198 insertions(+), 106 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 94e57399c79..30d596d55bb 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.24 2004/10/20 03:46:27 jimtabor Exp $ +/* $Id: lang.c,v 1.25 2004/12/04 13:59:14 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -42,35 +42,36 @@ * GetUserDefaultLCID(), if lcid == LOCALE_USER_DEFAULT or LOCALE_NEUTRAL. * Otherwise, lcid with sublanguage changed to SUBLANG_DEFAULT. */ -LCID WINAPI ConvertDefaultLocale( LCID lcid ) +LCID WINAPI +ConvertDefaultLocale(LCID lcid) { - LANGID langid; + LANGID langid; - switch (lcid) - { + switch (lcid) + { case LOCALE_SYSTEM_DEFAULT: - lcid = GetSystemDefaultLCID(); - break; + lcid = GetSystemDefaultLCID(); + break; + case LOCALE_USER_DEFAULT: case LOCALE_NEUTRAL: - lcid = GetUserDefaultLCID(); - break; + lcid = GetUserDefaultLCID(); + break; + default: - /* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */ - langid = LANGIDFROMLCID(lcid); - if (SUBLANGID(langid) == SUBLANG_NEUTRAL) - { - langid = MAKELANGID(PRIMARYLANGID(langid), SUBLANG_DEFAULT); - lcid = MAKELCID(langid, SORTIDFROMLCID(lcid)); - } - } - return lcid; + /* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */ + langid = LANGIDFROMLCID(lcid); + if (SUBLANGID(langid) == SUBLANG_NEUTRAL) + { + langid = MAKELANGID(PRIMARYLANGID(langid), SUBLANG_DEFAULT); + lcid = MAKELCID(langid, SORTIDFROMLCID(lcid)); + } + } + + return lcid; } - - - /* * @unimplemented */ @@ -240,7 +241,7 @@ EnumSystemGeoID( BOOL STDCALL EnumSystemLanguageGroupsA( - LANGUAGEGROUP_ENUMPROCA lpLanguageGroupEnumProc, + LANGUAGEGROUP_ENUMPROCA pLangGroupEnumProc, DWORD dwFlags, LONG_PTR lParam) { @@ -254,8 +255,23 @@ EnumSystemLanguageGroupsA( */ BOOL STDCALL -EnumSystemLocalesW ( - LOCALE_ENUMPROCW lpLocaleEnumProc, +EnumSystemLanguageGroupsW( + LANGUAGEGROUP_ENUMPROCW pLangGroupEnumProc, + DWORD dwFlags, + LONG_PTR lParam) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + + +/* + * @unimplemented + */ +BOOL +STDCALL +EnumSystemLocalesA ( + LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags ) { @@ -269,8 +285,8 @@ EnumSystemLocalesW ( */ BOOL STDCALL -EnumSystemLocalesA ( - LOCALE_ENUMPROCA lpLocaleEnumProc, +EnumSystemLocalesW ( + LOCALE_ENUMPROCW lpLocaleEnumProc, DWORD dwFlags ) { @@ -877,47 +893,52 @@ INT STDCALL GetLocaleInfoA( LCID lcid, LCTYPE lctype, LPSTR buffer, INT len ) /* * @implemented */ -LANGID -STDCALL -GetSystemDefaultLangID (VOID) +LANGID STDCALL +GetSystemDefaultLangID(VOID) { - return LANGIDFROMLCID(GetSystemDefaultLCID()); + return LANGIDFROMLCID(GetSystemDefaultLCID()); } /* * @implemented */ -LCID -STDCALL -GetSystemDefaultLCID (VOID) +LCID STDCALL +GetSystemDefaultLCID(VOID) { - LCID lcid; - NtQueryDefaultLocale( FALSE, &lcid ); - return lcid; + LCID lcid; -// return SystemLocale; + NtQueryDefaultLocale(FALSE, &lcid); + + return lcid; } /* - * @unimplemented + * @implemented */ -LANGID -STDCALL +LANGID STDCALL GetSystemDefaultUILanguage(VOID) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + LANGID LanguageId; + NTSTATUS Status; + + Status = NtQueryInstallUILanguage(&LanguageId); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } + + return LanguageId; } /* * @implemented */ -LCID -STDCALL -GetThreadLocale (VOID) +LCID STDCALL +GetThreadLocale(VOID) { return NtCurrentTeb()->CurrentLocale; } @@ -926,53 +947,50 @@ GetThreadLocale (VOID) /* * @implemented */ -LANGID -STDCALL -GetUserDefaultLangID (VOID) +LANGID STDCALL +GetUserDefaultLangID(VOID) { - return LANGIDFROMLCID(GetUserDefaultLCID()); + return LANGIDFROMLCID(GetUserDefaultLCID()); } /* * @implemented */ -LCID -STDCALL -GetUserDefaultLCID (VOID) +LCID STDCALL +GetUserDefaultLCID(VOID) { - LCID lcid; - NTSTATUS Status; - - Status = NtQueryDefaultLocale(TRUE, &lcid); - if(!NT_SUCCESS(Status)) + LCID lcid; + NTSTATUS Status; + + Status = NtQueryDefaultLocale(TRUE, &lcid); + if (!NT_SUCCESS(Status)) { - SetLastErrorByStatus(Status); - return 0; + SetLastErrorByStatus(Status); + return 0; } - - return lcid; + + return lcid; } /* * @implemented */ -LANGID -STDCALL +LANGID STDCALL GetUserDefaultUILanguage(VOID) { - LANGID LangId; - NTSTATUS Status; - - Status = NtQueryDefaultUILanguage(&LangId); - if(!NT_SUCCESS(Status)) + LANGID LangId; + NTSTATUS Status; + + Status = NtQueryDefaultUILanguage(&LangId); + if (!NT_SUCCESS(Status)) { - SetLastErrorByStatus(Status); - return 0; + SetLastErrorByStatus(Status); + return 0; } - - return LangId; + + return LangId; } @@ -1003,36 +1021,124 @@ IsValidLanguageGroup( } - /****************************************************************************** - * @implemented - * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.44 - * - * IsValidLocale (KERNEL32.@) + * IsValidLocale * * Determine if a locale is valid. * * PARAMS - * lcid [I] LCID of the locale to check - * flags [I] LCID_SUPPORTED = Valid, LCID_INSTALLED = Valid and installed on the system + * Locale [I] LCID of the locale to check + * dwFlags [I] LCID_SUPPORTED = Valid + * LCID_INSTALLED = Valid and installed on the system * * RETURN - * TRUE, if lcid is valid, + * TRUE, if Locale is valid, * FALSE, otherwise. * - * NOTES - * Wine does not currently make the distinction between supported and installed. All - * languages supported are installed by default. + * @implemented */ -BOOL STDCALL -IsValidLocale( - LCID lcid, - DWORD flags - ) +BOOL STDCALL +IsValidLocale(LCID Locale, + DWORD dwFlags) { - /* check if language is registered in the kernel32 resources */ - return FindResourceExW( hCurrentModule, (LPWSTR)RT_STRING, - (LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0; + OBJECT_ATTRIBUTES ObjectAttributes; + PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + WCHAR ValueNameBuffer[9]; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + ULONG KeyInfoSize; + ULONG ReturnedSize; + HANDLE KeyHandle; + PWSTR ValueData; + NTSTATUS Status; + + DPRINT("IsValidLocale() called\n"); + + if ((dwFlags & ~(LCID_SUPPORTED | LCID_INSTALLED)) || + (dwFlags == (LCID_SUPPORTED | LCID_INSTALLED))) + { + DPRINT("Invalid flags: %lx\n", dwFlags); + return FALSE; + } + + if (Locale & 0xFFFF0000) + { + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Nls\\Locale\\Alternate Sorts"); + } + else + { + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Nls\\Locale"); + } + + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenKey(&KeyHandle, + KEY_QUERY_VALUE, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + swprintf(ValueNameBuffer, L"%08lx", (ULONG)Locale); + RtlInitUnicodeString(&ValueName, ValueNameBuffer); + + KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 4 * sizeof(WCHAR); + KeyInfo = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + KeyInfoSize); + if (KeyInfo == NULL) + { + DPRINT("RtlAllocateHeap() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + Status = NtQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + KeyInfo, + KeyInfoSize, + &ReturnedSize); + NtClose(KeyHandle); + + if (!NT_SUCCESS(Status)) + { + DPRINT("NtQueryValueKey() failed (Status %lx)\n", Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + return FALSE; + } + + if (dwFlags & LCID_SUPPORTED) + { + DPRINT("Locale is supported\n"); + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + return TRUE; + } + + ValueData = (PWSTR)&KeyInfo->Data[0]; + if ((dwFlags & LCID_INSTALLED) && + (KeyInfo->Type == REG_SZ) && + (KeyInfo->DataLength == 2 * sizeof(WCHAR)) && + (ValueData[0] == L'1')) + { + DPRINT("Locale is supported and installed\n"); + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + return TRUE; + } + + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + + DPRINT("IsValidLocale() called\n"); + + return FALSE; } diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 5538cee703f..50aad94997d 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.94 2004/10/20 03:46:27 jimtabor Exp $ +/* $Id: stubs.c,v 1.95 2004/12/04 13:59:41 ekohl Exp $ * * KERNEL32.DLL stubs (STUB functions) * Remove from this file, if you implement them. @@ -1693,20 +1693,6 @@ VerifyVersionInfoA( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -EnumSystemLanguageGroupsW( - LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc, - DWORD dwFlags, - LONG_PTR lParam) -{ - STUB; - return 0; -} - /* * @unimplemented */