Skip to content

Commit ec12bf1

Browse files
committed
Add API to register app ID
These are no-ops when running under flatpak or snap, but when running on the host, they will call Register() on org.freedesktop.host.portal.Registry.
1 parent 0f8f627 commit ec12bf1

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

libportal/portal-helpers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ XdpPortal *xdp_portal_new (void);
4545
XDP_PUBLIC
4646
XdpPortal *xdp_portal_initable_new (GError **error);
4747

48+
XDP_PUBLIC
49+
void xdp_portal_register (XdpPortal *portal,
50+
const char *app_id,
51+
GCancellable *cancellable,
52+
GAsyncReadyCallback callback,
53+
gpointer user_data);
54+
55+
XDP_PUBLIC
56+
gboolean xdp_portal_register_finish (XdpPortal *portal,
57+
GAsyncResult *result,
58+
GError **error);
59+
4860
XDP_PUBLIC
4961
gboolean xdp_portal_running_under_flatpak (void);
5062

libportal/portal.c

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,117 @@ xdp_portal_new (void)
386386
return portal;
387387
}
388388

389+
static void
390+
register_cb (GObject *source_object,
391+
GAsyncResult *result,
392+
gpointer user_data)
393+
{
394+
g_autoptr(GTask) task = user_data;
395+
g_autoptr(GVariant) ret = NULL;
396+
g_autoptr(GError) error = NULL;
397+
398+
ret = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
399+
result,
400+
&error);
401+
if (error)
402+
g_task_return_error (task, g_steal_pointer (&error));
403+
else
404+
g_task_return_boolean (task, TRUE);
405+
}
406+
407+
/**
408+
* xdp_portal_register:
409+
* @portal: a [class@Portal]
410+
* @app_id: an application ID matching the basename of a desktop file
411+
* @cancellable: (nullable): optional [[email protected]]
412+
* @callback: (scope async): a callback to call when the request is done
413+
* @data: (closure): data to pass to @callback
414+
*
415+
* Registers the application ID with the org.freedesktop.host.Registry portal.
416+
* Doing this when sandboxed is a no-op, but when running on the host, it will
417+
* help associating portal requests with an application.
418+
*
419+
* When the request is done, @callback will be called. You can then
420+
* call [[email protected]_finish] to get the results.
421+
*/
422+
void
423+
xdp_portal_register (XdpPortal *portal,
424+
const char *app_id,
425+
GCancellable *cancellable,
426+
GAsyncReadyCallback callback,
427+
gpointer user_data)
428+
{
429+
g_autoptr(GTask) task = NULL;
430+
GVariantBuilder options;
431+
g_autoptr(GError) error = NULL;
432+
433+
g_return_if_fail (XDP_IS_PORTAL (portal));
434+
g_return_if_fail (app_id);
435+
g_return_if_fail (g_strcmp0 (app_id, "") != 0);
436+
437+
task = g_task_new (portal, cancellable, callback, user_data);
438+
g_task_set_source_tag (task, xdp_portal_register);
439+
440+
if (xdp_portal_running_under_flatpak ())
441+
{
442+
g_task_return_boolean (task, TRUE);
443+
return;
444+
}
445+
446+
if (xdp_portal_running_under_snap (&error))
447+
{
448+
g_task_return_boolean (task, TRUE);
449+
return;
450+
}
451+
452+
if (error)
453+
{
454+
g_task_return_error (task, error);
455+
return;
456+
}
457+
458+
g_variant_builder_init (&options, G_VARIANT_TYPE_VARDICT);
459+
460+
g_dbus_connection_call (portal->bus,
461+
PORTAL_BUS_NAME,
462+
PORTAL_OBJECT_PATH,
463+
"org.freedesktop.host.portal.Registry",
464+
"Register",
465+
g_variant_new ("(sa{sv})", app_id, &options),
466+
NULL,
467+
G_DBUS_CALL_FLAGS_NONE,
468+
-1,
469+
NULL,
470+
register_cb,
471+
g_object_ref (task));
472+
}
473+
474+
/**
475+
* xdp_portal_register_finish:
476+
* @portal: a [class@Portal]
477+
* @result: a [[email protected]]
478+
* @error: return location for an error
479+
*
480+
* Finishes the registry registration request.
481+
*
482+
* Returns %TRUE if the registration succeeded, or app was sandboxed, in which
483+
* case, the operation was a no-op.
484+
*
485+
* Returns: %TRUE on success
486+
*/
487+
gboolean
488+
xdp_portal_register_finish (XdpPortal *portal,
489+
GAsyncResult *result,
490+
GError **error)
491+
{
492+
g_return_val_if_fail (XDP_IS_PORTAL (portal), FALSE);
493+
g_return_val_if_fail (g_task_is_valid (result, portal), FALSE);
494+
g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
495+
xdp_portal_register, FALSE);
496+
497+
return g_task_propagate_boolean (G_TASK (result), error);
498+
}
499+
389500
/* This function is copied from xdg-desktop-portal */
390501
static int
391502
_xdp_parse_cgroup_file (FILE *f, gboolean *is_snap)

0 commit comments

Comments
 (0)