[gnome-online-miners] src: Pass the content type to RefreshDB



commit 86bc02f9146d993e8542d9667a910df6bfbe0b35
Author: Saurav Agarwalla <saurav agarwalla92 gmail com>
Date:   Wed Jun 25 12:18:23 2014 +0530

    src: Pass the content type to RefreshDB
    
    Add an array of strings as argument to RefreshDB to denote the type of
    content we are interested in indexing.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=728878

 src/gom-application.c    |   57 ++++++++++++++++++++++++------
 src/gom-dbus.xml         |    1 +
 src/gom-facebook-miner.c |   49 +++++++++++++++++++-------
 src/gom-flickr-miner.c   |   87 ++++++++++++++++++++++++++-------------------
 src/gom-gdata-miner.c    |   40 ++++++++++++++++-----
 src/gom-miner.c          |   48 ++++++++++++++++++++++++--
 src/gom-miner.h          |   12 +++++--
 src/gom-owncloud-miner.c |   42 +++++++++++++++++-----
 src/gom-zpj-miner.c      |   43 +++++++++++++++++------
 9 files changed, 282 insertions(+), 97 deletions(-)
---
diff --git a/src/gom-application.c b/src/gom-application.c
index 216202d..c10479a 100644
--- a/src/gom-application.c
+++ b/src/gom-application.c
@@ -35,6 +35,7 @@ struct _GomApplication
   GCancellable *cancellable;
   GomDBus *skeleton;
   GomMiner *miner;
+  GQueue *queue;
   GType miner_type;
   gboolean refreshing;
 };
@@ -52,6 +53,35 @@ enum
 
 G_DEFINE_TYPE (GomApplication, gom_application, G_TYPE_APPLICATION);
 
+static void gom_application_refresh_db_cb (GObject *source, GAsyncResult *res, gpointer user_data);
+
+static void
+gom_application_process_queue (GomApplication *self)
+{
+  GDBusMethodInvocation *invocation = NULL;
+  const gchar **index_types;
+
+  if (self->refreshing)
+    goto out;
+
+  if (g_queue_is_empty (self->queue))
+    goto out;
+
+  invocation = G_DBUS_METHOD_INVOCATION (g_queue_pop_head (self->queue));
+  index_types = g_object_get_data (G_OBJECT (invocation), "index-types");
+  gom_miner_set_index_types (self->miner, index_types);
+
+  self->refreshing = TRUE;
+  g_application_hold (G_APPLICATION (self));
+  gom_miner_refresh_db_async (self->miner,
+                              self->cancellable,
+                              gom_application_refresh_db_cb,
+                              g_object_ref (invocation));
+
+ out:
+  g_clear_object (&invocation);
+}
+
 static void
 gom_application_refresh_db_cb (GObject *source,
                                GAsyncResult *res,
@@ -77,23 +107,20 @@ gom_application_refresh_db_cb (GObject *source,
 
  out:
   g_object_unref (invocation);
+  gom_application_process_queue (self);
 }
 
 static gboolean
 gom_application_refresh_db (GomApplication *self,
-                            GDBusMethodInvocation *invocation)
+                            GDBusMethodInvocation *invocation,
+                            const gchar *const *arg_index_types)
 {
-  if (self->refreshing)
-    goto out;
-
-  g_application_hold (G_APPLICATION (self));
-
-  gom_miner_refresh_db_async (self->miner,
-                              self->cancellable,
-                              gom_application_refresh_db_cb,
-                              g_object_ref (invocation));
+  gchar **index_types;
 
- out:
+  index_types = g_strdupv ((gchar **) arg_index_types);
+  g_object_set_data_full (G_OBJECT (invocation), "index-types", index_types, (GDestroyNotify) g_strfreev);
+  g_queue_push_tail (self->queue, g_object_ref (invocation));
+  gom_application_process_queue (self);
   return TRUE;
 }
 
@@ -173,6 +200,12 @@ gom_application_dispose (GObject *object)
   g_clear_object (&self->miner);
   g_clear_object (&self->skeleton);
 
+  if (self->queue != NULL)
+    {
+      g_queue_free_full (self->queue, g_object_unref);
+      self->queue = NULL;
+    }
+
   G_OBJECT_CLASS (gom_application_parent_class)->dispose (object);
 }
 
