[gnome-documents/wip/flickr: 3/12] Work started, backup commit
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-documents/wip/flickr: 3/12] Work started, backup commit
- Date: Fri, 31 May 2013 16:57:48 +0000 (UTC)
commit 3b2a0b6aa2e07a909c760ab81cf36a2a47cfd3bf
Author: Marek Chalupa <mchalupa redhat com>
Date: Mon May 6 11:00:14 2013 +0200
Work started, backup commit
src/miner/gd-flickr-miner.c | 298 ++++++++++++++++++++++++++++---------------
1 files changed, 197 insertions(+), 101 deletions(-)
---
diff --git a/src/miner/gd-flickr-miner.c b/src/miner/gd-flickr-miner.c
index ba93b29..17a95ff 100644
--- a/src/miner/gd-flickr-miner.c
+++ b/src/miner/gd-flickr-miner.c
@@ -24,20 +24,145 @@
#include "gd-flickr-miner.h"
-/** TODO: find out how to create this identifier */
+/** FIXME find out how to create this identifier */
#define MINER_IDENTIFIER "gd:flickr:miner:30058620-777c-47a3-a19c-a6cdf4a315c4"
-#define GRL_LOG_DOMAIN_DEFAULT flickr_miner_grl_log_domain
-GRL_LOG_DOMAIN_STATIC(flickr_miner_grl_log_domain);
+#define GRILO_TARGET_PLUGIN "grl-flickr"
+/* ==================== DECLARATIONS ==================== */
+static void
+query_flickr (GdAccountMinerJob *job,
+ GError **error);
+
+static GObject *
+create_service (GdMiner *self,
+ GoaObject *object);
+
+static void
+account_miner_job_browse_container (GdAccountMinerJob *job,
+ GrlSource *source,
+ GrlMedia *container);
+static gboolean
+account_miner_job_process_entry (GdAccountMinerJob *job,
+ GrlMedia *entry,
+ GError **error);
+static void
+browse_container_cb (GrlSource * source,
+ guint operation_id,
+ GrlMedia * media,
+ guint remaining,
+ gpointer user_data,
+ const GError *error);
+static void
+source_added_cb (GrlRegistry *registry,
+ GrlSource *source,
+ gpointer user_data);
+
+/* ==================== GOBJECT ==================== */
G_DEFINE_TYPE (GdFlickrMiner, gd_flickr_miner, GD_TYPE_MINER)
+static void
+gd_flickr_miner_init (GdFlickrMiner *self)
+{
+}
+
+static void
+gd_flickr_miner_class_init (GdFlickrMinerClass *klass)
+{
+ GdMinerClass *miner_class = GD_MINER_CLASS (klass);
+
+ GrlRegistry *registry;
+ GError *error = NULL;
+
+ /* TODO get and assign provider type from plugin */
+ miner_class->goa_provider_type = "flickr";
+ miner_class->miner_identifier = MINER_IDENTIFIER;
+ miner_class->version = 1;
+
+ miner_class->create_service = create_service;
+ miner_class->query = query_flickr;
+
+ /* TODO unload plugins and so on */
+ //miner_class->finalize = gd_flickr_miner_class_finalaze;
+
+ /* TODO
+ * add operation_id to allow cancellabe browsing
+ */
+
+ grl_init(NULL, NULL);
+
+ registry = grl_registry_get_default();
+
+
+
+ /* FIXME: make the path relative and find universal way */
+ /* we can use load_all, since create service returns only flickr plugin */
+ if (! grl_registry_load_plugin(registry,
+ "/home/marek/local/lib64/grilo-0.2/libgrlflickr.so",
+ &error))
+ {
+ g_error ("Flickr Miner cannot be loaded. Cannot load flickr "
+ "plugin (Grilo) :: dbg error = %s\n", error->message);
+ }
+}
+
+/* ==================== "EXPORTED" FUNCTIONS ==================== */
+static void
+query_flickr (GdAccountMinerJob *job,
+ GError **error)
+{
+ g_debug ("Querying flickr");
+
+ GrlRegistry *registry;
+ GList *m, *sources;
+
+ registry = grl_registry_get_default ();
+
+ /* enable asyncronous adding of grilo sources */
+ /* TODO - solve possible multiple browsing of sources */
+ g_signal_connect (registry, "source-added",
+ G_CALLBACK (source_added_cb), job);
+
+ /* TODO - dont do that, do it all via source-added */
+ sources = grl_plugin_get_sources (GRL_PLUGIN (job->service));
+
+ for (m = sources; m != NULL; m = g_list_next (m))
+ {
+ /* TODO what to do with the error? */
+ account_miner_job_browse_container (job,
+ GRL_SOURCE (m->data),
+ NULL);
+ }
+}
+
+/* Fix me - in generialized version return GrlRegistry and
+ * in create service just configure it (and return) */
+static GObject *
+create_service (GdMiner *self,
+ GoaObject *object)
+{
+ GrlRegistry *registry;
+ GrlPlugin *plugin;
+
+ registry = grl_registry_get_default ();
+ plugin = grl_registry_lookup_plugin (registry, GRILO_TARGET_PLUGIN);
+
+ if (plugin == NULL)
+ g_error ("Could not find services (grilo plugin: %s)", GRILO_TARGET_PLUGIN);
+
+ return G_OBJECT (g_object_ref (plugin));
+}
+
+/* ==================== PRIVATE FUNCTIONS ==================== */
+
static gboolean
account_miner_job_process_entry (GdAccountMinerJob *job,
- /* ZpjSkydriveEntry *entry*/ gpointer *entry,
- GError **error)
+ GrlMedia *entry,
+ GError **error)
{
+ g_debug ("Got media %s from source %s", grl_media_get_title (entry),
+ grl_media_get_source (entry));
/*
GDateTime *created_time, *updated_time;
gchar *contact_resource;
@@ -201,122 +326,93 @@ account_miner_job_process_entry (GdAccountMinerJob *job,
if (*error != NULL)
return FALSE;
*/
+
+ g_object_unref (entry);
+
return TRUE;
}
static void
-account_miner_job_traverse_folder (GdAccountMinerJob *job,
- const gchar *folder_id,
- GError **error)
+account_miner_job_browse_container (GdAccountMinerJob *job,
+ GrlSource *source,
+ GrlMedia *container)
{
- /* GList *entries, *l;
+ g_return_if_fail (GRL_IS_SOURCE (source));
+ g_return_if_fail (container == NULL || GRL_IS_MEDIA (container));
- entries = zpj_skydrive_list_folder_id (ZPJ_SKYDRIVE (job->service),
- folder_id,
- job->cancellable,
- error);
- if (*error != NULL)
- goto out;
+ /* Skip public source */
+ if (g_strcmp0 (grl_source_get_name (source), "Flickr") == 0) {
+ g_debug ("Skipping public source");
+ return;
+ }
- for (l = entries; l != NULL; l = l->next)
- {
- ZpjSkydriveEntry *entry = (ZpjSkydriveEntry *) l->data;
- const gchar *id;
+ GrlOperationOptions *ops;
+ const GList *keys;
+ gint op_id;
- id = zpj_skydrive_entry_get_id (entry);
+ /* get possiblly all */
+ ops = grl_operation_options_new (NULL);
+ keys = grl_source_supported_keys (source);
- if (ZPJ_IS_SKYDRIVE_FOLDER (entry))
- {
- account_miner_job_traverse_folder (job, id, error);
- if (*error != NULL)
- goto out;
- }
- else if (ZPJ_IS_SKYDRIVE_PHOTO (entry))
- continue;
+ op_id = grl_source_browse (source, container,
+ keys, ops, browse_container_cb, job);
- account_miner_job_process_entry (job, entry, error);
+ /* TODO use op_id to make it cancellable */
- if (*error != NULL)
- {
- g_warning ("Unable to process entry %p: %s", l->data, (*error)->message);
- g_clear_error (error);
- }
- }
-
- out:
- if (entries != NULL)
- g_list_free_full (entries, g_object_unref);
- */
+ g_object_unref (ops);
}
static void
-query_flickr (GdAccountMinerJob *job,
- GError **error)
+browse_container_cb (GrlSource *source,
+ guint operation_id,
+ GrlMedia *media,
+ guint remaining,
+ gpointer user_data,
+ const GError *error)
{
- account_miner_job_traverse_folder (job,
- NULL,
- error);
-}
+ if (error != NULL)
+ {
+ g_warning ("%s", error->message);
+ return;
+ }
-static GObject *
-create_service (GdMiner *self,
- GoaObject *object)
-{
- /*
- * TODO:
- * kod jako v grl-flickru, ktery vytvori config a vlozi ho
- * do grila?? Mrkni na grilo, kdyby bylo flickr-forced, tak
- * se automaticky v grilu vytvori vsechny flickr sourcy,
- * tak je to potreba nejak ohandlovat.. Asi by bylo jeste jednodussi
- * udelat obecny grilo-miner a ten pak specializovat na flickr??
- * Uvidime.. chce to studovat. */
- /**
- * Jinak toto funguje tak, ze to vrati objekt, pres ktery se budou
- * ziskavat ty data z flickru (ten objekt se ulozi do objectu
- * GAccountMinerJob a pres ten to pak budu pouzivat
- * */
-
- /* use flickr-forced first
- * TODO: use configuration via GoaObject */
- /*
- GrlRegistry *registry;
- GrlMedia *service;
+ GError *err = NULL;
- registry = grl_registry_get_default();
-
- if (! grl_registry_load_plugin(registry, "grl-flickr", NULL))
- g_error ("Flickr Miner cannot be loaded. Cannot load flickr"
- "plugin (Grilo)");
-
- GrlMedia *service = grl_media_new ();
-
- return G_OBJECT (service);
- */
- GRL_ERROR("create_service");
- g_printerr("create_service");
-}
-
-static void
-gd_flickr_miner_init (GdFlickrMiner *self)
-{
- GRL_ERROR("miner_init");
- g_printerr("miner_init");
-
- GRL_LOG_DOMAIN_INIT(flickr_miner_grl_log_domain, "grilo");
+ if (media != NULL)
+ {
+ if (GRL_IS_MEDIA_BOX (media) && source != NULL)
+ {
+ account_miner_job_browse_container ((GdAccountMinerJob *) user_data,
+ source, media);
+ g_object_unref (media);
+ }
+ else if (GRL_IS_MEDIA_IMAGE (media))
+ {
+ /* TODO now is process entry undefined, but if it will be
+ * some kind of async, we need to handle errors somehow */
+ account_miner_job_process_entry ((GdAccountMinerJob *) user_data,
+ media, &err);
+
+ if (err != NULL)
+ {
+ g_warning ("%s", err->message);
+ g_error_free (err);
+ }
+ }
+ else
+ {
+ /* some future extension? */
+ return;
+ }
+ }
}
static void
-gd_flickr_miner_class_init (GdFlickrMinerClass *klass)
+source_added_cb (GrlRegistry *registry,
+ GrlSource *source,
+ gpointer user_data)
{
- GdMinerClass *miner_class = GD_MINER_CLASS (klass);
+ g_debug ("New source: %s", grl_source_get_name (source));
- miner_class->goa_provider_type = "flickr";
- miner_class->miner_identifier = MINER_IDENTIFIER;
- miner_class->version = 1;
-
- miner_class->create_service = create_service;
- miner_class->query = query_flickr;
-
- grl_init(NULL, NULL);
- g_critical ("flickr miner class init after grl_init!");
+ account_miner_job_browse_container ((GdAccountMinerJob *) user_data, source, NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]