[gnome-photos] create-collection-job, organize-collection-view: Convert to async API



commit 23919376f98ee6aba56af7aafd3639913a13b590
Author: Rafael Fonseca <r4f4rfs gmail com>
Date:   Thu Mar 24 15:36:21 2016 +0100

    create-collection-job, organize-collection-view: Convert to async API
    
    https://bugzilla.gnome.org/show_bug.cgi?id=764086

 src/photos-create-collection-job.c    |   59 ++++++++++++++++++++-------------
 src/photos-create-collection-job.h    |    9 +++--
 src/photos-organize-collection-view.c |   28 ++++++++++++----
 3 files changed, 63 insertions(+), 33 deletions(-)
---
diff --git a/src/photos-create-collection-job.c b/src/photos-create-collection-job.c
index e8b1408..2859359 100644
--- a/src/photos-create-collection-job.c
+++ b/src/photos-create-collection-job.c
@@ -34,16 +34,15 @@
 #include "photos-query-builder.h"
 #include "photos-search-context.h"
 #include "photos-tracker-queue.h"
+#include "photos-utils.h"
 
 
 struct _PhotosCreateCollectionJob
 {
   GObject parent_instance;
-  PhotosCreateCollectionJobCallback callback;
+  GError *queue_error;
   PhotosTrackerQueue *queue;
-  const gchar *created_urn;
   gchar *name;
-  gpointer user_data;
 };
 
 struct _PhotosCreateCollectionJobClass
