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:
Руслан Ижбулатов 2020-01-26 23:42:31 +00:00
parent a22a15dc5a
commit f77a6a1626
2 changed files with 28 additions and 99 deletions

View File

@ -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,

View File

@ -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 &&