Alex Henrie : winemenubuilder: Introduce a reg_enum_keyW helper function.
Alexandre Julliard
julliard at winehq.org
Wed Oct 13 15:59:26 CDT 2021
Module: wine
Branch: master
Commit: 5d8aac9cb0810285feff4188bcc6d84107217731
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5d8aac9cb0810285feff4188bcc6d84107217731
Author: Alex Henrie <alexhenrie24 at gmail.com>
Date: Tue Oct 12 23:20:36 2021 -0600
winemenubuilder: Introduce a reg_enum_keyW helper function.
The helper function reduces code duplication and makes the 'done'
variable in the cleanup_associations function unnecessary.
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winemenubuilder/winemenubuilder.c | 89 +++++++++++++++---------------
1 file changed, 44 insertions(+), 45 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 5b6fe071916..522e6192b24 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -1753,6 +1753,30 @@ static WCHAR *freedesktop_mime_type_for_extension(struct list *native_mime_types
return match ? xwcsdup(match) : NULL;
}
+static WCHAR *reg_enum_keyW(HKEY key, DWORD index)
+{
+ WCHAR *subkey;
+ DWORD size = 1024 * sizeof(WCHAR);
+ LSTATUS ret;
+
+ for (;;)
+ {
+ subkey = xmalloc(size);
+ ret = RegEnumKeyExW(key, index, subkey, &size, NULL, NULL, NULL, NULL);
+ if (ret == ERROR_SUCCESS)
+ {
+ return subkey;
+ }
+ if (ret != ERROR_MORE_DATA)
+ {
+ heap_free(subkey);
+ return NULL;
+ }
+ size *= 2;
+ heap_free(subkey);
+ }
+}
+
static WCHAR* reg_get_valW(HKEY key, LPCWSTR subkey, LPCWSTR name)
{
DWORD size;
@@ -1857,47 +1881,31 @@ static BOOL cleanup_associations(void)
BOOL hasChanged = FALSE;
if ((assocKey = open_associations_reg_key()))
{
- int i;
- BOOL done = FALSE;
- for (i = 0; !done;)
+ int i = 0;
+ for (;;)
{
- WCHAR *extensionW = NULL;
- DWORD size = 1024;
- LSTATUS ret;
+ WCHAR *extensionW;
+ WCHAR *command;
- do
- {
- heap_free(extensionW);
- extensionW = xmalloc(size * sizeof(WCHAR));
- ret = RegEnumKeyExW(assocKey, i, extensionW, &size, NULL, NULL, NULL, NULL);
- size *= 2;
- } while (ret == ERROR_MORE_DATA);
+ if (!(extensionW = reg_enum_keyW(assocKey, i)))
+ break;
- if (ret == ERROR_SUCCESS)
+ if (!(command = assoc_query(ASSOCSTR_COMMAND, extensionW, L"open")))
{
- WCHAR *command;
- command = assoc_query(ASSOCSTR_COMMAND, extensionW, L"open");
- if (command == NULL)
+ WCHAR *desktopFile = reg_get_valW(assocKey, extensionW, L"DesktopFile");
+ if (desktopFile)
{
- WCHAR *desktopFile = reg_get_valW(assocKey, extensionW, L"DesktopFile");
- if (desktopFile)
- {
- WINE_TRACE("removing file type association for %s\n", wine_dbgstr_w(extensionW));
- DeleteFileW(desktopFile);
- }
- RegDeleteKeyW(assocKey, extensionW);
- hasChanged = TRUE;
- heap_free(desktopFile);
+ WINE_TRACE("removing file type association for %s\n", wine_dbgstr_w(extensionW));
+ DeleteFileW(desktopFile);
}
- else
- i++;
- heap_free(command);
+ RegDeleteKeyW(assocKey, extensionW);
+ hasChanged = TRUE;
+ heap_free(desktopFile);
}
else
{
- if (ret != ERROR_NO_MORE_ITEMS)
- WINE_ERR("error %d while reading registry\n", ret);
- done = TRUE;
+ i++;
+ heap_free(command);
}
heap_free(extensionW);
}
@@ -1998,7 +2006,6 @@ static BOOL generate_associations(const WCHAR *packages_dir, const WCHAR *applic
{
struct wine_rb_tree mimeProgidTree = { winemenubuilder_rb_string_compare };
struct list nativeMimeTypes = LIST_INIT(nativeMimeTypes);
- LSTATUS ret = 0;
int i;
BOOL hasChanged = FALSE;
@@ -2010,18 +2017,12 @@ static BOOL generate_associations(const WCHAR *packages_dir, const WCHAR *applic
for (i = 0; ; i++)
{
- WCHAR *extensionW = NULL;
- DWORD size = 1024;
+ WCHAR *extensionW;
- do
- {
- heap_free(extensionW);
- extensionW = xmalloc(size * sizeof(WCHAR));
- ret = RegEnumKeyExW(HKEY_CLASSES_ROOT, i, extensionW, &size, NULL, NULL, NULL, NULL);
- size *= 2;
- } while (ret == ERROR_MORE_DATA);
+ if (!(extensionW = reg_enum_keyW(HKEY_CLASSES_ROOT, i)))
+ break;
- if (ret == ERROR_SUCCESS && extensionW[0] == '.' && !is_extension_banned(extensionW))
+ if (extensionW[0] == '.' && !is_extension_banned(extensionW))
{
WCHAR *commandW = NULL;
WCHAR *executableW = NULL;
@@ -2129,8 +2130,6 @@ static BOOL generate_associations(const WCHAR *packages_dir, const WCHAR *applic
heap_free(progIdW);
}
heap_free(extensionW);
- if (ret != ERROR_SUCCESS)
- break;
}
wine_rb_destroy(&mimeProgidTree, winemenubuilder_rb_destroy, NULL);
More information about the wine-cvs
mailing list