Dmitry Timoshkov : kernel32: Implement EnumUILanguages.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 7 14:20:11 CST 2006


Module: wine
Branch: refs/heads/master
Commit: e6a734a9795d623c459ed461ef46524005aa64ae
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e6a734a9795d623c459ed461ef46524005aa64ae

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Tue Feb  7 21:17:06 2006 +0100

kernel32: Implement EnumUILanguages.

---

 dlls/kernel/locale.c |   71 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/dlls/kernel/locale.c b/dlls/kernel/locale.c
index cf65b4a..80293ac 100644
--- a/dlls/kernel/locale.c
+++ b/dlls/kernel/locale.c
@@ -1784,7 +1784,7 @@ BOOL WINAPI IsValidLocale( LCID lcid, DW
 
 
 static BOOL CALLBACK enum_lang_proc_a( HMODULE hModule, LPCSTR type,
-                                       LPCSTR name, WORD LangID, LONG lParam )
+                                       LPCSTR name, WORD LangID, LONG_PTR lParam )
 {
     LOCALE_ENUMPROCA lpfnLocaleEnum = (LOCALE_ENUMPROCA)lParam;
     char buf[20];
@@ -1794,7 +1794,7 @@ static BOOL CALLBACK enum_lang_proc_a( H
 }
 
 static BOOL CALLBACK enum_lang_proc_w( HMODULE hModule, LPCWSTR type,
-                                       LPCWSTR name, WORD LangID, LONG lParam )
+                                       LPCWSTR name, WORD LangID, LONG_PTR lParam )
 {
     static const WCHAR formatW[] = {'%','0','8','x',0};
     LOCALE_ENUMPROCW lpfnLocaleEnum = (LOCALE_ENUMPROCW)lParam;
@@ -3184,12 +3184,46 @@ BOOL WINAPI SetUserGeoID( GEOID GeoID )
     return FALSE;
 }
 
+typedef struct
+{
+    union
+    {
+        UILANGUAGE_ENUMPROCA procA;
+        UILANGUAGE_ENUMPROCW procW;
+    } u;
+    DWORD flags;
+    LONG_PTR param;
+} ENUM_UILANG_CALLBACK;
+
+static BOOL CALLBACK enum_uilang_proc_a( HMODULE hModule, LPCSTR type,
+                                         LPCSTR name, WORD LangID, LONG_PTR lParam )
+{
+    ENUM_UILANG_CALLBACK *enum_uilang = (ENUM_UILANG_CALLBACK *)lParam;
+    char buf[20];
+
+    sprintf(buf, "%08x", (UINT)LangID);
+    return enum_uilang->u.procA( buf, enum_uilang->param );
+}
+
+static BOOL CALLBACK enum_uilang_proc_w( HMODULE hModule, LPCWSTR type,
+                                         LPCWSTR name, WORD LangID, LONG_PTR lParam )
+{
+    static const WCHAR formatW[] = {'%','0','8','x',0};
+    ENUM_UILANG_CALLBACK *enum_uilang = (ENUM_UILANG_CALLBACK *)lParam;
+    WCHAR buf[20];
+
+    sprintfW( buf, formatW, (UINT)LangID );
+    return enum_uilang->u.procW( buf, enum_uilang->param );
+}
+
 /******************************************************************************
  *           EnumUILanguagesA (KERNEL32.@)
  */
 BOOL WINAPI EnumUILanguagesA(UILANGUAGE_ENUMPROCA pUILangEnumProc, DWORD dwFlags, LONG_PTR lParam)
 {
-    static char value[] = "0409";
+    ENUM_UILANG_CALLBACK enum_uilang;
+
+    TRACE("%p, %lx, %lx\n", pUILangEnumProc, dwFlags, lParam);
 
     if(!pUILangEnumProc) {
 	SetLastError(ERROR_INVALID_PARAMETER);
@@ -3200,11 +3234,14 @@ BOOL WINAPI EnumUILanguagesA(UILANGUAGE_
 	return FALSE;
     }
 
-    FIXME("%p, %lx, %lx calling pUILangEnumProc with %s\n",
-          pUILangEnumProc, dwFlags, lParam, debugstr_a(value));
-
-    pUILangEnumProc( value, lParam );
-    return(TRUE);
+    enum_uilang.u.procA = pUILangEnumProc;
+    enum_uilang.flags = dwFlags;
+    enum_uilang.param = lParam;
+
+    EnumResourceLanguagesA( kernel32_handle, (LPCSTR)RT_STRING,
+                            (LPCSTR)LOCALE_ILANGUAGE, enum_uilang_proc_a,
+                            (LONG_PTR)&enum_uilang);
+    return TRUE;
 }
 
 /******************************************************************************
@@ -3212,7 +3249,10 @@ BOOL WINAPI EnumUILanguagesA(UILANGUAGE_
  */
 BOOL WINAPI EnumUILanguagesW(UILANGUAGE_ENUMPROCW pUILangEnumProc, DWORD dwFlags, LONG_PTR lParam)
 {
-    static WCHAR value[] = {'0','4','0','9',0};
+    ENUM_UILANG_CALLBACK enum_uilang;
+
+    TRACE("%p, %lx, %lx\n", pUILangEnumProc, dwFlags, lParam);
+
 
     if(!pUILangEnumProc) {
 	SetLastError(ERROR_INVALID_PARAMETER);
@@ -3223,11 +3263,14 @@ BOOL WINAPI EnumUILanguagesW(UILANGUAGE_
 	return FALSE;
     }
 
-    FIXME("%p, %lx, %lx calling pUILangEnumProc with %s\n",
-          pUILangEnumProc, dwFlags, lParam, debugstr_w(value));
-
-    pUILangEnumProc( value, lParam );
-    return(TRUE);
+    enum_uilang.u.procW = pUILangEnumProc;
+    enum_uilang.flags = dwFlags;
+    enum_uilang.param = lParam;
+
+    EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING,
+                            (LPCWSTR)LOCALE_ILANGUAGE, enum_uilang_proc_w,
+                            (LONG_PTR)&enum_uilang);
+    return TRUE;
 }
 
 INT WINAPI GetGeoInfoW(GEOID GeoId, GEOTYPE GeoType, LPWSTR lpGeoData, 




More information about the wine-cvs mailing list