[gnome-online-miners] src: Pass the content type to RefreshDB
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-online-miners] src: Pass the content type to RefreshDB
- Date: Wed, 25 Jun 2014 11:11:42 +0000 (UTC)
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]