Alexandre Julliard : kernelbase: Reimplement Internal_EnumCalendarInfo() using the locale.nls data.
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 16:19:07 CDT 2022
Module: wine
Branch: master
Commit: 8576c3e1312faa6e8e6bcdd60f620161b82fd3c7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8576c3e1312faa6e8e6bcdd60f620161b82fd3c7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Apr 7 11:22:45 2022 +0200
kernelbase: Reimplement Internal_EnumCalendarInfo() using the locale.nls data.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/locale.c | 12 +++++++----
dlls/kernelbase/locale.c | 56 +++++++++++++++++++++++++++++++++---------------
2 files changed, 47 insertions(+), 21 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index d46a2aa1580..6af66375def 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -38,12 +38,14 @@
#include "winerror.h"
#include "winver.h"
#include "kernel_private.h"
-#include "wine/heap.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(nls);
-extern BOOL WINAPI Internal_EnumCalendarInfo( CALINFO_ENUMPROCW proc, LCID lcid, CALID id,
+extern const NLS_LOCALE_DATA * WINAPI NlsValidateLocale( LCID *lcid, ULONG flags );
+
+extern BOOL WINAPI Internal_EnumCalendarInfo( CALINFO_ENUMPROCW proc,
+ const NLS_LOCALE_DATA *locale, CALID id,
CALTYPE type, BOOL unicode, BOOL ex,
BOOL exex, LPARAM lparam );
extern BOOL WINAPI Internal_EnumDateFormats( DATEFMT_ENUMPROCW proc, LCID lcid, DWORD flags, BOOL unicode,
@@ -299,7 +301,8 @@ BOOL WINAPI EnumLanguageGroupLocalesA( LANGGROUPLOCALE_ENUMPROCA proc, LGRPID id
*/
BOOL WINAPI EnumCalendarInfoA( CALINFO_ENUMPROCA proc, LCID lcid, CALID id, CALTYPE type )
{
- return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, lcid, id, type, FALSE, FALSE, FALSE, 0 );
+ return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, NlsValidateLocale( &lcid, 0 ),
+ id, type, FALSE, FALSE, FALSE, 0 );
}
/******************************************************************************
@@ -307,7 +310,8 @@ BOOL WINAPI EnumCalendarInfoA( CALINFO_ENUMPROCA proc, LCID lcid, CALID id, CALT
*/
BOOL WINAPI EnumCalendarInfoExA( CALINFO_ENUMPROCEXA proc, LCID lcid, CALID id, CALTYPE type )
{
- return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, lcid, id, type, FALSE, TRUE, FALSE, 0 );
+ return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, NlsValidateLocale( &lcid, 0 ),
+ id, type, FALSE, TRUE, FALSE, 0 );
}
/**************************************************************************
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 2c2a47a08b8..4742bed25a1 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -1956,6 +1956,14 @@ static WCHAR compose_chars( WCHAR ch1, WCHAR ch2 )
}
+static UINT get_locale_codepage( const NLS_LOCALE_DATA *locale, ULONG flags )
+{
+ UINT ret = locale->idefaultansicodepage;
+ if ((flags & LOCALE_USE_CP_ACP) || ret == CP_UTF8) ret = system_locale->idefaultansicodepage;
+ return ret;
+}
+
+
static UINT get_lcid_codepage( LCID lcid, ULONG flags )
{
UINT ret = GetACP();
@@ -3627,15 +3635,17 @@ static DWORD get_timezone_id( const TIME_ZONE_INFORMATION *info, LARGE_INTEGER t
/******************************************************************************
* Internal_EnumCalendarInfo (kernelbase.@)
*/
-BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumCalendarInfo( CALINFO_ENUMPROCW proc, LCID lcid, CALID id,
+BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumCalendarInfo( CALINFO_ENUMPROCW proc,
+ const NLS_LOCALE_DATA *locale, CALID id,
CALTYPE type, BOOL unicode, BOOL ex,
BOOL exex, LPARAM lparam )
{
+ const USHORT *calendars;
+ USHORT cal = id;
WCHAR buffer[256];
- CALID calendars[2] = { id };
- INT ret, i;
+ INT ret, i, count = 1;
- if (!proc)
+ if (!proc || !locale)
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
@@ -3643,24 +3653,33 @@ BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumCalendarInfo( CALINFO_ENUMPROCW proc,
if (id == ENUM_ALL_CALENDARS)
{
- if (!GetLocaleInfoW( lcid, LOCALE_ICALENDARTYPE | LOCALE_RETURN_NUMBER,
- (WCHAR *)&calendars[0], sizeof(calendars[0]) / sizeof(WCHAR) )) return FALSE;
- if (!GetLocaleInfoW( lcid, LOCALE_IOPTIONALCALENDAR | LOCALE_RETURN_NUMBER,
- (WCHAR *)&calendars[1], sizeof(calendars[1]) / sizeof(WCHAR) )) calendars[1] = 0;
+ count = locale_strings[locale->scalendartype];
+ calendars = locale_strings + locale->scalendartype + 1;
+ }
+ else if (id <= CAL_UMALQURA)
+ {
+ calendars = &cal;
+ count = 1;
+ }
+ else
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
}
- for (i = 0; i < ARRAY_SIZE(calendars) && calendars[i]; i++)
+ for (i = 0; i < count; i++)
{
id = calendars[i];
if (type & CAL_RETURN_NUMBER)
- ret = GetCalendarInfoW( lcid, id, type, NULL, 0, (LPDWORD)buffer );
+ ret = get_calendar_info( locale, id, type, NULL, 0, (LPDWORD)buffer );
else if (unicode)
- ret = GetCalendarInfoW( lcid, id, type, buffer, ARRAY_SIZE(buffer), NULL );
+ ret = get_calendar_info( locale, id, type, buffer, ARRAY_SIZE(buffer), NULL );
else
{
WCHAR bufW[256];
- ret = GetCalendarInfoW( lcid, id, type, bufW, ARRAY_SIZE(bufW), NULL );
- if (ret) WideCharToMultiByte( CP_ACP, 0, bufW, -1, (char *)buffer, sizeof(buffer), NULL, NULL );
+ ret = get_calendar_info( locale, id, type, bufW, ARRAY_SIZE(bufW), NULL );
+ if (ret) WideCharToMultiByte( get_locale_codepage( locale, type ), 0,
+ bufW, -1, (char *)buffer, sizeof(buffer), NULL, NULL );
}
if (ret)
@@ -4155,7 +4174,8 @@ LCID WINAPI DECLSPEC_HOTPATCH ConvertDefaultLocale( LCID lcid )
BOOL WINAPI DECLSPEC_HOTPATCH EnumCalendarInfoW( CALINFO_ENUMPROCW proc, LCID lcid,
CALID id, CALTYPE type )
{
- return Internal_EnumCalendarInfo( proc, lcid, id, type, TRUE, FALSE, FALSE, 0 );
+ return Internal_EnumCalendarInfo( proc, NlsValidateLocale( &lcid, 0 ),
+ id, type, TRUE, FALSE, FALSE, 0 );
}
@@ -4165,7 +4185,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH EnumCalendarInfoW( CALINFO_ENUMPROCW proc, LCID lc
BOOL WINAPI DECLSPEC_HOTPATCH EnumCalendarInfoExW( CALINFO_ENUMPROCEXW proc, LCID lcid,
CALID id, CALTYPE type )
{
- return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, lcid, id, type, TRUE, TRUE, FALSE, 0 );
+ return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, NlsValidateLocale( &lcid, 0 ),
+ id, type, TRUE, TRUE, FALSE, 0 );
}
/******************************************************************************
@@ -4174,8 +4195,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH EnumCalendarInfoExW( CALINFO_ENUMPROCEXW proc, LCI
BOOL WINAPI DECLSPEC_HOTPATCH EnumCalendarInfoExEx( CALINFO_ENUMPROCEXEX proc, LPCWSTR locale, CALID id,
LPCWSTR reserved, CALTYPE type, LPARAM lparam )
{
- LCID lcid = LocaleNameToLCID( locale, 0 );
- return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, lcid, id, type, TRUE, TRUE, TRUE, lparam );
+ LCID lcid;
+ return Internal_EnumCalendarInfo( (CALINFO_ENUMPROCW)proc, get_locale_by_name( locale, &lcid ),
+ id, type, TRUE, TRUE, TRUE, lparam );
}
More information about the wine-cvs
mailing list