[PATCH 09/12] kernel32: Implement EnumSystemGeoNames().

João Diogo Ferreira devilj at outlook.pt
Tue Oct 22 12:43:38 CDT 2019


Signed-off-by: João Diogo Craveiro Ferreira <devilj at outlook.pt>
---
 dlls/kernel32/kernel32.spec |  1 +
 dlls/kernel32/locale.c      | 57 +++++++++++++++++++++++++++++++++++++
 include/winnls.h            |  2 ++
 3 files changed, 60 insertions(+)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 765f65c867..dcb24ed893 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -420,6 +420,7 @@
 @ stdcall -import EnumSystemCodePagesW(ptr long)
 @ stdcall EnumSystemFirmwareTables(long ptr long)
 @ stdcall EnumSystemGeoID(long long ptr)
+@ stdcall EnumSystemGeoNames(long ptr long)
 @ stdcall EnumSystemLanguageGroupsA(ptr long ptr)
 @ stdcall -import EnumSystemLanguageGroupsW(ptr long ptr)
 @ stdcall -import EnumSystemLocalesA(ptr long)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index adb3b9b3d9..ea0d7dd30b 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -4645,6 +4645,63 @@ BOOL WINAPI EnumSystemGeoID(GEOCLASS geoclass, GEOID parent, GEO_ENUMPROC enumpr
     return TRUE;
 }
 
+/******************************************************************************
+ *           EnumSystemGeoNames    (KERNEL32.@)
+ *
+ * Call a user's function for every location available on the system.
+ *
+ * PARAMS
+ *  geoclass   [I] Type of location desired (SYSGEOTYPE enum from "winnls.h")
+ *  enumproc   [I] Callback function to call for each location
+ *  data       [I] Any user-defined data to be passed to the enumproc callback function.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE. Use GetLastError() to determine the cause.
+ *
+ * NOTES
+ *  On failure, GetLastError() will return one of the following values:
+ *    - ERROR_INVALID_PARAMETER: enumproc was NULL;
+ *    - ERROR_INVALID_FLAGS: the geoclass argument was invalid.
+ */
+BOOL WINAPI EnumSystemGeoNames(GEOCLASS geoclass, GEO_ENUMNAMEPROC enumproc, LPARAM data)
+{
+    TRACE("(%d, %p, %ld)\n", geoclass, enumproc, data);
+
+    if (!enumproc)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    if (geoclass != GEOCLASS_NATION && geoclass != GEOCLASS_REGION && geoclass != GEOCLASS_ALL)
+    {
+        SetLastError(ERROR_INVALID_FLAGS);
+        return FALSE;
+    }
+
+    for (int i = 0; i < ARRAY_SIZE(geoinfodata); i++)
+    {
+        const struct geoinfo_t *ptr = &geoinfodata[i];
+        WCHAR name[4];
+
+        if (ptr->kind == LOCATION_NATION && geoclass == GEOCLASS_REGION)
+            continue;
+        if (ptr->kind != LOCATION_NATION && geoclass == GEOCLASS_NATION)
+            continue;
+
+        if (ptr->kind == LOCATION_REGION)
+            sprintfW(name, geoname_uncode_fmtW, ptr->uncode);
+        else
+            strcpyW(name, ptr->iso2W);
+
+        if (!enumproc(name, data))
+            return TRUE;
+    }
+
+    return TRUE;
+}
+
 /******************************************************************************
  *           NormalizeString (KERNEL32.@)
  */
diff --git a/include/winnls.h b/include/winnls.h
index 63583f9a6c..aca57030ec 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -762,6 +762,7 @@ typedef BOOL    (CALLBACK *DATEFMT_ENUMPROCW)(LPWSTR);
 typedef BOOL    (CALLBACK *DATEFMT_ENUMPROCEXA)(LPSTR,CALID);
 typedef BOOL    (CALLBACK *DATEFMT_ENUMPROCEXW)(LPWSTR,CALID);
 typedef BOOL    (CALLBACK *GEO_ENUMPROC)(GEOID);
+typedef BOOL    (CALLBACK *GEO_ENUMNAMEPROC)(PWSTR,LPARAM);
 typedef BOOL    (CALLBACK *LANGGROUPLOCALE_ENUMPROCA)(LGRPID,LCID,LPSTR,LONG_PTR);
 typedef BOOL    (CALLBACK *LANGGROUPLOCALE_ENUMPROCW)(LGRPID,LCID,LPWSTR,LONG_PTR);
 typedef BOOL    (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID,LPSTR,LPSTR,DWORD,LONG_PTR);
@@ -868,6 +869,7 @@ WINBASEAPI BOOL        WINAPI EnumSystemCodePagesA(CODEPAGE_ENUMPROCA,DWORD);
 WINBASEAPI BOOL        WINAPI EnumSystemCodePagesW(CODEPAGE_ENUMPROCW,DWORD);
 #define                       EnumSystemCodePages WINELIB_NAME_AW(EnumSystemCodePages)
 WINBASEAPI BOOL        WINAPI EnumSystemGeoID(GEOCLASS,GEOID,GEO_ENUMPROC);
+WINBASEAPI BOOL        WINAPI EnumSystemGeoNames(GEOCLASS,GEO_ENUMNAMEPROC,LPARAM);
 WINBASEAPI BOOL        WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA,DWORD);
 WINBASEAPI BOOL        WINAPI EnumSystemLocalesW(LOCALE_ENUMPROCW,DWORD);
 #define                       EnumSystemLocales WINELIB_NAME_AW(EnumSystemLocales)
-- 
2.23.0



More information about the wine-devel mailing list