/** * fu_util_update_cb: **/ static void fu_util_update_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { FuUtilPrivate *priv = (FuUtilPrivate *) user_data; GDBusConnection *con = G_DBUS_CONNECTION (source_object); priv->message = g_dbus_connection_send_message_with_reply_finish (con, res, &priv->error); g_main_loop_quit (priv->loop); }
static void open_file_msg_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { FilechooserPortalData *data = user_data; GtkFileChooserNative *self = data->self; GDBusMessage *reply; GError *error = NULL; reply = g_dbus_connection_send_message_with_reply_finish (data->connection, res, &error); if (reply && g_dbus_message_to_gerror (reply, &error)) g_clear_object (&reply); if (reply == NULL) { if (!data->hidden) _gtk_native_dialog_emit_response (GTK_NATIVE_DIALOG (self), GTK_RESPONSE_DELETE_EVENT); g_warning ("Can't open portal file chooser: %s", error->message); g_error_free (error); filechooser_portal_data_free (data); self->mode_data = NULL; return; } g_variant_get_child (g_dbus_message_get_body (reply), 0, "o", &data->portal_handle); if (data->hidden) { /* The dialog was hidden before we got the handle, close it now */ send_close (data); filechooser_portal_data_free (data); self->mode_data = NULL; } else { data->portal_response_signal_id = g_dbus_connection_signal_subscribe (data->connection, "org.freedesktop.portal.Desktop", "org.freedesktop.portal.Request", "Response", data->portal_handle, NULL, G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE, response_cb, self, NULL); } g_object_unref (reply); }
gboolean eas_gdbus_call_finish (struct eas_gdbus_client *client, GAsyncResult *result, guint cancel_serial, const gchar *out_params, va_list *ap, GError **error) { GDBusMessage *reply; gchar *out_params_type = (gchar *) out_params; gboolean success = FALSE; GVariant *v; reply = g_dbus_connection_send_message_with_reply_finish(client->connection, result, error); if (cancel_serial) { GDBusMessage *message; message = g_dbus_message_new_method_call (EAS_SERVICE_NAME, EAS_SERVICE_COMMON_OBJECT_PATH, EAS_SERVICE_COMMON_INTERFACE, "cancel_request"); g_dbus_message_set_body (message, g_variant_new ("(su)", client->account_uid, cancel_serial)); g_dbus_connection_send_message (client->connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); g_object_unref (message); } if (!reply) return FALSE; /* g_variant_is_of_type() will fail to match a DBus return of (sas) with a format string of (s^as), where the ^ is required to make it convert to a strv instead of something more complicated. So we remove all ^ characters from the string that we show to g_variant_is_of_type(). Ick. */ if (out_params && strchr (out_params, '^')) { gchar *x, *y; out_params_type = g_strdup (out_params); x = y = strchr (out_params_type, '^'); y++; while (*y) { if (*y == '^') y++; else *(x++) = *(y++); } *x = 0; } switch (g_dbus_message_get_message_type (reply)) { case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: /* An empty (successful) response will give a NULL GVariant here */ v = g_dbus_message_get_body (reply); if (!out_params) { if (v) goto inval; else { success = TRUE; break; } } if (!g_variant_is_of_type (v, G_VARIANT_TYPE (out_params_type))) { inval: g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "ActiveSync DBus call returned invalid response type %s", v?g_variant_get_type_string (v):"()"); goto out; g_object_unref (reply); } g_variant_get_va (v, out_params, NULL, ap); success = TRUE; break; case G_DBUS_MESSAGE_TYPE_ERROR: g_dbus_message_to_gerror (reply, error); break; default: g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "EAS DBus call returned weird message type %d", g_dbus_message_get_message_type (reply)); break; } out: if (out_params_type != out_params) g_free (out_params_type); g_object_unref (reply); return success; }