[grilo-plugins] tracker: add cancel support



commit ae399f88eff0aa85b15867e8605afe40fb43d336
Author: Lionel Landwerlin <lionel g landwerlin linux intel com>
Date:   Thu Jan 20 14:20:29 2011 +0000

    tracker: add cancel support
    
    Signed-off-by: Lionel Landwerlin <lionel g landwerlin linux intel com>
    Signed-off-by: Juan A. Suarez Romero <jasuarez igalia com>

 src/tracker/grl-tracker.c |   89 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 67 insertions(+), 22 deletions(-)
---
diff --git a/src/tracker/grl-tracker.c b/src/tracker/grl-tracker.c
index ef9c33b..3ceb7ec 100644
--- a/src/tracker/grl-tracker.c
+++ b/src/tracker/grl-tracker.c
@@ -29,6 +29,7 @@
 
 #include <grilo.h>
 #include <string.h>
+#include <gio/gio.h>
 #include <tracker-sparql.h>
 
 #include "grl-tracker.h"
@@ -106,6 +107,7 @@ struct OperationSpec {
   GrlMediaSource         *source;
   GrlTrackerSourcePriv   *priv;
   guint                   operation_id;
+  GCancellable           *cancel_op;
   const GList            *keys;
   guint                   skip;
   guint                   count;
@@ -122,6 +124,8 @@ enum {
 
 struct _GrlTrackerSourcePriv {
   TrackerSparqlConnection *tracker_connection;
+
+  GHashTable *operations;
 };
 
 #define GRL_TRACKER_SOURCE_GET_PRIVATE(object)		\
@@ -156,6 +160,9 @@ static void grl_tracker_source_search (GrlMediaSource *source,
 static void grl_tracker_source_browse (GrlMediaSource *source,
                                        GrlMediaSourceBrowseSpec *bs);
 
+static void grl_tracker_source_cancel (GrlMediaSource *source,
+                                       guint operation_id);
+
 static void setup_key_mappings (void);
 
 /* ===================== Globals  ================= */
@@ -228,10 +235,11 @@ grl_tracker_source_class_init (GrlTrackerSourceClass * klass)
   GrlMetadataSourceClass *metadata_class = GRL_METADATA_SOURCE_CLASS (klass);
   GObjectClass           *g_class        = G_OBJECT_CLASS (klass);
 
-  source_class->query = grl_tracker_source_query;
+  source_class->query    = grl_tracker_source_query;
   source_class->metadata = grl_tracker_source_metadata;
   source_class->search   = grl_tracker_source_search;
   source_class->browse   = grl_tracker_source_browse;
+  source_class->cancel   = grl_tracker_source_cancel;
 
   metadata_class->supported_keys = grl_tracker_source_supported_keys;
 
@@ -257,7 +265,11 @@ grl_tracker_source_class_init (GrlTrackerSourceClass * klass)
 static void
 grl_tracker_source_init (GrlTrackerSource *source)
 {
-  source->priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
+  GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
+
+  source->priv = priv;
+
+  priv->operations = g_hash_table_new (g_direct_hash, g_direct_equal);
 }
 
 static void
@@ -425,14 +437,35 @@ get_mapping_from_grl (const GrlKeyID key)
   return (GList *) g_hash_table_lookup (grl_to_sparql_mapping, key);
 }
 
+static struct OperationSpec *
+tracker_operation_initiate (GrlMediaSource *source,
+                            GrlTrackerSourcePriv *priv,
+                            guint operation_id)
+{
+  struct OperationSpec *os = g_slice_new0 (struct OperationSpec);
+
+  os->source       = source;
+  os->priv         = priv;
+  os->operation_id = operation_id;
+  os->cancel_op    = g_cancellable_new ();
+
+  g_hash_table_insert (priv->operations, GSIZE_TO_POINTER (operation_id), os);
+
+  return os;
+}
+
 static void
-tracker_operation_terminate (struct OperationSpec *operation)
+tracker_operation_terminate (struct OperationSpec *os)
 {
-  if (operation == NULL)
+  if (os == NULL)
     return;
 
-  g_object_unref (G_OBJECT (operation->cursor));
-  g_slice_free (struct OperationSpec, operation);
+  g_hash_table_remove (os->priv->operations,
+                       GSIZE_TO_POINTER (os->operation_id));
+
+  g_object_unref (G_OBJECT (os->cursor));
+  g_object_unref (G_OBJECT (os->cancel_op));
+  g_slice_free (struct OperationSpec, os);
 }
 
 static gchar *
@@ -567,6 +600,13 @@ tracker_query_result_cb (GObject              *source_object,
 
   GRL_DEBUG ("%s", __FUNCTION__);
 
+  if (g_cancellable_is_cancelled (operation->cancel_op)) {
+    GRL_DEBUG ("\tOperation %u cancelled", operation->operation_id);
+    tracker_operation_terminate (operation);
+
+    return;
+  }
+
   if (!tracker_sparql_cursor_next_finish (operation->cursor,
                                           result,
                                           &tracker_error)) {
@@ -626,7 +666,7 @@ tracker_query_result_cb (GObject              *source_object,
   if (operation->count < 1)
         tracker_operation_terminate (operation);
   else
-    tracker_sparql_cursor_next_async (operation->cursor, NULL,
+    tracker_sparql_cursor_next_async (operation->cursor, operation->cancel_op,
                                       (GAsyncReadyCallback) tracker_query_result_cb,
                                       (gpointer) operation);
 }
@@ -797,10 +837,7 @@ grl_tracker_source_query (GrlMediaSource *source,
 
   GRL_DEBUG ("select : %s", qs->query);
 
-  os = g_slice_new0 (struct OperationSpec);
-  os->source       = qs->source;
-  os->priv         = priv;
-  os->operation_id = qs->query_id;
+  os = tracker_operation_initiate (source, priv, qs->query_id);
   os->keys         = qs->keys;
   os->skip         = qs->skip;
   os->count        = qs->count;
@@ -809,7 +846,7 @@ grl_tracker_source_query (GrlMediaSource *source,
 
   tracker_sparql_connection_query_async (priv->tracker_connection,
                                          qs->query,
-                                         NULL,
+                                         os->cancel_op,
                                          (GAsyncReadyCallback) tracker_query_cb,
                                          os);
 
@@ -871,10 +908,7 @@ grl_tracker_source_search (GrlMediaSource *source, GrlMediaSourceSearchSpec *ss)
 
   GRL_DEBUG ("select: '%s'", sparql_final);
 
-  os = g_slice_new0 (struct OperationSpec);
-  os->source       = ss->source;
-  os->priv         = priv;
-  os->operation_id = ss->search_id;
+  os = tracker_operation_initiate (source, priv, ss->search_id);
   os->keys         = ss->keys;
   os->skip         = ss->skip;
   os->count        = ss->count;
@@ -883,7 +917,7 @@ grl_tracker_source_search (GrlMediaSource *source, GrlMediaSourceSearchSpec *ss)
 
   tracker_sparql_connection_query_async (priv->tracker_connection,
                                          sparql_final,
-                                         NULL,
+                                         os->cancel_op,
                                          (GAsyncReadyCallback) tracker_query_cb,
                                          os);
 
@@ -938,10 +972,7 @@ grl_tracker_source_browse (GrlMediaSource *source,
 
   GRL_DEBUG ("select: '%s'", sparql_final);
 
-  os = g_slice_new0 (struct OperationSpec);
-  os->source       = bs->source;
-  os->priv         = priv;
-  os->operation_id = bs->browse_id;
+  os = tracker_operation_initiate (source, priv, bs->browse_id);
   os->keys         = bs->keys;
   os->skip         = bs->skip;
   os->count        = bs->count;
@@ -950,10 +981,24 @@ grl_tracker_source_browse (GrlMediaSource *source,
 
   tracker_sparql_connection_query_async (priv->tracker_connection,
                                          sparql_final,
-                                         NULL,
+                                         os->cancel_op,
                                          (GAsyncReadyCallback) tracker_query_cb,
                                          os);
 
   g_free (sparql_select);
   g_free (sparql_final);
 }
+
+static void
+grl_tracker_source_cancel (GrlMediaSource *source, guint operation_id)
+{
+  GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
+  struct OperationSpec *os;
+
+  GRL_DEBUG ("%s", __FUNCTION__);
+
+  os = g_hash_table_lookup (priv->operations, GSIZE_TO_POINTER (operation_id));
+
+  if (os != NULL)
+    g_cancellable_cancel (os->cancel_op);
+}



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