@@ -203,6 +236,8 @@ gom_application_init (GomApplication *self)
 
   self->skeleton = gom_dbus_skeleton_new ();
   g_signal_connect_swapped (self->skeleton, "handle-refresh-db", G_CALLBACK (gom_application_refresh_db), 
self);
+
+  self->queue = g_queue_new ();
 }
 
 static void
diff --git a/src/gom-dbus.xml b/src/gom-dbus.xml
index 683e31b..01b180d 100644
--- a/src/gom-dbus.xml
+++ b/src/gom-dbus.xml
@@ -24,6 +24,7 @@
 <node>
   <interface name='org.gnome.OnlineMiners.Miner'>
     <method name='RefreshDB'>
+      <arg name='index_types' type='as' direction='in'/>
     </method>
     <property name='DisplayName' type='s' access='read'/>
   </interface>
diff --git a/src/gom-facebook-miner.c b/src/gom-facebook-miner.c
index 98b5215..8ffbb2b 100644
--- a/src/gom-facebook-miner.c
+++ b/src/gom-facebook-miner.c
@@ -194,7 +194,9 @@ account_miner_job_process_album (GomAccountMinerJob *job,
   gchar *contact_resource;
   GList *l;
   GList *photos = NULL;
+  GFBGraphAuthorizer *authorizer;
 
+  authorizer = GFBGRAPH_AUTHORIZER (g_hash_table_lookup (job->services, "photos"));
   album_id = gfbgraph_node_get_id (GFBGRAPH_NODE (album));
   album_link = gfbgraph_node_get_link (GFBGRAPH_NODE (album));
   album_created_time = gfbgraph_node_get_created_time (GFBGRAPH_NODE (album));
@@ -286,7 +288,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
   /* Album photos */
   photos = gfbgraph_node_get_connection_nodes (GFBGRAPH_NODE (album),
                                                GFBGRAPH_TYPE_PHOTO,
-                                               GFBGRAPH_AUTHORIZER (job->service),
+                                               authorizer,
                                                error);
   if (*error != NULL)
     goto out;
@@ -323,19 +325,31 @@ static void
 query_facebook (GomAccountMinerJob *job,
                 GError **error)
 {
-  GFBGraphUser *me;
+  GFBGraphAuthorizer *authorizer;
+  GFBGraphUser *me = NULL;
   const gchar *me_name;
   GList *albums = NULL;
   GList *l = NULL;
   GError *local_error = NULL;
 
-  me = gfbgraph_user_get_me (GFBGRAPH_AUTHORIZER (job->service), &local_error);
+  authorizer = GFBGRAPH_AUTHORIZER (g_hash_table_lookup (job->services, "photos"));
+  if (authorizer == NULL)
+    {
+      /* FIXME: use proper #defines and enumerated types */
+      g_set_error (&local_error,
+                   g_quark_from_static_string ("gom-error"),
+                   0,
+                   "Can not query without a service");
+      goto out;
+    }
+
+  me = gfbgraph_user_get_me (authorizer, &local_error);
   if (local_error != NULL)
     goto out;
 
   me_name = gfbgraph_user_get_name (me);
 
-  albums = gfbgraph_user_get_albums (me, GFBGRAPH_AUTHORIZER (job->service), &local_error);
+  albums = gfbgraph_user_get_albums (me, authorizer, &local_error);
   if (local_error != NULL)
     goto out;
 
@@ -362,23 +376,32 @@ query_facebook (GomAccountMinerJob *job,
   g_clear_object (&me);
 }
 
-static GObject *
-create_service (GomMiner *self,
-                GoaObject *object)
+static GHashTable *
+create_services (GomMiner *self,
+                 GoaObject *object)
 {
   GFBGraphGoaAuthorizer *authorizer;
   GError *error = NULL;
+  GHashTable *services;
+
+  services = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                    NULL, (GDestroyNotify) g_object_unref);
 
   authorizer = gfbgraph_goa_authorizer_new (object);
 
-  gfbgraph_authorizer_refresh_authorization (GFBGRAPH_AUTHORIZER (authorizer), NULL, &error);
-  if (error != NULL)
+  if (gom_miner_supports_type (self, "photos"))
     {
-      g_warning ("Error refreshing authorization (%d): %s", error->code, error->message);
-      g_error_free (error);
+      gfbgraph_authorizer_refresh_authorization (GFBGRAPH_AUTHORIZER (authorizer), NULL, &error);
+      if (error != NULL)
+        {
+          g_warning ("Error refreshing authorization (%d): %s", error->code, error->message);
+          g_error_free (error);
+        }
+
+      g_hash_table_insert (services, "photos", authorizer);
     }
 
-  return G_OBJECT (authorizer);
+  return services;
 }
 
 static void
@@ -395,6 +418,6 @@ gom_facebook_miner_class_init (GomFacebookMinerClass *klass)
   miner_class->miner_identifier = MINER_IDENTIFIER;
   miner_class->version = 1;
 
-  miner_class->create_service = create_service;
+  miner_class->create_services = create_services;
   miner_class->query = query_facebook;
 }
