[gnome-photos/gnome-3-38] base-item: Convert photos_base_item_trash to async API
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos/gnome-3-38] base-item: Convert photos_base_item_trash to async API
- Date: Sun, 14 Mar 2021 15:56:59 +0000 (UTC)
commit 1ed2406fbecd9b63d4a6d44684842db952a5eb6a
Author: Abanoub Ghadban <abanoub gdb gmail com>
Date: Sun Mar 14 12:42:22 2021 +0100
base-item: Convert photos_base_item_trash to async API
This enables the caller to handle any error, and properly manages the
lifetime of the asynchronous operation by keeping the application and
the item alive while it's in flight.
A subsequent commit will use this to ensure that items marked for
deletion do get deleted when the main window is closed.
https://gitlab.gnome.org/GNOME/gnome-photos/-/issues/92
src/photos-base-item.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++--
src/photos-base-item.h | 9 +++++++-
2 files changed, 63 insertions(+), 3 deletions(-)
---
diff --git a/src/photos-base-item.c b/src/photos-base-item.c
index 0d72f9c5..6f1a4ee4 100644
--- a/src/photos-base-item.c
+++ b/src/photos-base-item.c
@@ -2742,6 +2742,31 @@ photos_base_item_save_to_stream_load (GObject *source_object, GAsyncResult *res,
}
+static void
+photo_base_item_trash_executed (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+ GApplication *app;
+ g_autoptr (GTask) task = G_TASK (user_data);
+ PhotosDeleteItemJob *job = PHOTOS_DELETE_ITEM_JOB (source_object);
+
+ {
+ g_autoptr (GError) error = NULL;
+
+ if (!photos_delete_item_job_finish (job, res, &error))
+ {
+ g_task_return_error (task, error);
+ goto out;
+ }
+ }
+
+ g_task_return_boolean (task, TRUE);
+
+ out:
+ app = g_application_get_default ();
+ g_application_release (app);
+}
+
+
static void
photos_base_item_update_info_from_type (PhotosBaseItem *self)
{
@@ -4728,18 +4753,46 @@ photos_base_item_set_favorite (PhotosBaseItem *self, gboolean favorite)
void
-photos_base_item_trash (PhotosBaseItem *self)
+photos_base_item_trash_async (PhotosBaseItem *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
PhotosBaseItemPrivate *priv;
+ GApplication *app;
+ g_autoptr (GTask) task = NULL;
g_autoptr (PhotosDeleteItemJob) job = NULL;
g_return_if_fail (PHOTOS_IS_BASE_ITEM (self));
priv = photos_base_item_get_instance_private (self);
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, photos_base_item_trash_async);
+
PHOTOS_BASE_ITEM_GET_CLASS (self)->trash (self);
+ app = g_application_get_default ();
job = photos_delete_item_job_new (priv->id);
- photos_delete_item_job_run (job, NULL, NULL, NULL);
+
+ g_application_hold (app);
+ photos_delete_item_job_run (job, cancellable, photo_base_item_trash_executed, g_object_ref (task));
+}
+
+
+gboolean
+photos_base_item_trash_finish (PhotosBaseItem *self, GAsyncResult *res, GError **error)
+{
+ GTask *task;
+
+ g_return_val_if_fail (PHOTOS_IS_BASE_ITEM (self), FALSE);
+
+ g_return_val_if_fail (g_task_is_valid (res, self), FALSE);
+ task = G_TASK (res);
+
+ g_return_val_if_fail (g_task_get_source_tag (task) == photos_base_item_trash_async, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ return g_task_propagate_boolean (task, error);
}
diff --git a/src/photos-base-item.h b/src/photos-base-item.h
index add8b339..20f971ce 100644
--- a/src/photos-base-item.h
+++ b/src/photos-base-item.h
@@ -333,7 +333,14 @@ void photos_base_item_set_default_app_name (PhotosBaseItem *se
void photos_base_item_set_favorite (PhotosBaseItem *self, gboolean favorite);
-void photos_base_item_trash (PhotosBaseItem *self);
+void photos_base_item_trash_async (PhotosBaseItem *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean photos_base_item_trash_finish (PhotosBaseItem *self,
+ GAsyncResult *res,
+ GError **error);
void photos_base_item_unmark_busy (PhotosBaseItem *self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]