static gboolean handle_close (XdpRequest *object, GDBusMethodInvocation *invocation, Request *request) { g_autoptr(GError) error = NULL; REQUEST_AUTOLOCK (request); if (request->exported) { const char *handle = g_object_get_data (G_OBJECT (request), "impl-handle"); if (!xdp_impl_file_chooser_call_close_sync (impl, request->sender, request->app_id, handle, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); return TRUE; } unregister_handle (handle); request_unexport (request); } xdp_request_complete_close (XDP_REQUEST (request), invocation); return TRUE; }
static void print_done (GObject *source, GAsyncResult *result, gpointer data) { g_autoptr(Request) request = data; guint response = 2; g_autoptr(GVariant) options = NULL; g_autoptr(GError) error = NULL; REQUEST_AUTOLOCK (request); if (!xdp_impl_print_call_print_finish (XDP_IMPL_PRINT (source), &response, &options, NULL, result, &error)) { g_warning ("Backend call failed: %s", error->message); } if (request->exported) { GVariantBuilder opt_builder; g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT); xdp_request_emit_response (XDP_REQUEST (request), response, g_variant_builder_end (&opt_builder)); request_unexport (request); } }
static void emit_response (XdpImplFileChooser *object, gboolean for_save, const gchar *arg_destination, const gchar *arg_handle, guint arg_response, const gchar *const *arg_uris, GVariant *arg_options) { g_autoptr(Request) request = lookup_request_by_handle (arg_handle); GVariantBuilder uris; GVariantBuilder results; g_autofree char *ruri = NULL; gboolean writable = TRUE; g_autoptr(GError) error = NULL; g_autoptr(GVariant) choices = NULL; int i; if (request == NULL) return; REQUEST_AUTOLOCK (request); if (!g_variant_lookup (arg_options, "b", "writable", &writable)) writable = FALSE; g_variant_builder_init (&results, G_VARIANT_TYPE_VARDICT); choices = g_variant_lookup_value (arg_options, "choices", G_VARIANT_TYPE ("a(ss)")); if (choices) g_variant_builder_add (&results, "{sv}", "choices", choices); g_variant_builder_init (&uris, G_VARIANT_TYPE ("as")); for (i = 0; arg_uris[i] != NULL; i++) { const char *uri = arg_uris[i]; ruri = register_document (uri, request->app_id, for_save, writable, &error); if (ruri == NULL) { g_warning ("Failed to register %s: %s\n", uri, error->message); g_clear_error (&error); } else { g_debug ("convert uri %s -> %s\n", uri, ruri); g_variant_builder_add (&uris, "s", ruri); } } g_variant_builder_add (&results, "{&sv}", "uris", g_variant_builder_end (&uris)); if (request->exported) { xdp_request_emit_response (XDP_REQUEST (request), arg_response, g_variant_builder_end (&results)); unregister_handle (arg_handle); request_unexport (request); } }
static void send_response_in_thread_func (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable) { Request *request = task_data; GVariantBuilder results; GVariantBuilder ruris; guint response; GVariant *options; gboolean writable = TRUE; const char **uris; GVariant *choices; gboolean for_save; g_variant_builder_init (&results, G_VARIANT_TYPE_VARDICT); g_variant_builder_init (&ruris, G_VARIANT_TYPE_STRING_ARRAY); REQUEST_AUTOLOCK (request); for_save = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (request), "for-save")); response = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (request), "response")); options = (GVariant *)g_object_get_data (G_OBJECT (request), "options"); if (response != 0) goto out; if (!g_variant_lookup (options, "b", "writable", &writable)) writable = FALSE; choices = g_variant_lookup_value (options, "choices", G_VARIANT_TYPE ("a(ss)")); if (choices) g_variant_builder_add (&results, "{sv}", "choices", choices); if (g_variant_lookup (options, "uris", "^a&s", &uris)) { int i; for (i = 0; uris && uris[i]; i++) { g_autofree char *ruri = NULL; g_autoptr(GError) error = NULL; ruri = register_document (uris[i], request->app_id, for_save, writable, &error); if (ruri == NULL) { g_warning ("Failed to register %s: %s", uris[i], error->message); continue; } g_debug ("convert uri %s -> %s\n", uris[i], ruri); g_variant_builder_add (&ruris, "s", ruri); } } out: g_variant_builder_add (&results, "{sv}", "uris", g_variant_builder_end (&ruris)); if (request->exported) { xdp_request_emit_response (XDP_REQUEST (request), response, g_variant_builder_end (&results)); request_unexport (request); } }