summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Sparber <julian@sparber.net>2024-09-25 18:12:02 +0200
committerJulian Sparber <julian@sparber.net>2024-10-01 18:25:37 +0200
commit89488e98e9d066d269fe3097ccfd27388cc3d729 (patch)
treebc50031d17eebe74db83577e5c6d5b255581fb8a
parentef064d625b847e05a017fcc307e67c6f31880ce7 (diff)
gopenuriportal: Use task data instead of object data
The docs recommend using a small number of `keys` when setting data for an object, the OpenURI portal uses three different `keys` that can easily be replaced with `g_task_set_task_data()`.
-rw-r--r--gio/gopenuriportal.c68
1 files changed, 50 insertions, 18 deletions
diff --git a/gio/gopenuriportal.c b/gio/gopenuriportal.c
index 27f9d343c..707a4a929 100644
--- a/gio/gopenuriportal.c
+++ b/gio/gopenuriportal.c
@@ -165,6 +165,29 @@ enum {
XDG_DESKTOP_PORTAL_FAILED = 2
};
+typedef struct
+{
+ char *response_handle;
+ unsigned int response_signal_id;
+ gboolean open_file;
+} CallData;
+
+static CallData *
+call_data_new (void)
+{
+ return g_new0 (CallData, 1);
+}
+
+static void
+call_data_free (gpointer data)
+{
+ CallData *call = data;
+
+ g_assert (call->response_signal_id == 0);
+ g_clear_pointer (&call->response_handle, g_free);
+ g_free_sized (data, sizeof (CallData));
+}
+
static void
response_received (GDBusConnection *connection,
const char *sender_name,
@@ -175,11 +198,12 @@ response_received (GDBusConnection *connection,
gpointer user_data)
{
GTask *task = user_data;
+ CallData *call_data;
guint32 response;
- guint signal_id;
- signal_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (task), "signal-id"));
- g_dbus_connection_signal_unsubscribe (connection, signal_id);
+ call_data = g_task_get_task_data (task);
+ g_dbus_connection_signal_unsubscribe (connection, call_data->response_signal_id);
+ call_data->response_signal_id = 0;
g_variant_get (parameters, "(u@a{sv})", &response, NULL);
@@ -208,17 +232,15 @@ open_call_done (GObject *source,
GXdpOpenURI *openuri = GXDP_OPEN_URI (source);
GDBusConnection *connection;
GTask *task = user_data;
+ CallData *call_data;
GError *error = NULL;
- gboolean open_file;
gboolean res;
char *path = NULL;
- const char *handle;
- guint signal_id;
+ call_data = g_task_get_task_data (task);
connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (openuri));
- open_file = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (task), "open-file"));
- if (open_file)
+ if (call_data->open_file)
res = gxdp_open_uri_call_open_file_finish (openuri, &path, NULL, result, &error);
else
res = gxdp_open_uri_call_open_uri_finish (openuri, &path, result, &error);
@@ -231,11 +253,12 @@ open_call_done (GObject *source,
return;
}
- handle = (const char *)g_object_get_data (G_OBJECT (task), "handle");
- if (g_strcmp0 (handle, path) != 0)
+ if (g_strcmp0 (call_data->response_handle, path) != 0)
{
- signal_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (task), "signal-id"));
- g_dbus_connection_signal_unsubscribe (connection, signal_id);
+ guint signal_id;
+
+ g_dbus_connection_signal_unsubscribe (connection, call_data->response_signal_id);
+ call_data->response_signal_id = 0;
signal_id = g_dbus_connection_signal_subscribe (connection,
"org.freedesktop.portal.Desktop",
@@ -247,7 +270,9 @@ open_call_done (GObject *source,
response_received,
task,
NULL);
- g_object_set_data (G_OBJECT (task), "signal-id", GINT_TO_POINTER (signal_id));
+ g_clear_pointer (&call_data->response_handle, g_free);
+ call_data->response_signal_id = signal_id;
+ call_data->response_handle = g_steal_pointer (&path);
}
g_free (path);
@@ -261,6 +286,7 @@ g_openuri_portal_open_file_async (GFile *file,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ CallData *call_data;
GDBusConnection *connection;
GTask *task;
GVariant *opts = NULL;
@@ -293,7 +319,6 @@ g_openuri_portal_open_file_async (GFile *file,
sender[i] = '_';
handle = g_strdup_printf ("/org/freedesktop/portal/desktop/request/%s/%s", sender, token);
- g_object_set_data_full (G_OBJECT (task), "handle", handle, g_free);
g_free (sender);
signal_id = g_dbus_connection_signal_subscribe (connection,
@@ -306,7 +331,6 @@ g_openuri_portal_open_file_async (GFile *file,
response_received,
task,
NULL);
- g_object_set_data (G_OBJECT (task), "signal-id", GINT_TO_POINTER (signal_id));
g_variant_builder_init_static (&opt_builder, G_VARIANT_TYPE_VARDICT);
g_variant_builder_add (&opt_builder, "{sv}", "handle_token", g_variant_new_string (token));
@@ -318,9 +342,17 @@ g_openuri_portal_open_file_async (GFile *file,
g_variant_new_string (startup_id));
opts = g_variant_builder_end (&opt_builder);
+
+ call_data = call_data_new ();
+ call_data->response_handle = g_steal_pointer (&handle);
+ call_data->response_signal_id = signal_id;
+ g_task_set_task_data (task, call_data, call_data_free);
}
else
- task = NULL;
+ {
+ call_data = NULL;
+ task = NULL;
+ }
if (g_file_is_native (file))
{
@@ -328,8 +360,8 @@ g_openuri_portal_open_file_async (GFile *file,
GUnixFDList *fd_list = NULL;
int fd, fd_id, errsv;
- if (task)
- g_object_set_data (G_OBJECT (task), "open-file", GINT_TO_POINTER (TRUE));
+ if (call_data)
+ call_data->open_file = TRUE;
path = g_file_get_path (file);
fd = g_open (path, O_RDONLY | O_CLOEXEC);