GWin32AppInfo: Create IShellItemArray object inside launch_uwp_internal()

The IShellItemArray object is only used in launch_uwp_internal(),
so do not make callers bother with that.
This commit is contained in:
Luca Bacci 2022-12-22 16:35:14 +01:00
parent a0ea1d7093
commit 7bbbb1ee42

View File

@ -4880,10 +4880,15 @@ emit_launch_failed (GAppLaunchContext *context,
} }
} }
static IShellItemArray *
make_item_array (gboolean for_files,
GList *objs,
GError **error);
static gboolean static gboolean
g_win32_app_info_launch_uwp_internal (GWin32AppInfo *info, g_win32_app_info_launch_uwp_internal (GWin32AppInfo *info,
gboolean for_files, gboolean for_files,
IShellItemArray *items, GList *objs, /* (element-type file_or_uri) */
GWin32AppInfoShellVerb *shverb, GWin32AppInfoShellVerb *shverb,
GAppLaunchContext *launch_context, GAppLaunchContext *launch_context,
GTask *from_task, GTask *from_task,
@ -4892,10 +4897,18 @@ g_win32_app_info_launch_uwp_internal (GWin32AppInfo *info,
IApplicationActivationManager* paam = NULL; IApplicationActivationManager* paam = NULL;
gboolean com_initialized = FALSE; gboolean com_initialized = FALSE;
gboolean result = FALSE; gboolean result = FALSE;
IShellItemArray *items = NULL;
DWORD process_id = 0; DWORD process_id = 0;
HRESULT hr; HRESULT hr;
const wchar_t *app_canonical_name = (const wchar_t *) info->app->canonical_name; const wchar_t *app_canonical_name = (const wchar_t *) info->app->canonical_name;
if (objs)
{
items = make_item_array (for_files, objs, error);
if (!items)
goto cleanup;
}
/* ApplicationActivationManager threading model is both, /* ApplicationActivationManager threading model is both,
* prefer the multithreaded apartment type, as we don't * prefer the multithreaded apartment type, as we don't
* need anything of the STA here. */ * need anything of the STA here. */
@ -4940,7 +4953,7 @@ g_win32_app_info_launch_uwp_internal (GWin32AppInfo *info,
/* The Activate methods return a process identifier (PID), so we should consider /* The Activate methods return a process identifier (PID), so we should consider
* those methods as potentially blocking */ * those methods as potentially blocking */
if (items == NULL) if (objs == NULL)
hr = IApplicationActivationManager_ActivateApplication (paam, hr = IApplicationActivationManager_ActivateApplication (paam,
app_canonical_name, app_canonical_name,
NULL, AO_NONE, NULL, AO_NONE,
@ -5030,15 +5043,20 @@ cleanup:
com_initialized = FALSE; com_initialized = FALSE;
} }
if (items)
{
IShellItemArray_Release (items);
items = NULL;
}
return result; return result;
} }
static gboolean static gboolean
g_win32_app_info_launch_internal (GWin32AppInfo *info, g_win32_app_info_launch_internal (GWin32AppInfo *info,
GList *objs, /* non-UWP only */ GList *objs, /* (element-type file_or_uri) */
gboolean for_files, /* UWP only */ gboolean for_files, /* UWP only */
IShellItemArray *items, /* UWP only */
GAppLaunchContext *launch_context, GAppLaunchContext *launch_context,
GSpawnFlags spawn_flags, GSpawnFlags spawn_flags,
GTask *from_task, GTask *from_task,
@ -5083,7 +5101,7 @@ g_win32_app_info_launch_internal (GWin32AppInfo *info,
if (info->app->is_uwp) if (info->app->is_uwp)
return g_win32_app_info_launch_uwp_internal (info, return g_win32_app_info_launch_uwp_internal (info,
for_files, for_files,
items, objs,
shverb, shverb,
launch_context, launch_context,
from_task, from_task,
@ -5243,7 +5261,7 @@ g_win32_app_info_supports_files (GAppInfo *appinfo)
static IShellItemArray * static IShellItemArray *
make_item_array (gboolean for_files, make_item_array (gboolean for_files,
GList *files_or_uris, GList *objs, /* (element-type file_or_uri) */
GError **error) GError **error)
{ {
ITEMIDLIST **item_ids; ITEMIDLIST **item_ids;
@ -5253,19 +5271,20 @@ make_item_array (gboolean for_files,
gsize i; gsize i;
HRESULT hr; HRESULT hr;
count = g_list_length (files_or_uris); count = g_list_length (objs);
items = NULL; items = NULL;
item_ids = g_new (ITEMIDLIST*, count); item_ids = g_new (ITEMIDLIST*, count);
for (i = 0, p = files_or_uris; p != NULL; p = p->next, i++) for (i = 0, p = objs; p != NULL; p = p->next, i++)
{ {
file_or_uri *obj = (file_or_uri*) p->data;
wchar_t *file_or_uri_utf16; wchar_t *file_or_uri_utf16;
if (!for_files) if (!for_files)
file_or_uri_utf16 = g_utf8_to_utf16 ((gchar *) p->data, -1, NULL, NULL, error); file_or_uri_utf16 = g_utf8_to_utf16 (obj->uri, -1, NULL, NULL, error);
else else
file_or_uri_utf16 = g_utf8_to_utf16 (g_file_peek_path (G_FILE (p->data)), -1, NULL, NULL, error); file_or_uri_utf16 = g_utf8_to_utf16 (obj->file, -1, NULL, NULL, error);
if (file_or_uri_utf16 == NULL) if (file_or_uri_utf16 == NULL)
break; break;
@ -5336,38 +5355,19 @@ make_item_array (gboolean for_files,
static gboolean static gboolean
g_win32_app_info_launch_uris_impl (GAppInfo *appinfo, g_win32_app_info_launch_uris_impl (GAppInfo *appinfo,
GList *uris, GList *uris, /* (element-type utf8) */
GAppLaunchContext *launch_context, GAppLaunchContext *launch_context,
GTask *from_task, GTask *from_task,
GError **error) GError **error)
{ {
gboolean res = FALSE; gboolean res = FALSE;
gboolean do_files; gboolean do_files;
GList *objs; GList *objs = NULL;
GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo);
gboolean is_uwp;
if (info->app != NULL && info->app->is_uwp)
{
IShellItemArray *items = NULL;
if (uris)
{
items = make_item_array (FALSE, uris, error);
if (items == NULL)
return res;
}
res = g_win32_app_info_launch_internal (info, NULL, FALSE, items, launch_context, 0, from_task, error);
if (items != NULL)
IShellItemArray_Release (items);
return res;
}
do_files = g_win32_app_info_supports_files (appinfo); do_files = g_win32_app_info_supports_files (appinfo);
objs = NULL;
while (uris) while (uris)
{ {
file_or_uri *obj; file_or_uri *obj;
@ -5389,14 +5389,16 @@ g_win32_app_info_launch_uris_impl (GAppInfo *appinfo,
objs = g_list_prepend (objs, obj); objs = g_list_prepend (objs, obj);
uris = uris->next; uris = uris->next;
} }
objs = g_list_reverse (objs); objs = g_list_reverse (objs);
is_uwp = (info->app != NULL && info->app->is_uwp);
res = g_win32_app_info_launch_internal (info, res = g_win32_app_info_launch_internal (info,
objs, objs,
FALSE, FALSE,
NULL,
launch_context, launch_context,
is_uwp ?
0 :
G_SPAWN_SEARCH_PATH, G_SPAWN_SEARCH_PATH,
from_task, from_task,
error); error);
@ -5491,37 +5493,18 @@ g_win32_app_info_should_show (GAppInfo *appinfo)
static gboolean static gboolean
g_win32_app_info_launch (GAppInfo *appinfo, g_win32_app_info_launch (GAppInfo *appinfo,
GList *files, GList *files, /* (element-type GFile) */
GAppLaunchContext *launch_context, GAppLaunchContext *launch_context,
GError **error) GError **error)
{ {
gboolean res = FALSE; gboolean res = FALSE;
gboolean do_uris; gboolean do_uris;
GList *objs; GList *objs = NULL;
GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo);
gboolean is_uwp;
if (info->app != NULL && info->app->is_uwp)
{
IShellItemArray *items = NULL;
if (files)
{
items = make_item_array (TRUE, files, error);
if (items == NULL)
return res;
}
res = g_win32_app_info_launch_internal (info, NULL, TRUE, items, launch_context, 0, NULL, error);
if (items != NULL)
IShellItemArray_Release (items);
return res;
}
do_uris = g_win32_app_info_supports_uris (appinfo); do_uris = g_win32_app_info_supports_uris (appinfo);
objs = NULL;
while (files) while (files)
{ {
file_or_uri *obj; file_or_uri *obj;
@ -5534,14 +5517,16 @@ g_win32_app_info_launch (GAppInfo *appinfo,
objs = g_list_prepend (objs, obj); objs = g_list_prepend (objs, obj);
files = files->next; files = files->next;
} }
objs = g_list_reverse (objs); objs = g_list_reverse (objs);
is_uwp = (info->app != NULL && info->app->is_uwp);
res = g_win32_app_info_launch_internal (info, res = g_win32_app_info_launch_internal (info,
objs, objs,
TRUE, TRUE,
NULL,
launch_context, launch_context,
is_uwp ?
0 :
G_SPAWN_SEARCH_PATH, G_SPAWN_SEARCH_PATH,
NULL, NULL,
error); error);