diff --git a/src/gom-flickr-miner.c b/src/gom-flickr-miner.c
index c769b32..6e67ac3 100644
--- a/src/gom-flickr-miner.c
+++ b/src/gom-flickr-miner.c
@@ -321,6 +321,7 @@ static void
 account_miner_job_browse_container (GomAccountMinerJob *job, FlickrEntry *entry)
 {
   GMainContext *context;
+  GrlSource *source;
   GrlOperationOptions *opts;
   const GList *keys;
   SyncData data;
@@ -332,10 +333,12 @@ account_miner_job_browse_container (GomAccountMinerJob *job, FlickrEntry *entry)
   g_main_context_push_thread_default (context);
   data.loop = g_main_loop_new (context, FALSE);
 
-  keys = grl_source_supported_keys (GRL_SOURCE (data.job->service));
-  opts = get_grl_options (GRL_SOURCE (data.job->service));
+  source = GRL_SOURCE (g_hash_table_lookup (data.job->services, "photos"));
+
+  keys = grl_source_supported_keys (source);
+  opts = get_grl_options (source);
 
-  grl_source_browse (GRL_SOURCE (job->service),
+  grl_source_browse (source,
                      entry->media,
                      keys,
                      opts,
@@ -395,15 +398,17 @@ query_flickr (GomAccountMinerJob *job,
   const GList *keys;
   GMainContext *context;
   GrlOperationOptions *opts;
+  GrlSource *source;
   SyncData data;
 
-  if (job->service == NULL)
+  source = GRL_SOURCE (g_hash_table_lookup (job->services, "photos"));
+  if (source == NULL)
   {
     /* FIXME: use proper #defines and enumerated types */
     g_set_error (error,
                  g_quark_from_static_string ("gom-error"),
                  0,
-                 "Can not query without a source");
+                 "Can not query without a service");
     return;
   }
 
@@ -417,9 +422,9 @@ query_flickr (GomAccountMinerJob *job,
   g_main_context_push_thread_default (context);
   data.loop = g_main_loop_new (context, FALSE);
 
-  keys = grl_source_supported_keys (GRL_SOURCE(job->service));
-  opts = get_grl_options (GRL_SOURCE(job->service));
-  grl_source_search (GRL_SOURCE (job->service), NULL, keys, opts, source_search_cb, &data);
+  keys = grl_source_supported_keys (source);
+  opts = get_grl_options (source);
+  grl_source_search (source, NULL, keys, opts, source_search_cb, &data);
   g_main_loop_run (data.loop);
 
   g_object_unref (opts);
@@ -456,50 +461,58 @@ source_added_cb (GrlRegistry *registry, GrlSource *source, gpointer user_data)
   g_free (source_id);
 }
 
-static GObject *
-create_service (GomMiner *self,
-                GoaObject *object)
+static GHashTable *
+create_services (GomMiner *self,
+                 GoaObject *object)
 {
+  GHashTable *services;
   GoaAccount *acc;
   GrlRegistry *registry;
   GrlSource *source = NULL;
   gchar *source_id = NULL;
 
+  services = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                    NULL, (GDestroyNotify) g_object_unref);
+
   acc = goa_object_peek_account (object);
   if (acc == NULL)
-    return NULL;
+    goto out;
 
-  source_id = g_strdup_printf ("grl-flickr-%s", goa_account_get_id (acc));
+  if (gom_miner_supports_type (self, "photos"))
+    {
+      source_id = g_strdup_printf ("grl-flickr-%s", goa_account_get_id (acc));
 
-  registry = grl_registry_get_default ();
+      registry = grl_registry_get_default ();
 
-  g_debug ("Looking for source %s", source_id);
-  source = grl_registry_lookup_source (registry, source_id);
-  if (source == NULL)
-    {
-      GMainContext *context;
-      SyncData data;
+      g_debug ("Looking for source %s", source_id);
+      source = grl_registry_lookup_source (registry, source_id);
+      if (source == NULL)
+        {
+          GMainContext *context;
+          SyncData data;
 
-      context = g_main_context_get_thread_default ();
-      data.loop = g_main_loop_new (context, FALSE);
-      data.source_id = source_id;
+          context = g_main_context_get_thread_default ();
+          data.loop = g_main_loop_new (context, FALSE);
+          data.source_id = source_id;
 
-      g_signal_connect (registry, "source-added", G_CALLBACK (source_added_cb), &data);
-      g_main_loop_run (data.loop);
-      g_main_loop_unref (data.loop);
+          g_signal_connect (registry, "source-added", G_CALLBACK (source_added_cb), &data);
+          g_main_loop_run (data.loop);
+          g_main_loop_unref (data.loop);
 
-      /* we steal the ref from data */
-      source = data.source;
-    }
-  else
-    {
-      /* freeing job calls unref upon this object */
-      g_object_ref (source);
+          /* we steal the ref from data */
+          source = data.source;
+        }
+      else
+        {
+          /* freeing job calls unref upon this object */
+          g_object_ref (source);
+        }
+      g_free (source_id);
+      g_hash_table_insert (services, "photos", source);
     }
 
-  g_free (source_id);
-
-  return G_OBJECT (source);
+ out:
+  return services;
 }
 
 static void
@@ -533,7 +546,7 @@ gom_flickr_miner_class_init (GomFlickrMinerClass *klass)
   miner_class->miner_identifier = MINER_IDENTIFIER;
   miner_class->version = 1;
 
-  miner_class->create_service = create_service;
+  miner_class->create_services = create_services;
   miner_class->query = query_flickr;
 
   grl_init (NULL, NULL);
diff --git a/src/gom-gdata-miner.c b/src/gom-gdata-miner.c
index 2b068ed..972d555 100644
--- a/src/gom-gdata-miner.c
+++ b/src/gom-gdata-miner.c
@@ -40,6 +40,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
                                  GError **error)
 {
   GDataEntry *entry = GDATA_ENTRY (doc_entry);
+  GDataService *service;
   gchar *resource = NULL;
   gchar *date, *identifier;
   const gchar *class = NULL;
@@ -239,8 +240,9 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
       g_free (contact_resource);
     }
 
+  service = GDATA_SERVICE (g_hash_table_lookup (job->services, "documents"));
   access_rules = gdata_access_handler_get_rules (GDATA_ACCESS_HANDLER (entry),
-                                                 GDATA_SERVICE (job->service),
+                                                 service,
                                                  job->cancellable,
                                                  NULL, NULL, error);
 
@@ -312,11 +314,23 @@ query_gdata (GomAccountMinerJob *job,
   GDataDocumentsQuery *query;
   GDataDocumentsFeed *feed;
   GList *entries, *l;
+  GDataDocumentsService *service;
+
+  service = GDATA_DOCUMENTS_SERVICE (g_hash_table_lookup (job->services, "documents"));
+  if (service == NULL)
+    {
+      /* FIXME: use proper #defines and enumerated types */
+      g_set_error (error,
+                   g_quark_from_static_string ("gom-error"),
+                   0,
+                   "Can not query without a service");
+      return;
+    }
 
   query = gdata_documents_query_new (NULL);
   gdata_documents_query_set_show_folders (query, TRUE);
   feed = gdata_documents_service_query_documents
-    (GDATA_DOCUMENTS_SERVICE (job->service), query,
+    (service, query,
      job->cancellable, NULL, NULL, error);
 
   g_object_unref (query);
@@ -339,20 +353,28 @@ query_gdata (GomAccountMinerJob *job,
   g_object_unref (feed);
 }
 
-static GObject *
-create_service (GomMiner *self,
-                GoaObject *object)
+static GHashTable *
+create_services (GomMiner *self,
+                 GoaObject *object)
 {
   GDataGoaAuthorizer *authorizer;
   GDataDocumentsService *service;
+  GHashTable *services;
+
+  services = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                    NULL, (GDestroyNotify) g_object_unref);
 
   authorizer = gdata_goa_authorizer_new (object);
-  service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer));
+
+  if (gom_miner_supports_type (self, "documents") && goa_object_peek_documents (object) != NULL)
+    {
+      service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer));
+      g_hash_table_insert (services, "documents", service);
+    }
 
   /* the service takes ownership of the authorizer */
   g_object_unref (authorizer);
