Author: cwittich Date: Sun Oct 25 22:02:58 2009 New Revision: 43754
URL: http://svn.reactos.org/svn/reactos?rev=43754&view=rev Log: partial kernel32 GetLocaleInfo sync to wine 1.1.32
Modified: trunk/reactos/dll/win32/kernel32/misc/lang.c
Modified: trunk/reactos/dll/win32/kernel32/misc/lang.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/lan... ============================================================================== --- trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] Sun Oct 25 22:02:58 2009 @@ -28,7 +28,8 @@
#define LOCALE_RETURN_NUMBER 0x20000000 #define LOCALE_USE_CP_ACP 0x40000000 -#define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) +#define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|\ + LOCALE_RETURN_NUMBER|LOCALE_RETURN_GENITIVE_NAMES) #define CALINFO_MAX_YEAR 2029
//static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); @@ -52,6 +53,62 @@
static const WCHAR szLocaleKeyName[] = L"\Registry\Machine\System\CurrentControlSet\Control\NLS\Locale"; static const WCHAR szLangGroupsKeyName[] = L"\Registry\Machine\System\CurrentControlSet\Control\NLS\Language Groups"; + +/*********************************************************************** + * is_genitive_name_supported + * + * Determine could LCTYPE basically support genitive name form or not. + */ +static BOOL is_genitive_name_supported( LCTYPE lctype ) +{ + switch(lctype & 0xffff) + { + case LOCALE_SMONTHNAME1: + case LOCALE_SMONTHNAME2: + case LOCALE_SMONTHNAME3: + case LOCALE_SMONTHNAME4: + case LOCALE_SMONTHNAME5: + case LOCALE_SMONTHNAME6: + case LOCALE_SMONTHNAME7: + case LOCALE_SMONTHNAME8: + case LOCALE_SMONTHNAME9: + case LOCALE_SMONTHNAME10: + case LOCALE_SMONTHNAME11: + case LOCALE_SMONTHNAME12: + case LOCALE_SMONTHNAME13: + return TRUE; + default: + return FALSE; + } +} + +/*********************************************************************** + * create_registry_key + * + * Create the Control Panel\International registry key. + */ +static inline HANDLE create_registry_key(void) +{ + static const WCHAR intlW[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\', + 'I','n','t','e','r','n','a','t','i','o','n','a','l',0}; + OBJECT_ATTRIBUTES attr; + UNICODE_STRING nameW; + HANDLE hkey; + + if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &hkey ) != STATUS_SUCCESS) return 0; + + attr.Length = sizeof(attr); + attr.RootDirectory = hkey; + attr.ObjectName = &nameW; + attr.Attributes = 0; + attr.SecurityDescriptor = NULL; + attr.SecurityQualityOfService = NULL; + RtlInitUnicodeString( &nameW, intlW ); + + if (NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != STATUS_SUCCESS) hkey = 0; + NtClose( attr.RootDirectory ); + return hkey; +}
/****************************************************************************** * @implemented @@ -1751,6 +1808,13 @@ SetLastError( ERROR_INVALID_PARAMETER ); return 0; } + if (LCType & LOCALE_RETURN_GENITIVE_NAMES && + !is_genitive_name_supported( LCType )) + { + SetLastError( ERROR_INVALID_FLAGS ); + return 0; + } + if (!cchData) lpLCData = NULL;
if (Locale == LOCALE_NEUTRAL || Locale == LOCALE_SYSTEM_DEFAULT) Locale = GetSystemDefaultLCID(); @@ -1781,10 +1845,23 @@ return 0;
ch = LockResource( hMem ); - for (i = 0; i < (int)(LCType & 0x0f); i++) ch += *ch + 1; + for (i = 0; i < (LCType & 0x0f); i++) ch += *ch + 1;
if (uiFlags & LOCALE_RETURN_NUMBER) nRet = sizeof(UINT) / sizeof(WCHAR); - else nRet = (LCType == LOCALE_FONTSIGNATURE) ? *ch : *ch + 1; + else if (is_genitive_name_supported( LCType ) && *ch) + { + /* genitive form's stored after a null separator from a nominative */ + for (i = 1; i <= *ch; i++) if (!ch[i]) break; + + if (i <= *ch && (uiFlags & LOCALE_RETURN_GENITIVE_NAMES)) + { + nRet = *ch - i + 1; + ch += i; + } + else nRet = i; + } + else + nRet = (LCType == LOCALE_FONTSIGNATURE) ? *ch : *ch + 1;
if (!lpLCData) return nRet;
@@ -2092,6 +2169,12 @@ SetLastError( ERROR_INVALID_PARAMETER ); return 0; } + if (lctype & LOCALE_RETURN_GENITIVE_NAMES ) + { + SetLastError( ERROR_INVALID_FLAGS ); + return 0; + } + if (!len) buffer = NULL;
if (!(lenW = GetLocaleInfoW( lcid, lctype, NULL, 0 ))) return 0; @@ -2234,35 +2317,6 @@ }
-/*********************************************************************** - * create_registry_key - * - * Create the Control Panel\International registry key. - */ -static inline HANDLE create_registry_key(void) -{ - static const WCHAR intlW[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\', - 'I','n','t','e','r','n','a','t','i','o','n','a','l',0}; - OBJECT_ATTRIBUTES attr; - UNICODE_STRING nameW; - HANDLE hkey; - - if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &hkey ) != STATUS_SUCCESS) return 0; - - attr.Length = sizeof(attr); - attr.RootDirectory = hkey; - attr.ObjectName = &nameW; - attr.Attributes = 0; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; - RtlInitUnicodeString( &nameW, intlW ); - - if (NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != STATUS_SUCCESS) hkey = 0; - NtClose( attr.RootDirectory ); - return hkey; -} - - /* * @unimplemented */