@@ -64,7 +63,7 @@ G_DEFINE_TYPE (PhotosCreateCollectionJob, photos_create_collection_job, G_TYPE_O
 static void
 photos_create_collection_job_query_executed (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
-  PhotosCreateCollectionJob *self = PHOTOS_CREATE_COLLECTION_JOB (user_data);
+  GTask *task = G_TASK (user_data);
   TrackerSparqlConnection *connection = TRACKER_SPARQL_CONNECTION (source_object);
   GError *error;
   GVariant *variant;
@@ -76,9 +75,8 @@ photos_create_collection_job_query_executed (GObject *source_object, GAsyncResul
   variant = tracker_sparql_connection_update_blank_finish (connection, res, &error);
   if (error != NULL)
     {
-      g_warning ("Unable to create collection: %s", error->message);
-      g_error_free (error);
-      goto out;
+      g_task_return_error (task, error);
+      return;
     }
 
   child = g_variant_get_child_value (variant, 0); /* variant is now aa{ss} */
@@ -104,13 +102,10 @@ photos_create_collection_job_query_executed (GObject *source_object, GAsyncResul
   g_variant_unref (variant);
 
   if (g_strcmp0 (key, "res") == 0)
-    self->created_urn = val;
-
- out:
-  if (self->callback != NULL)
-    (*self->callback) (self->created_urn, self->user_data);
+    g_task_return_pointer (task, g_strdup (val), g_free);
+  else
+    g_task_return_new_error (task, PHOTOS_ERROR, 0, "Failed to parse GVariant");
 
-  self->created_urn = NULL;
   g_free (val);
   g_free (key);
 }
@@ -132,6 +127,7 @@ photos_create_collection_job_finalize (GObject *object)
 {
   PhotosCreateCollectionJob *self = PHOTOS_CREATE_COLLECTION_JOB (object);
 
+  g_clear_error (&self->queue_error);
   g_free (self->name);
 
   G_OBJECT_CLASS (photos_create_collection_job_parent_class)->finalize (object);
@@ -159,7 +155,7 @@ photos_create_collection_job_set_property (GObject *object, guint prop_id, const
 static void
 photos_create_collection_job_init (PhotosCreateCollectionJob *self)
 {
-  self->queue = photos_tracker_queue_dup_singleton (NULL, NULL);
+  self->queue = photos_tracker_queue_dup_singleton (NULL, &self->queue_error);
 }
 
 
@@ -189,34 +185,51 @@ photos_create_collection_job_new (const gchar *name)
 }
 
 
+gchar *
+photos_create_collection_job_finish (PhotosCreateCollectionJob *self, GAsyncResult *res, GError **error)
+{
+  GTask *task = G_TASK (res);
+
+  g_return_val_if_fail (g_task_is_valid (res, self), NULL);
+  g_return_val_if_fail (g_task_get_source_tag (task) == photos_create_collection_job_run, NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  return g_task_propagate_pointer (task, error);
+}
+
+
 void
 photos_create_collection_job_run (PhotosCreateCollectionJob *self,
-                                  PhotosCreateCollectionJobCallback callback,
+                                  GCancellable *cancellable,
+                                  GAsyncReadyCallback callback,
                                   gpointer user_data)
 {
   GApplication *app;
   PhotosQuery *query;
   PhotosSearchContextState *state;
+  GTask *task;
+
+  task = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (task, photos_create_collection_job_run);
 
   if (G_UNLIKELY (self->queue == NULL))
     {
-      if (callback != NULL)
-        (*callback) (NULL, user_data);
-      return;
+      g_task_return_error (task, g_error_copy (self->queue_error));
+      goto out;
     }
 
-  self->callback = callback;
-  self->user_data = user_data;
-
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
   query = photos_query_builder_create_collection_query (state, self->name);
   photos_tracker_queue_update_blank (self->queue,
                                      query->sparql,
-                                     NULL,
+                                     cancellable,
                                      photos_create_collection_job_query_executed,
-                                     g_object_ref (self),
+                                     g_object_ref (task),
                                      g_object_unref);
   photos_query_free (query);
+
+ out:
+  g_object_unref (task);
 }
diff --git a/src/photos-create-collection-job.h b/src/photos-create-collection-job.h
index 48740b0..05302fb 100644
--- a/src/photos-create-collection-job.h
+++ b/src/photos-create-collection-job.h
@@ -39,8 +39,6 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
    PHOTOS_TYPE_CREATE_COLLECTION_JOB))
 
-typedef void (*PhotosCreateCollectionJobCallback) (const gchar *, gpointer);
-
 typedef struct _PhotosCreateCollectionJob      PhotosCreateCollectionJob;
 typedef struct _PhotosCreateCollectionJobClass PhotosCreateCollectionJobClass;
 
@@ -49,9 +47,14 @@ GType                       photos_create_collection_job_get_type    (void) G_GN
 PhotosCreateCollectionJob  *photos_create_collection_job_new         (const gchar *name);
 
 void                        photos_create_collection_job_run         (PhotosCreateCollectionJob *self,
-                                                                      PhotosCreateCollectionJobCallback 
callback,
+                                                                      GCancellable *cancellable,
+                                                                      GAsyncReadyCallback callback,
                                                                       gpointer user_data);
 
+gchar                      *photos_create_collection_job_finish      (PhotosCreateCollectionJob *self,
+                                                                      GAsyncResult *res,
+                                                                      GError **error);
+
 G_END_DECLS
 
 #endif /* PHOTOS_CREATE_COLLECTION_JOB_H */
diff --git a/src/photos-organize-collection-view.c b/src/photos-organize-collection-view.c
index 439d7d0..51e8309 100644
--- a/src/photos-organize-collection-view.c
+++ b/src/photos-organize-collection-view.c
@@ -112,13 +112,26 @@ photos_organize_collection_view_check_toggled (PhotosOrganizeCollectionView *sel
 
 
 static void
-photos_organize_collection_view_create_collection_executed (const gchar *created_urn, gpointer user_data)
+photos_organize_collection_view_create_collection_executed (GObject *source_object, GAsyncResult *res, 
gpointer user_data)
 {
-  PhotosOrganizeCollectionView *self = PHOTOS_ORGANIZE_COLLECTION_VIEW (user_data);
-  PhotosOrganizeCollectionViewPrivate *priv = self->priv;
+  PhotosOrganizeCollectionView *self;
+  PhotosOrganizeCollectionViewPrivate *priv;
+  PhotosCreateCollectionJob *col_job = PHOTOS_CREATE_COLLECTION_JOB (source_object);
+  PhotosSetCollectionJob *set_job = NULL;
   GtkTreeIter iter;
   GtkTreePath *path = NULL;
-  PhotosSetCollectionJob *job = NULL;
+  GError *error = NULL;
+  const gchar *created_urn;
+
+  created_urn = photos_create_collection_job_finish (col_job, res, &error);
+  if (error != NULL)
+    {
+      g_warning ("Unable to create collection: %s", error->message);
+      g_error_free (error);
+    }
+
+  self = PHOTOS_ORGANIZE_COLLECTION_VIEW (user_data);
+  priv = self->priv;
 
   if (created_urn == NULL)
     {
@@ -133,11 +146,11 @@ photos_organize_collection_view_create_collection_executed (const gchar *created
   gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path);
   gtk_list_store_set (priv->model, &iter, PHOTOS_ORGANIZE_MODEL_ID, created_urn, -1);
 
-  job = photos_set_collection_job_new (created_urn, TRUE);
-  photos_set_collection_job_run (job, NULL, NULL);
+  set_job = photos_set_collection_job_new (created_urn, TRUE);
+  photos_set_collection_job_run (set_job, NULL, NULL);
 
  out:
-  g_clear_object (&job);
+  g_clear_object (&set_job);
   gtk_tree_path_free (path);
   g_object_unref (self);
 }
@@ -210,6 +223,7 @@ photos_organize_collection_view_text_edited_real (PhotosOrganizeCollectionView *
 
   job = photos_create_collection_job_new (new_text);
   photos_create_collection_job_run (job,
+                                    NULL,
                                     photos_organize_collection_view_create_collection_executed,
                                     g_object_ref (self));
   g_object_unref (job);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]