[gnome-photos] organize-collection-view, set-collection-job: Convert to async API
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos] organize-collection-view, set-collection-job: Convert to async API
- Date: Fri, 9 Feb 2018 11:16:42 +0000 (UTC)
commit 9c07b779ce258b1faf7e901e28b7b556acac38a8
Author: Debarshi Ray <debarshir gnome org>
Date: Thu Feb 8 00:07:25 2018 +0100
organize-collection-view, set-collection-job: Convert to async API
https://gitlab.gnome.org/GNOME/gnome-photos/issues/44
src/photos-organize-collection-view.c | 18 +++++++--
src/photos-set-collection-job.c | 76 +++++++++++++++++++++++------------
src/photos-set-collection-job.h | 11 +++--
3 files changed, 73 insertions(+), 32 deletions(-)
---
diff --git a/src/photos-organize-collection-view.c b/src/photos-organize-collection-view.c
index cc6eb3aa..b8a26590 100644
--- a/src/photos-organize-collection-view.c
+++ b/src/photos-organize-collection-view.c
@@ -79,9 +79,18 @@ photos_organize_collection_view_check_cell (GtkTreeViewColumn *tree_column,
static void
-photos_organize_collection_view_set_collection_executed (gpointer user_data)
+photos_organize_collection_view_set_collection_executed (GObject *source_object, GAsyncResult *res, gpointer
user_data)
{
PhotosOrganizeCollectionView *self = PHOTOS_ORGANIZE_COLLECTION_VIEW (user_data);
+ GError *error;
+ PhotosSetCollectionJob *job = PHOTOS_SET_COLLECTION_JOB (source_object);
+
+ error = NULL;
+ if (!photos_set_collection_job_finish (job, res, &error))
+ {
+ g_warning ("Unable to set collection: %s", error->message);
+ g_error_free (error);
+ }
photos_organize_collection_model_refresh_collection_state (PHOTOS_ORGANIZE_COLLECTION_MODEL (self->model));
g_object_unref (self);
@@ -103,7 +112,10 @@ photos_organize_collection_view_check_toggled (PhotosOrganizeCollectionView *sel
state = gtk_cell_renderer_toggle_get_active (GTK_CELL_RENDERER_TOGGLE (self->renderer_check));
job = photos_set_collection_job_new (coll_urn, !state);
- photos_set_collection_job_run (job, photos_organize_collection_view_set_collection_executed, g_object_ref
(self));
+ photos_set_collection_job_run (job,
+ NULL,
+ photos_organize_collection_view_set_collection_executed,
+ g_object_ref (self));
g_object_unref (job);
g_free (coll_urn);
@@ -153,7 +165,7 @@ photos_organize_collection_view_create_collection_executed (GObject *source_obje
gtk_list_store_set (self->model, &iter, PHOTOS_ORGANIZE_MODEL_ID, created_urn, -1);
set_job = photos_set_collection_job_new (created_urn, TRUE);
- photos_set_collection_job_run (set_job, NULL, NULL);
+ photos_set_collection_job_run (set_job, NULL, NULL, NULL);
out:
g_clear_object (&set_job);
diff --git a/src/photos-set-collection-job.c b/src/photos-set-collection-job.c
index a297dfa6..1e8b6832 100644
--- a/src/photos-set-collection-job.c
+++ b/src/photos-set-collection-job.c
@@ -23,7 +23,6 @@
#include "config.h"
-#include <gio/gio.h>
#include <glib.h>
#include <tracker-sparql.h>
@@ -39,13 +38,12 @@
struct _PhotosSetCollectionJob
{
GObject parent_instance;
+ GError *queue_error;
PhotosSelectionController *sel_cntrlr;
- PhotosSetCollectionJobCallback callback;
PhotosTrackerQueue *queue;
gboolean setting;
gchar *collection_urn;
gint running_jobs;
- gpointer user_data;
};
enum
@@ -62,34 +60,38 @@ G_DEFINE_TYPE (PhotosSetCollectionJob, photos_set_collection_job, G_TYPE_OBJECT)
static void
photos_set_collection_job_update_mtime (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
+ GTask *task = G_TASK (user_data);
PhotosUpdateMtimeJob *job = PHOTOS_UPDATE_MTIME_JOB (source_object);
- PhotosSetCollectionJob *self = PHOTOS_SET_COLLECTION_JOB (user_data);
GError *error = NULL;
photos_update_mtime_job_finish (job, res, &error);
if (error != NULL)
{
- g_warning ("Unable to update mtime: %s", error->message);
- g_error_free (error);
+ g_task_return_error (task, error);
+ goto out;
}
- if (self->callback != NULL)
- (*self->callback) (self->user_data);
+ g_task_return_boolean (task, TRUE);
- g_object_unref (self);
+ out:
+ g_object_unref (task);
}
static void
-photos_set_collection_job_job_collector (PhotosSetCollectionJob *self)
+photos_set_collection_job_job_collector (PhotosSetCollectionJob *self, GTask *task)
{
+ GCancellable *cancellable;
+
+ cancellable = g_task_get_cancellable (task);
+
self->running_jobs--;
if (self->running_jobs == 0)
{
PhotosUpdateMtimeJob *job;
job = photos_update_mtime_job_new (self->collection_urn);
- photos_update_mtime_job_run (job, NULL, photos_set_collection_job_update_mtime, g_object_ref (self));
+ photos_update_mtime_job_run (job, cancellable, photos_set_collection_job_update_mtime, g_object_ref
(task));
g_object_unref (job);
}
}
@@ -98,20 +100,22 @@ photos_set_collection_job_job_collector (PhotosSetCollectionJob *self)
static void
photos_set_collection_job_query_executed (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
- PhotosSetCollectionJob *self = PHOTOS_SET_COLLECTION_JOB (user_data);
+ PhotosSetCollectionJob *self;
+ GTask *task = G_TASK (user_data);
TrackerSparqlConnection *connection = TRACKER_SPARQL_CONNECTION (source_object);
GError *error;
+ self = PHOTOS_SET_COLLECTION_JOB (g_task_get_source_object (task));
+
error = NULL;
tracker_sparql_connection_update_finish (connection, res, &error);
if (error != NULL)
{
- g_warning ("Unable to add item to collection: %s", error->message);
- g_error_free (error);
+ g_task_return_error (task, error);
return;
}
- photos_set_collection_job_job_collector (self);
+ photos_set_collection_job_job_collector (self, task);
}
@@ -132,6 +136,7 @@ photos_set_collection_job_finalize (GObject *object)
{
PhotosSetCollectionJob *self = PHOTOS_SET_COLLECTION_JOB (object);
+ g_clear_error (&self->queue_error);
g_free (self->collection_urn);
G_OBJECT_CLASS (photos_set_collection_job_parent_class)->finalize (object);
@@ -164,7 +169,7 @@ static void
photos_set_collection_job_init (PhotosSetCollectionJob *self)
{
self->sel_cntrlr = photos_selection_controller_dup_singleton ();
- self->queue = photos_tracker_queue_dup_singleton (NULL, NULL);
+ self->queue = photos_tracker_queue_dup_singleton (NULL, &self->queue_error);
}
@@ -206,26 +211,44 @@ photos_set_collection_job_new (const gchar *collection_urn, gboolean setting)
}
+gboolean
+photos_set_collection_job_finish (PhotosSetCollectionJob *self, GAsyncResult *res, GError **error)
+{
+ GTask *task;
+
+ g_return_val_if_fail (PHOTOS_IS_SET_COLLECTION_JOB (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_set_collection_job_run, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ return g_task_propagate_boolean (task, error);
+}
+
+
void
photos_set_collection_job_run (PhotosSetCollectionJob *self,
- PhotosSetCollectionJobCallback callback,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
gpointer user_data)
{
GApplication *app;
GList *l;
GList *urns;
+ GTask *task = NULL;
PhotosSearchContextState *state;
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, photos_set_collection_job_run);
+
if (G_UNLIKELY (self->queue == NULL))
{
- if (callback != NULL)
- (*callback) (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));
@@ -242,10 +265,13 @@ photos_set_collection_job_run (PhotosSetCollectionJob *self,
query = photos_query_builder_set_collection_query (state, urn, self->collection_urn, self->setting);
photos_tracker_queue_update (self->queue,
query,
- NULL,
+ cancellable,
photos_set_collection_job_query_executed,
- g_object_ref (self),
+ g_object_ref (task),
g_object_unref);
g_object_unref (query);
}
+
+ out:
+ g_clear_object (&task);
}
diff --git a/src/photos-set-collection-job.h b/src/photos-set-collection-job.h
index 952df391..f8bb2f96 100644
--- a/src/photos-set-collection-job.h
+++ b/src/photos-set-collection-job.h
@@ -23,19 +23,22 @@
#ifndef PHOTOS_SET_COLLECTION_JOB_H
#define PHOTOS_SET_COLLECTION_JOB_H
-#include <glib-object.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
#define PHOTOS_TYPE_SET_COLLECTION_JOB (photos_set_collection_job_get_type ())
G_DECLARE_FINAL_TYPE (PhotosSetCollectionJob, photos_set_collection_job, PHOTOS, SET_COLLECTION_JOB,
GObject);
-typedef void (*PhotosSetCollectionJobCallback) (gpointer);
-
PhotosSetCollectionJob *photos_set_collection_job_new (const gchar *collection_urn, gboolean
setting);
+gboolean photos_set_collection_job_finish (PhotosSetCollectionJob *self,
+ GAsyncResult *res,
+ GError **error);
+
void photos_set_collection_job_run (PhotosSetCollectionJob *self,
- PhotosSetCollectionJobCallback callback,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
gpointer user_data);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]