From 702e2a04884055a137d41f36f5d26f1024270c8d Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 21 Apr 2005 14:49:17 +0000 Subject: [PATCH] EnumSystemLocalesW() implementation. Certainly not full (doesn't support INSTALLED/SUPPORTED/etc flags) - but at least it does what is needed - enumerate locales. Other stuff is coming soon so intl.cpl could work. svn path=/trunk/; revision=14732 --- reactos/lib/kernel32/misc/lang.c | 91 ++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 3d5a0f0b117..1e9887f0b37 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -23,6 +23,8 @@ //static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); +//static RTL_CRITICAL_SECTION LocalesListLock; + /****************************************************************************** * @implemented @@ -281,7 +283,7 @@ EnumSystemLocalesA ( /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -290,8 +292,91 @@ EnumSystemLocalesW ( DWORD dwFlags ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + NTSTATUS result; + HANDLE langKey; + UNICODE_STRING langKeyName; + OBJECT_ATTRIBUTES objectAttributes; + ULONG index, length; + unsigned char fullInfo[sizeof(KEY_VALUE_FULL_INFORMATION)+255*2]; //FIXME: MAX_PATH*2 + PKEY_VALUE_FULL_INFORMATION pFullInfo; + + //TODO: Combine with EnumSystemLocalesA - maybe by having one common part, driven by some + // unicode/non-unicode flag. + + //FIXME: dwFlags is really not used, sorry + + // Check if enum proc is a real one + if (lpLocaleEnumProc == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + // Open language registry key + //FIXME: Should we use critical section here? + + RtlRosInitUnicodeStringFromLiteral(&langKeyName, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Nls\\Locale"); + + InitializeObjectAttributes(&objectAttributes, + &langKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + result = NtOpenKey(&langKey, + KEY_READ, + &objectAttributes); + + if (!NT_SUCCESS(result)) + return result; + + DPRINT1("Registry key succesfully opened\n"); + + length = sizeof(KEY_VALUE_FULL_INFORMATION) + 255*2;//MAX_PATH*sizeof(WCHAR); + pFullInfo = (PKEY_VALUE_FULL_INFORMATION)&fullInfo; + RtlZeroMemory(pFullInfo, length); + + index = 0; + + result = NtEnumerateValueKey(langKey, + index, + KeyValueFullInformation, + pFullInfo, + length, + &length); + + DPRINT1("First enumerate call result=%x\n", result); + while (result != STATUS_NO_MORE_ENTRIES) + { + int i; + TCHAR lpLocale[9]; + + // TODO: Here we should check, in case dwFlags & LCID_INSTALLED is specified, + // if this locale is really installed + // but for now we skip it + + for (i=0; i<8; i++) + lpLocale[i] = pFullInfo->Name[i]; + + lpLocale[8]=0; + + DPRINT1("Locale=%s\n", lpLocale); + + // Call Enum func + if (!lpLocaleEnumProc((LPWSTR)lpLocale)) + break; + + // Zero previous values + RtlZeroMemory(pFullInfo, length); + + index++; + result = NtEnumerateValueKey(langKey, index,KeyValueFullInformation, pFullInfo, length, &length); + } + + NtClose(langKey); + + return STATUS_SUCCESS; }