mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 00:12:19 +01:00 
			
		
		
		
	GWin32AppInfo: Drop read_resource_string(), use GWin32RegistryKey
Now GWin32RegistryKey can internally do the same thing that read_resource_string() does, and more.
This commit is contained in:
		| @@ -497,80 +497,6 @@ static GWin32RegistryKey *classes_root_key; | ||||
|  */ | ||||
| #include "giowin32-private.c" | ||||
|  | ||||
| static gunichar2 * | ||||
| read_resource_string (gunichar2 *res) | ||||
| { | ||||
|   gunichar2 *id_str; | ||||
|   gunichar2 *id_str_end; | ||||
|   gunichar2 *filename_str; | ||||
|   unsigned long id; | ||||
|   HMODULE resource_module; | ||||
|   gunichar2 *buffer; | ||||
|   int string_length; | ||||
|   int buffer_length; | ||||
|  | ||||
|   if (res == NULL || res[0] != L'@') | ||||
|     return res; | ||||
|  | ||||
|   id_str = wcsrchr (res, L'-'); | ||||
|  | ||||
|   if (id_str == NULL || id_str[-1] != L',') | ||||
|     return res; | ||||
|  | ||||
|   id_str += 1; | ||||
|  | ||||
|   id = wcstoul (id_str, &id_str_end, 10); | ||||
|  | ||||
|   if (id_str_end == id_str || id_str_end[0] != L'\0' || id == ULONG_MAX) | ||||
|     return res; | ||||
|  | ||||
|   filename_str = &res[1]; | ||||
|   id_str[-2] = L'\0'; | ||||
|  | ||||
|   resource_module = LoadLibraryExW (filename_str, | ||||
|                                     0, | ||||
|                                     LOAD_LIBRARY_AS_DATAFILE | | ||||
|                                     LOAD_LIBRARY_AS_IMAGE_RESOURCE); | ||||
|  | ||||
|   g_free (res); | ||||
|  | ||||
|   if (resource_module == NULL) | ||||
|     return NULL; | ||||
|  | ||||
|   buffer_length = 256; | ||||
|   string_length = buffer_length - 1; | ||||
|  | ||||
|   while (TRUE) | ||||
|     { | ||||
|       buffer = g_malloc (buffer_length * sizeof (gunichar2)); | ||||
|       string_length = LoadStringW (resource_module, id, buffer, buffer_length); | ||||
|  | ||||
|       if (string_length != 0 && string_length == buffer_length - 1) | ||||
|         { | ||||
|           g_free (buffer); | ||||
|           buffer_length *= 2; | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           if (string_length == 0) | ||||
|             g_clear_pointer (&buffer, g_free); | ||||
|  | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   FreeLibrary (resource_module); | ||||
|  | ||||
|   if (buffer) | ||||
|     { | ||||
|       gunichar2 *result = g_wcsdup (buffer, -1); | ||||
|       g_free (buffer); | ||||
|       return result; | ||||
|     } | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static void | ||||
| read_handler_icon (GWin32RegistryKey  *proxy_key, | ||||
|                    GWin32RegistryKey  *program_key, | ||||
| @@ -1687,7 +1613,7 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|  | ||||
|   friendly_name = NULL; | ||||
|   success = g_win32_registry_key_get_value_w (capabilities, | ||||
|                                               NULL, | ||||
|                                               g_win32_registry_get_os_dirs_w (), | ||||
|                                               TRUE, | ||||
|                                               L"LocalizedString", | ||||
|                                               &vtype, | ||||
| @@ -1695,11 +1621,9 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|                                               NULL, | ||||
|                                               NULL); | ||||
|  | ||||
|   if (success && (vtype != G_WIN32_REGISTRY_VALUE_STR || friendly_name[0] != L'@')) | ||||
|   if (success && vtype != G_WIN32_REGISTRY_VALUE_STR) | ||||
|     g_clear_pointer (&friendly_name, g_free); | ||||
|  | ||||
|   friendly_name = read_resource_string (friendly_name); | ||||
|  | ||||
|   if (friendly_name && app->localized_pretty_name == NULL) | ||||
|     { | ||||
|       app->localized_pretty_name = g_wcsdup (friendly_name, -1); | ||||
| @@ -1713,7 +1637,7 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|  | ||||
|   description = NULL; | ||||
|   success = g_win32_registry_key_get_value_w (capabilities, | ||||
|                                               NULL, | ||||
|                                               g_win32_registry_get_os_dirs_w (), | ||||
|                                               TRUE, | ||||
|                                               L"ApplicationDescription", | ||||
|                                               &vtype, | ||||
| @@ -1724,8 +1648,6 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|   if (success && vtype != G_WIN32_REGISTRY_VALUE_STR) | ||||
|     g_clear_pointer (&description, g_free); | ||||
|  | ||||
|   description = read_resource_string (description); | ||||
|  | ||||
|   if (description && app->description == NULL) | ||||
|     { | ||||
|       app->description = g_wcsdup (description, -1); | ||||
| @@ -1780,7 +1702,7 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|  | ||||
|   narrow_application_name = NULL; | ||||
|   success = g_win32_registry_key_get_value_w (capabilities, | ||||
|                                               NULL, | ||||
|                                               g_win32_registry_get_os_dirs_w (), | ||||
|                                               TRUE, | ||||
|                                               L"ApplicationName", | ||||
|                                               &vtype, | ||||
| @@ -1791,8 +1713,6 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea | ||||
|   if (success && vtype != G_WIN32_REGISTRY_VALUE_STR) | ||||
|     g_clear_pointer (&narrow_application_name, g_free); | ||||
|  | ||||
|   narrow_application_name = read_resource_string (narrow_application_name); | ||||
|  | ||||
|   /* TODO: do something with the narrow name. Maybe make a kind of sub-app? | ||||
|    * Narrow name is a more precise name of the application in given context. | ||||
|    * I.e. Thunderbird's name is "Thunderbird", whereas its narrow name is | ||||
| @@ -2252,7 +2172,7 @@ read_exeapps (void) | ||||
|  | ||||
|       friendly_app_name = NULL; | ||||
|       success = g_win32_registry_key_get_value_w (incapable_app, | ||||
|                                                   NULL, | ||||
|                                                   g_win32_registry_get_os_dirs_w (), | ||||
|                                                   TRUE, | ||||
|                                                   L"FriendlyAppName", | ||||
|                                                   &vtype, | ||||
| @@ -2263,8 +2183,6 @@ read_exeapps (void) | ||||
|       if (success && vtype != G_WIN32_REGISTRY_VALUE_STR) | ||||
|         g_clear_pointer (&friendly_app_name, g_free); | ||||
|  | ||||
|       friendly_app_name = read_resource_string (friendly_app_name); | ||||
|  | ||||
|       no_open_with = FALSE; | ||||
|       success = g_win32_registry_key_get_value_w (incapable_app, | ||||
|                                                   NULL, | ||||
|   | ||||
| @@ -1934,6 +1934,8 @@ g_win32_registry_get_os_dirs (void) | ||||
|                                                               -1, NULL, NULL, NULL); | ||||
|           if (new_mui_os_dirs[new_array_index] != NULL) | ||||
|             new_array_index += 1; | ||||
|           else | ||||
|             g_critical ("Failed to convert to a system directory #%zu to UTF-8", array_index); | ||||
|         } | ||||
|  | ||||
|       g_once_init_leave (&mui_os_dirs, new_mui_os_dirs); | ||||
| @@ -2026,23 +2028,32 @@ g_win32_registry_key_get_value (GWin32RegistryKey        *key, | ||||
|   if (mui_dll_dirs != NULL && | ||||
|       mui_dll_dirs != mui_os_dirs) | ||||
|     { | ||||
|       gsize mui_dll_dirs_index; | ||||
|       gsize i; | ||||
|  | ||||
|       mui_dll_dirs_count = g_strv_length ((gchar **) mui_dll_dirs); | ||||
|       mui_dll_dirs_utf16 = g_new0 (gunichar2 *, mui_dll_dirs_count + 1); | ||||
|  | ||||
|       if (mui_dll_dirs_count > 0) | ||||
|       for (i = 0; mui_dll_dirs[i] != NULL; i++) | ||||
|         { | ||||
|           mui_dll_dirs_utf16 = g_new0 (gunichar2 *, mui_dll_dirs_count + 1); | ||||
|           mui_dll_dirs_utf16[i] = g_utf8_to_utf16 (mui_dll_dirs[i], -1, NULL, NULL, error); | ||||
|  | ||||
|           for (mui_dll_dirs_count = 0, mui_dll_dirs_index = 0; | ||||
|                mui_dll_dirs[mui_dll_dirs_index] != NULL; | ||||
|                mui_dll_dirs_index++) | ||||
|             { | ||||
|               mui_dll_dirs_utf16[mui_dll_dirs_count] = g_utf8_to_utf16 (mui_dll_dirs[mui_dll_dirs_index], | ||||
|                                                                         -1, NULL, NULL, NULL); | ||||
|               if (mui_dll_dirs_utf16[mui_dll_dirs_count] != NULL) | ||||
|                 mui_dll_dirs_count += 1; | ||||
|             } | ||||
|           if (mui_dll_dirs_utf16[i] == NULL) | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|       if (mui_dll_dirs[i] != NULL) | ||||
|         { | ||||
|           g_prefix_error (error, | ||||
|                           "A mui_dll_dirs string #%zu `%s' failed to convert: ", | ||||
|                           i, mui_dll_dirs[i]); | ||||
|  | ||||
|           for (i = 0; i < mui_dll_dirs_count; i++) | ||||
|             g_free (mui_dll_dirs_utf16[i]); | ||||
|  | ||||
|           g_free (mui_dll_dirs_utf16); | ||||
|           g_free (value_name_w); | ||||
|  | ||||
|           return FALSE; | ||||
|         } | ||||
|     } | ||||
|   else if (mui_dll_dirs != NULL && | ||||
|   | ||||
		Reference in New Issue
	
	Block a user