-
-  return G_OBJECT (service);
+  return services;
 }
 
 static void
@@ -369,6 +391,6 @@ gom_gdata_miner_class_init (GomGDataMinerClass *klass)
   miner_class->miner_identifier = MINER_IDENTIFIER;
   miner_class->version = 3;
 
-  miner_class->create_service = create_service;
+  miner_class->create_services = create_services;
   miner_class->query = query_gdata;
 }
diff --git a/src/gom-miner.c b/src/gom-miner.c
index b6b5504..aa39d14 100644
--- a/src/gom-miner.c
+++ b/src/gom-miner.c
@@ -42,6 +42,7 @@ struct _GomMinerPrivate {
   GList *pending_jobs;
 
   gchar *display_name;
+  gchar **index_types;
 };
 
 static void
@@ -51,7 +52,7 @@ gom_account_miner_job_free (GomAccountMinerJob *job)
     g_cancellable_disconnect (job->miner->priv->cancellable,
                               job->miner_cancellable_id);
 
-  g_clear_object (&job->service);
+  g_hash_table_unref (job->services);
   g_clear_object (&job->miner);
   g_clear_object (&job->account);
   g_clear_object (&job->async_result);
@@ -82,6 +83,7 @@ gom_miner_dispose (GObject *object)
   g_clear_object (&self->priv->result);
 
   g_free (self->priv->display_name);
