Alexandre Julliard : kernel32: Implemented EnumSystemLocalesEx.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 11:29:41 CDT 2010


Module: wine
Branch: master
Commit: 9f792ab3d56acdf38eaba06734667df001c976b7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9f792ab3d56acdf38eaba06734667df001c976b7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Sep 27 14:03:12 2010 +0200

kernel32: Implemented EnumSystemLocalesEx.

---

 dlls/kernel32/kernel32.spec  |    1 +
 dlls/kernel32/locale.c       |   49 ++++++++++++++++++++++++++++++++++++++++++
 dlls/kernel32/tests/locale.c |   49 +++++++++++++++++++++++++++--------------
 include/winnls.h             |   19 ++++++++++++++++
 4 files changed, 101 insertions(+), 17 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 43e339b..e4ce77e 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -324,6 +324,7 @@
 @ stdcall EnumSystemLanguageGroupsA(ptr long ptr)
 @ stdcall EnumSystemLanguageGroupsW(ptr long ptr)
 @ stdcall EnumSystemLocalesA(ptr long)
+@ stdcall EnumSystemLocalesEx(ptr long long ptr)
 @ stdcall EnumSystemLocalesW(ptr long)
 @ stdcall EnumTimeFormatsA(ptr long long)
 @ stdcall EnumTimeFormatsW(ptr long long)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 168bb19..927d058 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -2222,6 +2222,55 @@ BOOL WINAPI EnumSystemLocalesW( LOCALE_ENUMPROCW lpfnLocaleEnum, DWORD dwFlags )
 }
 
 
+struct enum_locale_ex_data
+{
+    LOCALE_ENUMPROCEX proc;
+    DWORD             flags;
+    LPARAM            lparam;
+};
+
+static BOOL CALLBACK enum_locale_ex_proc( HMODULE module, LPCWSTR type,
+                                          LPCWSTR name, WORD lang, LONG_PTR lparam )
+{
+    struct enum_locale_ex_data *data = (struct enum_locale_ex_data *)lparam;
+    WCHAR buffer[256];
+    DWORD neutral;
+    unsigned int flags;
+
+    GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), LOCALE_SNAME | LOCALE_NOUSEROVERRIDE,
+                    buffer, sizeof(buffer) / sizeof(WCHAR) );
+    if (!GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ),
+                         LOCALE_INEUTRAL | LOCALE_NOUSEROVERRIDE | LOCALE_RETURN_NUMBER,
+                         (LPWSTR)&neutral, sizeof(neutral) / sizeof(WCHAR) ))
+        neutral = 0;
+    flags = LOCALE_WINDOWS;
+    flags |= neutral ? LOCALE_NEUTRALDATA : LOCALE_SPECIFICDATA;
+    if (data->flags && ~(data->flags & flags)) return TRUE;
+    return data->proc( buffer, flags, data->lparam );
+}
+
+/******************************************************************************
+ *           EnumSystemLocalesEx  (KERNEL32.@)
+ */
+BOOL WINAPI EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lparam, LPVOID reserved )
+{
+    struct enum_locale_ex_data data;
+
+    if (reserved)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    data.proc   = proc;
+    data.flags  = flags;
+    data.lparam = lparam;
+    EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING,
+                            (LPCWSTR)MAKEINTRESOURCE((LOCALE_SNAME >> 4) + 1),
+                            enum_locale_ex_proc, (LONG_PTR)&data );
+    return TRUE;
+}
+
+
 /***********************************************************************
  *           VerLanguageNameA  (KERNEL32.@)
  *
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 9d6f7e4..34b5f00 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -67,23 +67,13 @@ static inline int isdigitW( WCHAR wc )
 static HMODULE hKernel32;
 static WORD enumCount;
 
-typedef BOOL (WINAPI *EnumSystemLanguageGroupsAFn)(LANGUAGEGROUP_ENUMPROC,
-                                                   DWORD, LONG_PTR);
-static EnumSystemLanguageGroupsAFn pEnumSystemLanguageGroupsA;
-typedef BOOL (WINAPI *EnumLanguageGroupLocalesAFn)(LANGGROUPLOCALE_ENUMPROC,
-                                                   LGRPID, DWORD, LONG_PTR);
-static EnumLanguageGroupLocalesAFn pEnumLanguageGroupLocalesA;
-typedef BOOL (WINAPI *EnumUILanguagesAFn)(UILANGUAGE_ENUMPROC,
-                                                   DWORD, LONG_PTR);
-static EnumUILanguagesAFn pEnumUILanguagesA;
-
-typedef INT (WINAPI *FoldStringAFn)(DWORD, LPCSTR, INT, LPSTR, INT);
-static FoldStringAFn pFoldStringA;
-typedef INT (WINAPI *FoldStringWFn)(DWORD, LPCWSTR, INT, LPWSTR, INT);
-static FoldStringWFn pFoldStringW;
-
-typedef BOOL (WINAPI *IsValidLanguageGroupFn)(LGRPID, DWORD);
-static IsValidLanguageGroupFn pIsValidLanguageGroup;
+static BOOL (WINAPI *pEnumSystemLanguageGroupsA)(LANGUAGEGROUP_ENUMPROC, DWORD, LONG_PTR);
+static BOOL (WINAPI *pEnumLanguageGroupLocalesA)(LANGGROUPLOCALE_ENUMPROC, LGRPID, DWORD, LONG_PTR);
+static BOOL (WINAPI *pEnumUILanguagesA)(UILANGUAGE_ENUMPROC, DWORD, LONG_PTR);
+static BOOL (WINAPI *pEnumSystemLocalesEx)(LOCALE_ENUMPROCEX, DWORD, LPARAM, LPVOID);
+static INT (WINAPI *pFoldStringA)(DWORD, LPCSTR, INT, LPSTR, INT);
+static INT (WINAPI *pFoldStringW)(DWORD, LPCWSTR, INT, LPWSTR, INT);
+static BOOL (WINAPI *pIsValidLanguageGroup)(LGRPID, DWORD);
 
 static void InitFunctionPointers(void)
 {
@@ -94,6 +84,7 @@ static void InitFunctionPointers(void)
   pFoldStringW = (void*)GetProcAddress(hKernel32, "FoldStringW");
   pIsValidLanguageGroup = (void*)GetProcAddress(hKernel32, "IsValidLanguageGroup");
   pEnumUILanguagesA = (void*)GetProcAddress(hKernel32, "EnumUILanguagesA");
+  pEnumSystemLocalesEx = (void*)GetProcAddress(hKernel32, "EnumSystemLocalesEx");
 }
 
 #define eq(received, expected, label, type) \
@@ -2346,6 +2337,29 @@ static void test_EnumSystemLanguageGroupsA(void)
   pEnumSystemLanguageGroupsA(langgrp_procA, LGRPID_SUPPORTED, 0);
 }
 
+static BOOL CALLBACK enum_func( LPWSTR name, DWORD flags, LPARAM lparam )
+{
+    trace( "%s %x\n", wine_dbgstr_w(name), flags );
+    return TRUE;
+}
+
+static void test_EnumSystemLocalesEx(void)
+{
+    BOOL ret;
+
+    if (!pEnumSystemLocalesEx)
+    {
+        win_skip( "EnumSystemLocalesEx not available\n" );
+        return;
+    }
+    SetLastError( 0xdeadbeef );
+    ret = pEnumSystemLocalesEx( enum_func, LOCALE_ALL, 0, (void *)1 );
+    ok( !ret, "should have failed\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+    SetLastError( 0xdeadbeef );
+    ret = pEnumSystemLocalesEx( enum_func, 0, 0, NULL );
+    ok( ret, "failed err %u\n", GetLastError() );
+}
 
 static BOOL CALLBACK lgrplocale_procA(LGRPID lgrpid, LCID lcid, LPSTR lpszNum,
                                       LONG_PTR lParam)
@@ -2801,6 +2815,7 @@ START_TEST(locale)
   test_FoldStringW();
   test_ConvertDefaultLocale();
   test_EnumSystemLanguageGroupsA();
+  test_EnumSystemLocalesEx();
   test_EnumLanguageGroupLocalesA();
   test_SetLocaleInfoA();
   test_EnumUILanguageA();
diff --git a/include/winnls.h b/include/winnls.h
index b75e24a..279c944 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -150,6 +150,14 @@ extern "C" {
 #define LCID_SUPPORTED              0x2
 #define LCID_ALTERNATE_SORTS        0x4
 
+#define LOCALE_ALL                  0x00
+#define LOCALE_WINDOWS              0x01
+#define LOCALE_SUPPLEMENTAL         0x02
+#define LOCALE_ALTERNATE_SORTS      0x04
+#define LOCALE_REPLACEMENT          0x08
+#define LOCALE_NEUTRALDATA          0x10
+#define LOCALE_SPECIFICDATA         0x20
+
 /* Locale flags */
 #define LOCALE_NOUSEROVERRIDE         0x80000000
 #define LOCALE_USE_CP_ACP             0x40000000
