diff options
author | Ondrej Holy <oholy@redhat.com> | 2016-06-30 13:10:47 +0200 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2017-11-28 14:51:56 +0100 |
commit | 17e630d3ae8b5b31f4887a1970517494e9599a96 (patch) | |
tree | df64f75238a1a39688144be9f53ab1068568814e /monitor | |
parent | ff0a2d2a42d54e9242d9fd2832cc486d7c9eb10b (diff) | |
download | gvfs-17e630d3ae8b5b31f4887a1970517494e9599a96.tar.gz |
udisks2: Port GVfsUDisks2Volume to GTask
GSimpleAsyncResult is deprecated in favour of GTask and should be replaced.
https://bugzilla.gnome.org/show_bug.cgi?id=747412
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/udisks2/gvfsudisks2volume.c | 383 |
1 files changed, 157 insertions, 226 deletions
diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c index 2469b8a7..d93b1a9c 100644 --- a/monitor/udisks2/gvfsudisks2volume.c +++ b/monitor/udisks2/gvfsudisks2volume.c @@ -48,10 +48,7 @@ struct _GVfsUDisks2VolumeClass GObjectClass parent_class; }; -struct MountData; -typedef struct MountData MountData; - -static void mount_cancel_pending_op (MountData *data); +static void mount_cancel_pending_op (GTask *task); struct _GVfsUDisks2Volume { @@ -84,16 +81,11 @@ struct _GVfsUDisks2Volume * is used to cancel the operation to make possible authentication dialogs go * away. */ - MountData *mount_pending_op; + GTask *mount_pending_op; }; -struct MountData +typedef struct MountData { - GSimpleAsyncResult *simple; - - GVfsUDisks2Volume *volume; - GCancellable *cancellable; - gulong mount_operation_reply_handler_id; gulong mount_operation_aborted_handler_id; GMountOperation *mount_operation; @@ -109,7 +101,7 @@ struct MountData UDisksFilesystem *filesystem_to_mount; gboolean checked_keyring; -}; +} MountData; static void gvfs_udisks2_volume_volume_iface_init (GVolumeIface *iface); @@ -614,11 +606,13 @@ on_udisks_client_changed (UDisksClient *client, gpointer user_data) { GVfsUDisks2Volume *volume = GVFS_UDISKS2_VOLUME (user_data); - MountData *data; + MountData *data = NULL; update_volume_on_event (volume); - data = volume->mount_pending_op; + if (volume->mount_pending_op) + data = g_task_get_task_data (volume->mount_pending_op); + if (data && data->mount_operation_aborted_handler_id && data->encrypted_to_unlock) { UDisksBlock *cleartext_block; @@ -926,14 +920,6 @@ static SecretSchema luks_passphrase_schema = static void mount_data_free (MountData *data) { - if (data->volume->mount_pending_op == data) - data->volume->mount_pending_op = NULL; - - g_object_unref (data->simple); - - g_clear_object (&data->volume); - g_clear_object (&data->cancellable); - if (data->mount_operation != NULL) { if (data->mount_operation_reply_handler_id != 0) @@ -959,9 +945,11 @@ mount_data_free (MountData *data) } static void -mount_cancel_pending_op (MountData *data) +mount_cancel_pending_op (GTask *task) { - g_cancellable_cancel (data->cancellable); + MountData *data = g_task_get_task_data (task); + + g_cancellable_cancel (g_task_get_cancellable (task)); /* send an ::aborted signal to make the dialog go away */ if (data->mount_operation != NULL) g_signal_emit_by_name (data->mount_operation, "aborted"); @@ -974,7 +962,8 @@ mount_command_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + GVfsUDisks2Volume *volume = g_task_get_source_object (task); GError *error; gint exit_status; gchar *standard_error = NULL; @@ -993,39 +982,30 @@ mount_command_cb (GObject *source_object, &standard_error, &error)) { - g_simple_async_result_take_error (data->simple, error); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + g_task_return_error (task, error); } - - if (WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0) + else if (WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0) { - gvfs_udisks2_volume_monitor_update (data->volume->monitor); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + gvfs_udisks2_volume_monitor_update (volume->monitor); + g_task_return_boolean (task, TRUE); } + else + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "%s", standard_error); - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "%s", standard_error); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - - out: + g_object_unref (task); g_free (standard_error); } /* ------------------------------ */ static void -ensure_autoclear (MountData *data) +ensure_autoclear (GTask *task) { + GVfsUDisks2Volume *volume = g_task_get_source_object (task); UDisksLoop *loop; - loop = udisks_client_get_loop_for_block (gvfs_udisks2_volume_monitor_get_udisks_client (data->volume->monitor), - data->volume->block); + loop = udisks_client_get_loop_for_block (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor), + volume->block); if (loop != NULL) { if (!udisks_loop_get_autoclear (loop) && udisks_loop_get_setup_by_uid (loop) == getuid ()) @@ -1047,7 +1027,8 @@ mount_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + GVfsUDisks2Volume *volume = g_task_get_source_object (task); gchar *mount_path; GError *error; @@ -1058,24 +1039,24 @@ mount_cb (GObject *source_object, &error)) { gvfs_udisks2_utils_udisks_error_to_gio_error (error); - g_simple_async_result_take_error (data->simple, error); - g_simple_async_result_complete (data->simple); + g_task_return_error (task, error); } else { /* if mounting worked, ensure that the loop device goes away when unmounted */ - ensure_autoclear (data); + ensure_autoclear (task); - gvfs_udisks2_volume_monitor_update (data->volume->monitor); - g_simple_async_result_complete (data->simple); + gvfs_udisks2_volume_monitor_update (volume->monitor); + g_task_return_boolean (task, TRUE); g_free (mount_path); } - mount_data_free (data); + g_object_unref (task); } static void -do_mount (MountData *data) +do_mount (GTask *task) { + MountData *data = g_task_get_task_data (task); GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); @@ -1087,9 +1068,9 @@ do_mount (MountData *data) } udisks_filesystem_call_mount (data->filesystem_to_mount, g_variant_builder_end (&builder), - data->cancellable, + g_task_get_cancellable (task), mount_cb, - data); + task); } /* ------------------------------ */ @@ -1100,31 +1081,27 @@ luks_store_passphrase_cb (GObject *source, GAsyncResult *result, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); GError *error = NULL; if (secret_password_store_finish (result, &error)) { /* everything is good */ - do_mount (data); + do_mount (task); } else { /* report failure */ - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - _("Error storing passphrase in keyring (%s)"), - error->message); - g_simple_async_result_complete (data->simple); - g_error_free (error); - mount_data_free (data); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Error storing passphrase in keyring (%s)"), + error->message); + g_object_unref (task); } } #endif -static void do_unlock (MountData *data); +static void do_unlock (GTask *task); #ifdef HAVE_KEYRING @@ -1133,7 +1110,8 @@ luks_delete_passphrase_cb (GObject *source, GAsyncResult *result, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + MountData *data = g_task_get_task_data (task); GError *error = NULL; secret_password_clear_finish (result, &error); @@ -1142,19 +1120,15 @@ luks_delete_passphrase_cb (GObject *source, /* with the bad passphrase out of the way, try again */ g_free (data->passphrase); data->passphrase = NULL; - do_unlock (data); + do_unlock (task); } else { /* report failure */ - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - _("Error deleting invalid passphrase from keyring (%s)"), - error->message); - g_simple_async_result_complete (data->simple); - g_error_free (error); - mount_data_free (data); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Error deleting invalid passphrase from keyring (%s)"), + error->message); + g_object_unref (task); } } #endif @@ -1164,7 +1138,9 @@ unlock_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + MountData *data = g_task_get_task_data (task); + GVfsUDisks2Volume *volume = g_task_get_source_object (task); gchar *cleartext_device = NULL; GError *error; @@ -1185,17 +1161,16 @@ unlock_cb (GObject *source_object, g_strcmp0 (data->passphrase, data->passphrase_from_keyring) == 0) { /* nuke the invalid passphrase from keyring... */ - secret_password_clear (&luks_passphrase_schema, data->cancellable, - luks_delete_passphrase_cb, data, + secret_password_clear (&luks_passphrase_schema, g_task_get_cancellable (task), + luks_delete_passphrase_cb, task, "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock, NULL); /* sentinel */ goto out; } #endif gvfs_udisks2_utils_udisks_error_to_gio_error (error); - g_simple_async_result_take_error (data->simple, error); - g_simple_async_result_complete (data->simple); - mount_data_free (data); + g_task_return_error (task, error); + g_object_unref (task); goto out; } else @@ -1203,21 +1178,18 @@ unlock_cb (GObject *source_object, UDisksObject *object; /* if unlocking worked, ensure that the loop device goes away when locked */ - ensure_autoclear (data); + ensure_autoclear (task); - gvfs_udisks2_volume_monitor_update (data->volume->monitor); + gvfs_udisks2_volume_monitor_update (volume->monitor); - object = udisks_client_peek_object (gvfs_udisks2_volume_monitor_get_udisks_client (data->volume->monitor), + object = udisks_client_peek_object (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor), cleartext_device); data->filesystem_to_mount = object != NULL ? udisks_object_get_filesystem (object) : NULL; if (data->filesystem_to_mount == NULL) { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - _("The unlocked device does not have a recognizable file system on it")); - g_simple_async_result_complete (data->simple); - mount_data_free (data); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("The unlocked device does not have a recognizable file system on it")); + g_object_unref (task); goto out; } @@ -1249,8 +1221,8 @@ unlock_cb (GObject *source_object, secret_password_store (&luks_passphrase_schema, keyring, display_name, data->passphrase, - data->cancellable, - luks_store_passphrase_cb, data, + g_task_get_cancellable (task), + luks_store_passphrase_cb, task, "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock, NULL); /* sentinel */ goto out; @@ -1258,7 +1230,7 @@ unlock_cb (GObject *source_object, #endif /* OK, ready to rock */ - do_mount (data); + do_mount (task); } out: @@ -1270,7 +1242,9 @@ on_mount_operation_reply (GMountOperation *mount_operation, GMountOperationResult result, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + MountData *data = g_task_get_task_data (task); + GVfsUDisks2Volume *volume = g_task_get_source_object (task); /* we got what we wanted; don't listen to any other signals from the mount operation */ if (data->mount_operation_reply_handler_id != 0) @@ -1293,8 +1267,8 @@ on_mount_operation_reply (GMountOperation *mount_operation, g_object_set_data (G_OBJECT (data->mount_operation), "x-udisks2-is-unlocked", GINT_TO_POINTER (0)); - client = gvfs_udisks2_volume_monitor_get_udisks_client (data->volume->monitor); - cleartext_block = udisks_client_get_cleartext_block (client, data->volume->block); + client = gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor); + cleartext_block = udisks_client_get_cleartext_block (client, volume->block); if (cleartext_block != NULL) { UDisksObject *object; @@ -1306,44 +1280,35 @@ on_mount_operation_reply (GMountOperation *mount_operation, data->filesystem_to_mount = udisks_object_get_filesystem (object); if (data->filesystem_to_mount != NULL) { - do_mount (data); - goto out; + do_mount (task); + return; } else { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "No filesystem interface on D-Bus object for cleartext device"); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "No filesystem interface on D-Bus object for cleartext device"); } } else { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "No object for D-Bus interface"); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "No object for D-Bus interface"); } } } else if (result == G_MOUNT_OPERATION_ABORTED) { /* The user aborted the operation so consider it "handled" */ - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED_HANDLED, - "Password dialog aborted (user should never see this error since it is G_IO_ERROR_FAILED_HANDLED)"); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED_HANDLED, + "Password dialog aborted"); } else { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_PERMISSION_DENIED, - "Expected G_MOUNT_OPERATION_HANDLED but got %d", result); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED, + "Expected G_MOUNT_OPERATION_HANDLED but got %d", result); } - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + g_object_unref (task); + return; } data->passphrase = g_strdup (g_mount_operation_get_password (mount_operation)); @@ -1351,10 +1316,7 @@ on_mount_operation_reply (GMountOperation *mount_operation, /* Don't save password in keyring just yet - check if it works first */ - do_unlock (data); - - out: - ; + do_unlock (task); } static void @@ -1365,14 +1327,15 @@ on_mount_operation_aborted (GMountOperation *mount_operation, } static gboolean -has_crypttab_passphrase (MountData *data) +has_crypttab_passphrase (GTask *task) { + GVfsUDisks2Volume *volume = g_task_get_source_object (task); gboolean ret = FALSE; GVariantIter iter; GVariant *configuration_value; const gchar *configuration_type; - g_variant_iter_init (&iter, udisks_block_get_configuration (data->volume->block)); + g_variant_iter_init (&iter, udisks_block_get_configuration (volume->block)); while (g_variant_iter_next (&iter, "(&s@a{sv})", &configuration_type, &configuration_value)) { if (g_strcmp0 (configuration_type, "crypttab") == 0) @@ -1400,7 +1363,8 @@ luks_find_passphrase_cb (GObject *source, GAsyncResult *result, gpointer user_data) { - MountData *data = user_data; + GTask *task = G_TASK (user_data); + MountData *data = g_task_get_task_data (task); gchar *password; password = secret_password_lookup_finish (result, NULL); @@ -1414,19 +1378,20 @@ luks_find_passphrase_cb (GObject *source, data->passphrase_from_keyring = g_strdup (password); } /* try again */ - do_unlock (data); + do_unlock (task); } #endif static void -do_unlock (MountData *data) +do_unlock (GTask *task) { + MountData *data = g_task_get_task_data (task); GVariantBuilder builder; if (data->passphrase == NULL) { /* If the passphrase is in the crypttab file, no need to ask the user, just use a blank passphrase */ - if (has_crypttab_passphrase (data)) + if (has_crypttab_passphrase (task)) { data->passphrase = g_strdup (""); } @@ -1439,8 +1404,8 @@ do_unlock (MountData *data) if (!data->checked_keyring) { data->checked_keyring = TRUE; - secret_password_lookup (&luks_passphrase_schema, data->cancellable, - luks_find_passphrase_cb, data, + secret_password_lookup (&luks_passphrase_schema, g_task_get_cancellable (task), + luks_find_passphrase_cb, task, "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock, NULL); /* sentinel */ goto out; @@ -1449,23 +1414,20 @@ do_unlock (MountData *data) if (data->mount_operation == NULL) { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - _("A passphrase is required to access the volume")); - g_simple_async_result_complete (data->simple); - mount_data_free (data); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("A passphrase is required to access the volume")); + g_object_unref (task); goto out; } data->mount_operation_reply_handler_id = g_signal_connect (data->mount_operation, "reply", G_CALLBACK (on_mount_operation_reply), - data); + task); data->mount_operation_aborted_handler_id = g_signal_connect (data->mount_operation, "aborted", G_CALLBACK (on_mount_operation_aborted), - data); + task); /* Translators: This is the message shown to users */ message = g_strdup_printf (_("Enter a passphrase to unlock the volume\n" "The passphrase is needed to access encrypted data on %s."), @@ -1508,9 +1470,9 @@ do_unlock (MountData *data) udisks_encrypted_call_unlock (data->encrypted_to_unlock, data->passphrase, g_variant_builder_end (&builder), - data->cancellable, + g_task_get_cancellable (task), unlock_cb, - data); + task); out: ; } @@ -1529,41 +1491,38 @@ gvfs_udisks2_volume_mount (GVolume *_volume, UDisksBlock *block; UDisksFilesystem *filesystem; MountData *data; + GTask *task; + + task = g_task_new (volume, cancellable, callback, user_data); + g_task_set_source_tag (task, gvfs_udisks2_volume_mount); data = g_new0 (MountData, 1); - data->simple = g_simple_async_result_new (G_OBJECT (volume), - callback, - user_data, - gvfs_udisks2_volume_mount); - data->volume = g_object_ref (volume); - data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL; data->mount_operation = mount_operation != NULL ? g_object_ref (mount_operation) : NULL; + g_task_set_task_data (task, data, (GDestroyNotify)mount_data_free); + if (volume->mount_pending_op != NULL) { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "A mount operation is already pending"); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "A mount operation is already pending"); + g_object_unref (task); + return; } - volume->mount_pending_op = data; + volume->mount_pending_op = task; /* Use the mount(8) command if there is no block device */ if (volume->block == NULL) { gchar *escaped_mount_path; - escaped_mount_path = g_strescape (g_unix_mount_point_get_mount_path (data->volume->mount_point), NULL); + escaped_mount_path = g_strescape (g_unix_mount_point_get_mount_path (volume->mount_point), NULL); gvfs_udisks2_utils_spawn (10, /* timeout in seconds */ - data->cancellable, + cancellable, mount_command_cb, - data, + task, "mount \"%s\"", escaped_mount_path); g_free (escaped_mount_path); - goto out; + return; } /* if encrypted and already unlocked, just mount the cleartext block device */ @@ -1577,13 +1536,10 @@ gvfs_udisks2_volume_mount (GVolume *_volume, object = g_dbus_interface_get_object (G_DBUS_INTERFACE (block)); if (object == NULL) { - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "No object for D-Bus interface"); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "No object for D-Bus interface"); + g_object_unref (task); + return; } filesystem = udisks_object_peek_filesystem (UDISKS_OBJECT (object)); @@ -1649,53 +1605,50 @@ gvfs_udisks2_volume_mount (GVolume *_volume, } data->uuid_of_encrypted_to_unlock = udisks_block_dup_id_uuid (block); - do_unlock (data); - goto out; + do_unlock (task); + return; } - g_simple_async_result_set_error (data->simple, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "No .Filesystem or .Encrypted interface on D-Bus object"); - g_simple_async_result_complete (data->simple); - mount_data_free (data); - goto out; + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "No .Filesystem or .Encrypted interface on D-Bus object"); + g_object_unref (task); + return; } data->filesystem_to_mount = g_object_ref (filesystem); - do_mount (data); - - out: - ; + do_mount (task); } static gboolean -gvfs_udisks2_volume_mount_finish (GVolume *volume, +gvfs_udisks2_volume_mount_finish (GVolume *_volume, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - return !g_simple_async_result_propagate_error (simple, error); + GVfsUDisks2Volume *volume = GVFS_UDISKS2_VOLUME (_volume); + + g_return_val_if_fail (g_task_is_valid (result, volume), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gvfs_udisks2_volume_mount), FALSE); + + if (volume->mount_pending_op == G_TASK (result)) + volume->mount_pending_op = NULL; + + return g_task_propagate_boolean (G_TASK (result), error); } /* ---------------------------------------------------------------------------------------------------- */ -typedef struct -{ - GObject *object; - GAsyncReadyCallback callback; - gpointer user_data; -} EjectWrapperOp; - static void eject_wrapper_callback (GObject *source_object, GAsyncResult *res, gpointer user_data) { - EjectWrapperOp *data = user_data; - data->callback (data->object, res, data->user_data); - g_object_unref (data->object); - g_free (data); + GTask *task = G_TASK (user_data); + GError *error = NULL; + + if (g_drive_eject_with_operation_finish (G_DRIVE (source_object), res, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); } static void @@ -1707,33 +1660,20 @@ gvfs_udisks2_volume_eject_with_operation (GVolume *_volume, gpointer user_data) { GVfsUDisks2Volume *volume = GVFS_UDISKS2_VOLUME (_volume); - GVfsUDisks2Drive *drive; + GTask *task; - drive = NULL; - if (volume->drive != NULL) - drive = g_object_ref (volume->drive); + task = g_task_new (_volume, cancellable, callback, user_data); + g_task_set_source_tag (task, gvfs_udisks2_volume_eject_with_operation); - if (drive != NULL) + if (volume->drive != NULL) { - EjectWrapperOp *data; - data = g_new0 (EjectWrapperOp, 1); - data->object = g_object_ref (volume); - data->callback = callback; - data->user_data = user_data; - g_drive_eject_with_operation (G_DRIVE (drive), flags, mount_operation, cancellable, eject_wrapper_callback, data); - g_object_unref (drive); + g_drive_eject_with_operation (G_DRIVE (volume->drive), flags, mount_operation, cancellable, eject_wrapper_callback, task); } else { - GSimpleAsyncResult *simple; - simple = g_simple_async_result_new_error (G_OBJECT (volume), - callback, - user_data, - G_IO_ERROR, - G_IO_ERROR_FAILED, - _("Operation not supported by backend")); - g_simple_async_result_complete (simple); - g_object_unref (simple); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Operation not supported by backend")); + g_object_unref (task); } } @@ -1742,19 +1682,10 @@ gvfs_udisks2_volume_eject_with_operation_finish (GVolume *_volume, GAsyncResult *result, GError **error) { - GVfsUDisks2Volume *volume = GVFS_UDISKS2_VOLUME (_volume); - gboolean ret = TRUE; + g_return_val_if_fail (g_task_is_valid (result, _volume), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gvfs_udisks2_volume_eject_with_operation), FALSE); - if (volume->drive != NULL) - { - ret = g_drive_eject_with_operation_finish (G_DRIVE (volume->drive), result, error); - } - else - { - g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error); - ret = FALSE; - } - return ret; + return g_task_propagate_boolean (G_TASK (result), error); } static void |