+  g_strfreev (self->priv->index_types);
   g_clear_error (&self->priv->client_error);
 
   G_OBJECT_CLASS (gom_miner_parent_class)->dispose (object);
@@ -379,7 +381,7 @@ gom_account_miner_job_new (GomMiner *self,
                                G_CALLBACK (miner_cancellable_cancelled_cb),
                                retval, NULL);
 
-  retval->service = miner_class->create_service (self, object);
+  retval->services = miner_class->create_services (self, object);
   retval->datasource_urn = g_strdup_printf ("gd:goa-account:%s",
                                             goa_account_get_id (retval->account));
   retval->root_element_urn = g_strdup_printf ("gd:goa-account:%s:root-element",
@@ -647,6 +649,7 @@ gom_miner_refresh_db_real (GomMiner *self)
   const gchar *provider_type;
   GList *accounts, *content_objects, *acc_objects, *l;
   GomMinerClass *miner_class = GOM_MINER_GET_CLASS (self);
+  gboolean skip_photos, skip_documents;
 
   content_objects = NULL;
   acc_objects = NULL;
@@ -665,10 +668,18 @@ gom_miner_refresh_db_real (GomMiner *self)
         continue;
 
       acc_objects = g_list_append (acc_objects, g_object_ref (object));
+      skip_photos = skip_documents = TRUE;
 
       documents = goa_object_peek_documents (object);
       photos = goa_object_peek_photos (object);
-      if (documents == NULL && photos == NULL)
+
+      if (gom_miner_supports_type (self, "photos") && photos != NULL)
+        skip_photos = FALSE;
+
+      if (gom_miner_supports_type (self, "documents") && documents != NULL)
+        skip_documents = FALSE;
+
+      if (skip_photos && skip_documents)
         continue;
 
       content_objects = g_list_append (content_objects, g_object_ref (object));
@@ -742,3 +753,34 @@ gom_miner_refresh_db_finish (GomMiner *self,
 
   return TRUE;
 }
+
+void
+gom_miner_set_index_types (GomMiner *self, const char **index_types)
+{
+  g_strfreev (self->priv->index_types);
+  self->priv->index_types = g_strdupv ((gchar **) index_types);
+}
+
+const gchar **
+gom_miner_get_index_types (GomMiner *self)
+{
+  return (const gchar **) self->priv->index_types;
+}
+
+gboolean
+gom_miner_supports_type (GomMiner *self, gchar *type)
+{
+  gboolean retval = FALSE;
+  guint i;
+
+  for (i = 0; self->priv->index_types[i] != NULL; i++)
+    {
+      if (g_strcmp0 (self->priv->index_types[i], type) == 0)
+        {
+          retval = TRUE;
+          break;
+        }
+    }
+
+  return retval;
+}
diff --git a/src/gom-miner.h b/src/gom-miner.h
index bce013e..fe28907 100644
--- a/src/gom-miner.h
+++ b/src/gom-miner.h
@@ -64,7 +64,7 @@ typedef struct {
   gulong miner_cancellable_id;
 
   GoaAccount *account;
-  GObject *service;
+  GHashTable *services;
   GSimpleAsyncResult *async_result;
   GCancellable *cancellable;
 
@@ -88,8 +88,8 @@ struct _GomMinerClass
   char *miner_identifier;
   gint  version;
 
-  GObject * (*create_service) (GomMiner *self,
-                               GoaObject *object);
+  GHashTable * (*create_services) (GomMiner *self,
+                                   GoaObject *object);
 
   void (*query) (GomAccountMinerJob *job,
                  GError **error);
@@ -108,6 +108,12 @@ gboolean gom_miner_refresh_db_finish (GomMiner *self,
                                       GAsyncResult *res,
                                       GError **error);
 
+void gom_miner_set_index_types (GomMiner *self, const gchar **index_types);
+
+const gchar ** gom_miner_get_index_types (GomMiner *self);
+
+gboolean gom_miner_supports_type (GomMiner *self, gchar *type);
+
 G_END_DECLS
 
 #endif /* __GOM_MINER_H__ */
diff --git a/src/gom-owncloud-miner.c b/src/gom-owncloud-miner.c
index 9cf492f..6bf8683 100644
--- a/src/gom-owncloud-miner.c
+++ b/src/gom-owncloud-miner.c
@@ -311,11 +311,13 @@ static void
 volume_added_cb (GVolumeMonitor *monitor, GVolume *volume, gpointer user_data)
 {
   SyncData *data = (SyncData *) user_data;
+  GoaObject *object;
 
-  if (!is_matching_volume (volume, GOA_OBJECT (data->job->service)))
+  object = GOA_OBJECT (g_hash_table_lookup (data->job->services, "documents"));
+  if (!is_matching_volume (volume, object))
     return;
 
-  g_object_set_data_full (data->job->service, "volume", g_object_ref (volume), g_object_unref);
+  g_object_set_data_full (G_OBJECT (object), "volume", g_object_ref (volume), g_object_unref);
   g_main_loop_quit (data->loop);
 }
 
@@ -335,6 +337,7 @@ query_owncloud (GomAccountMinerJob *job,
 {
   GomOwncloudMiner *self = GOM_OWNCLOUD_MINER (job->miner);
   GomOwncloudMinerPrivate *priv = self->priv;
+  GoaObject *object;
   GFile *root;
   GList *l;
   GList *volumes;
@@ -344,6 +347,17 @@ query_owncloud (GomAccountMinerJob *job,
   SyncData data;
   gboolean found = FALSE;
 
+  object = GOA_OBJECT (g_hash_table_lookup (job->services, "documents"));
+  if (object == NULL)
+    {
+      /* FIXME: use proper #defines and enumerated types */
+      g_set_error (error,
+                   g_quark_from_static_string ("gom-error"),
+                   0,
+                   "Can not query without a service");
+      return;
+    }
+
   data.job = job;
   volumes = g_volume_monitor_get_volumes (priv->monitor);
 
@@ -352,9 +366,9 @@ query_owncloud (GomAccountMinerJob *job,
     {
       GVolume *volume = G_VOLUME (l->data);
 
-      if (is_matching_volume (volume, GOA_OBJECT (job->service)))
+      if (is_matching_volume (volume, object))
         {
-          g_object_set_data_full (job->service, "volume", g_object_ref (volume), g_object_unref);
+          g_object_set_data_full (G_OBJECT (object), "volume", g_object_ref (volume), g_object_unref);
           found = TRUE;
         }
     }
@@ -371,7 +385,7 @@ query_owncloud (GomAccountMinerJob *job,
     }
 
   /* mount the volume if needed */
-  volume = G_VOLUME (g_object_get_data (job->service, "volume"));
+  volume = G_VOLUME (g_object_get_data (G_OBJECT (object), "volume"));
   mount = g_volume_get_mount (volume);
   if (mount == NULL)
     {
@@ -402,11 +416,19 @@ query_owncloud (GomAccountMinerJob *job,
   g_list_free_full (volumes, g_object_unref);
 }
 
-static GObject *
-create_service (GomMiner *self,
-                GoaObject *object)
+static GHashTable *
+create_services (GomMiner *self,
+                 GoaObject *object)
 {
-  return g_object_ref (object);
+  GHashTable *services;
+
+  services = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                    NULL, (GDestroyNotify) g_object_unref);
+
+  if (gom_miner_supports_type (self, "documents"))
+    g_hash_table_insert (services, "documents", g_object_ref (object));
+
+  return services;
 }
 
 static void
@@ -438,7 +460,7 @@ gom_owncloud_miner_class_init (GomOwncloudMinerClass *klass)
   miner_class->miner_identifier = MINER_IDENTIFIER;
   miner_class->version = 1;
 
-  miner_class->create_service = create_service;
+  miner_class->create_services = create_services;
   miner_class->query = query_owncloud;
 
   g_type_class_add_private (klass, sizeof (GomOwncloudMinerPrivate));
diff --git a/src/gom-zpj-miner.c b/src/gom-zpj-miner.c
index 8c037d6..95490f9 100644
--- a/src/gom-zpj-miner.c
+++ b/src/gom-zpj-miner.c
@@ -210,12 +210,25 @@ account_miner_job_traverse_folder (GomAccountMinerJob *job,
                                    const gchar *folder_id,
                                    GError **error)
 {
-  GList *entries, *l;
+  GList *entries = NULL, *l;
+  ZpjSkydrive *skydrive;
 
-  entries = zpj_skydrive_list_folder_id (ZPJ_SKYDRIVE (job->service),
+  skydrive = ZPJ_SKYDRIVE (g_hash_table_lookup (job->services, "documents"));
+  if (skydrive == NULL)
+    {
+      /* FIXME: use proper #defines and enumerated types */
+      g_set_error (error,
+                   g_quark_from_static_string ("gom-error"),
+                   0,
+                   "Can not query without a service");
+      goto out;
+    }
+
+  entries = zpj_skydrive_list_folder_id (skydrive,
                                          folder_id,
                                          job->cancellable,
                                          error);
+
   if (*error != NULL)
     goto out;
 
@@ -258,20 +271,28 @@ query_zpj (GomAccountMinerJob *job,
                                      error);
 }
 
-static GObject *
-create_service (GomMiner *self,
-                GoaObject *object)
+static GHashTable *
+create_services (GomMiner *self,
+                 GoaObject *object)
 {
+  GHashTable *services;
   ZpjGoaAuthorizer *authorizer;
   ZpjSkydrive *service;
 
-  authorizer = zpj_goa_authorizer_new (object);
-  service = zpj_skydrive_new (ZPJ_AUTHORIZER (authorizer));
+  services = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                    NULL, (GDestroyNotify) g_object_unref);
 
-  /* the service takes ownership of the authorizer */
-  g_object_unref (authorizer);
+  if (gom_miner_supports_type (self, "documents"))
+    {
+      authorizer = zpj_goa_authorizer_new (object);
+      service = zpj_skydrive_new (ZPJ_AUTHORIZER (authorizer));
+
+      /* the service takes ownership of the authorizer */
+      g_object_unref (authorizer);
+      g_hash_table_insert (services, "documents", service);
+    }
 
-  return G_OBJECT (service);
+  return services;
 }
 
 static void
@@ -289,6 +310,6 @@ gom_zpj_miner_class_init (GomZpjMinerClass *klass)
   miner_class->miner_identifier = MINER_IDENTIFIER;
   miner_class->version = 1;
 
-  miner_class->create_service = create_service;
+  miner_class->create_services = create_services;
   miner_class->query = query_zpj;
 }


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