@@ -279,6 +287,16 @@ extern "C" {
 #define LOCALE_SPARENT              0x006D
 #define LOCALE_SCONSOLEFALLBACKNAME 0x006E
 #define LOCALE_SLANGDISPLAYNAME     0x006F
+#define LOCALE_IREADINGLAYOUT       0x0070
+#define LOCALE_INEUTRAL             0x0071
+#define LOCALE_INEGATIVEPERCENT     0x0074
+#define LOCALE_IPOSITIVEPERCENT     0x0075
+#define LOCALE_SPERCENT             0x0076
+#define LOCALE_SPERMILLE            0x0077
+#define LOCALE_SMONTHDAY            0x0078
+#define LOCALE_SSHORTTIME           0x0079
+#define LOCALE_SOPENTYPELANGUAGETAG 0X007A
+#define LOCALE_SSORTLOCALE          0x007B
 
 #define LOCALE_IDEFAULTEBCDICCODEPAGE 0x1012
 #define LOCALE_IPAPERSIZE             0x100A
@@ -624,6 +642,7 @@ typedef BOOL    (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID,LPSTR,LPSTR,DWORD,LON
 typedef BOOL    (CALLBACK *LANGUAGEGROUP_ENUMPROCW)(LGRPID,LPWSTR,LPWSTR,DWORD,LONG_PTR);
 typedef BOOL    (CALLBACK *LOCALE_ENUMPROCA)(LPSTR);
 typedef BOOL    (CALLBACK *LOCALE_ENUMPROCW)(LPWSTR);
+typedef BOOL    (CALLBACK *LOCALE_ENUMPROCEX)(LPWSTR, DWORD, LPARAM);
 typedef BOOL    (CALLBACK *TIMEFMT_ENUMPROCA)(LPSTR);
 typedef BOOL    (CALLBACK *TIMEFMT_ENUMPROCW)(LPWSTR);
 typedef BOOL    (CALLBACK *UILANGUAGE_ENUMPROCA)(LPSTR,LONG_PTR);




More information about the wine-cvs mailing list