mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-04-16 12:28:48 +02: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:
parent
a22a15dc5a
commit
f77a6a1626
@ -497,80 +497,6 @@ static GWin32RegistryKey *classes_root_key;
|
|||||||
*/
|
*/
|
||||||
#include "giowin32-private.c"
|
#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
|
static void
|
||||||
read_handler_icon (GWin32RegistryKey *proxy_key,
|
read_handler_icon (GWin32RegistryKey *proxy_key,
|
||||||
GWin32RegistryKey *program_key,
|
GWin32RegistryKey *program_key,
|
||||||
@ -1687,7 +1613,7 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea
|
|||||||
|
|
||||||
friendly_name = NULL;
|
friendly_name = NULL;
|
||||||
success = g_win32_registry_key_get_value_w (capabilities,
|
success = g_win32_registry_key_get_value_w (capabilities,
|
||||||
NULL,
|
g_win32_registry_get_os_dirs_w (),
|
||||||
TRUE,
|
TRUE,
|
||||||
L"LocalizedString",
|
L"LocalizedString",
|
||||||
&vtype,
|
&vtype,
|
||||||
@ -1695,11 +1621,9 @@ read_capable_app (gunichar2 *input_app_key_path, gboolean user_specific, gboolea
|
|||||||
NULL,
|
NULL,
|
||||||
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);
|
g_clear_pointer (&friendly_name, g_free);
|
||||||
|
|
||||||
friendly_name = read_resource_string (friendly_name);
|
|
||||||
|
|
||||||
if (friendly_name && app->localized_pretty_name == NULL)
|
if (friendly_name && app->localized_pretty_name == NULL)
|
||||||
{
|
{
|
||||||
app->localized_pretty_name = g_wcsdup (friendly_name, -1);
|
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;
|
description = NULL;
|
||||||
success = g_win32_registry_key_get_value_w (capabilities,
|
success = g_win32_registry_key_get_value_w (capabilities,
|
||||||
NULL,
|
g_win32_registry_get_os_dirs_w (),
|
||||||
TRUE,
|
TRUE,
|
||||||
L"ApplicationDescription",
|
L"ApplicationDescription",
|
||||||
&vtype,
|
&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)
|
if (success && vtype != G_WIN32_REGISTRY_VALUE_STR)
|
||||||
g_clear_pointer (&description, g_free);
|
g_clear_pointer (&description, g_free);
|
||||||
|
|
||||||
description = read_resource_string (description);
|
|
||||||
|
|
||||||
if (description && app->description == NULL)
|
if (description && app->description == NULL)
|
||||||
{
|
{
|
||||||
app->description = g_wcsdup (description, -1);
|
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;
|
narrow_application_name = NULL;
|
||||||
success = g_win32_registry_key_get_value_w (capabilities,
|
success = g_win32_registry_key_get_value_w (capabilities,
|
||||||
NULL,
|
g_win32_registry_get_os_dirs_w (),
|
||||||
TRUE,
|
TRUE,
|
||||||
L"ApplicationName",
|
L"ApplicationName",
|
||||||
&vtype,
|
&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)
|
if (success && vtype != G_WIN32_REGISTRY_VALUE_STR)
|
||||||
g_clear_pointer (&narrow_application_name, g_free);
|
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?
|
/* 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.
|
* 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
|
* I.e. Thunderbird's name is "Thunderbird", whereas its narrow name is
|
||||||
@ -2252,7 +2172,7 @@ read_exeapps (void)
|
|||||||
|
|
||||||
friendly_app_name = NULL;
|
friendly_app_name = NULL;
|
||||||
success = g_win32_registry_key_get_value_w (incapable_app,
|
success = g_win32_registry_key_get_value_w (incapable_app,
|
||||||
NULL,
|
g_win32_registry_get_os_dirs_w (),
|
||||||
TRUE,
|
TRUE,
|
||||||
L"FriendlyAppName",
|
L"FriendlyAppName",
|
||||||
&vtype,
|
&vtype,
|
||||||
@ -2263,8 +2183,6 @@ read_exeapps (void)
|
|||||||
if (success && vtype != G_WIN32_REGISTRY_VALUE_STR)
|
if (success && vtype != G_WIN32_REGISTRY_VALUE_STR)
|
||||||
g_clear_pointer (&friendly_app_name, g_free);
|
g_clear_pointer (&friendly_app_name, g_free);
|
||||||
|
|
||||||
friendly_app_name = read_resource_string (friendly_app_name);
|
|
||||||
|
|
||||||
no_open_with = FALSE;
|
no_open_with = FALSE;
|
||||||
success = g_win32_registry_key_get_value_w (incapable_app,
|
success = g_win32_registry_key_get_value_w (incapable_app,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -1934,6 +1934,8 @@ g_win32_registry_get_os_dirs (void)
|
|||||||
-1, NULL, NULL, NULL);
|
-1, NULL, NULL, NULL);
|
||||||
if (new_mui_os_dirs[new_array_index] != NULL)
|
if (new_mui_os_dirs[new_array_index] != NULL)
|
||||||
new_array_index += 1;
|
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);
|
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 &&
|
if (mui_dll_dirs != NULL &&
|
||||||
mui_dll_dirs != mui_os_dirs)
|
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_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;
|
if (mui_dll_dirs_utf16[i] == NULL)
|
||||||
mui_dll_dirs[mui_dll_dirs_index] != NULL;
|
break;
|
||||||
mui_dll_dirs_index++)
|
}
|
||||||
{
|
|
||||||
mui_dll_dirs_utf16[mui_dll_dirs_count] = g_utf8_to_utf16 (mui_dll_dirs[mui_dll_dirs_index],
|
if (mui_dll_dirs[i] != NULL)
|
||||||
-1, NULL, NULL, NULL);
|
{
|
||||||
if (mui_dll_dirs_utf16[mui_dll_dirs_count] != NULL)
|
g_prefix_error (error,
|
||||||
mui_dll_dirs_count += 1;
|
"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 &&
|
else if (mui_dll_dirs != NULL &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user