summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2022-12-22 15:02:42 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2022-12-22 15:02:42 +0000
commita0ea1d7093c85eb0a0a2846966e0523204d6bdc6 (patch)
treebc8d69c5ae3eea4f210e39e988fa806aae3a112e
parentb1057f3bb6377f1a41c4b0d8d6f47b97bc63c183 (diff)
parent3c2b15fb155459369885fa6f6e6a4f5e98b42b66 (diff)
downloadglib-a0ea1d7093c85eb0a0a2846966e0523204d6bdc6.tar.gz
Merge branch 'g-win32-app-info-enhancements' into 'main'
GWin32AppInfo: Check for local file path first Closes #2843 See merge request GNOME/glib!3160
-rw-r--r--gio/gwin32appinfo.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c
index dec82954f..0a6f8ae29 100644
--- a/gio/gwin32appinfo.c
+++ b/gio/gwin32appinfo.c
@@ -4334,10 +4334,25 @@ expand_macro_single (char macro, file_or_uri *obj)
case '8':
case '9':
/* TODO: handle 'l' and 'd' differently (longname and desktop name) */
- if (obj->uri)
- result = g_strdup (obj->uri);
- else if (obj->file)
- result = g_strdup (obj->file);
+ if (obj->file)
+ {
+ result = g_strdup (obj->file);
+ }
+ else if (obj->uri)
+ {
+ const char *prefix = "file:///";
+ const size_t prefix_len = strlen (prefix);
+
+ if (g_str_has_prefix (obj->uri, prefix) == 0 && obj->uri[prefix_len] != 0)
+ {
+ GFile *file = g_file_new_for_uri (obj->uri);
+ result = g_file_get_path (file);
+ g_object_unref (file);
+ }
+
+ if (!result)
+ result = g_strdup (obj->uri);
+ }
break;
case 'u':
case 'U':
@@ -5283,14 +5298,18 @@ make_item_array (gboolean for_files,
}
hr = SHParseDisplayName (file_or_uri_utf16, NULL, &item_ids[i], 0, NULL);
- g_free (file_or_uri_utf16);
if (FAILED (hr))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "File or URI `%S' cannot be parsed by SHParseDisplayName: 0x%lx", file_or_uri_utf16, hr);
+ "File or URI `%S' cannot be parsed by SHParseDisplayName: 0x%lx",
+ file_or_uri_utf16, hr);
+
+ g_free (file_or_uri_utf16);
break;
}
+
+ g_free (file_or_uri_utf16);
}
if (i == count)