[gnome-photos/wip/uajain/de_dup: 2/3] share-point-google: Add and relate remote object manually



commit 701b212d1cbbf731c5adcf407c15dbb96867ab46
Author: Umang Jain <mailumangjain gmail com>
Date:   Sat Aug 27 04:11:13 2016 +0530

    share-point-google: Add and relate remote object manually
    
    https://bugzilla.gnome.org/show_bug.cgi?id=770267

 src/photos-share-point-google.c |  339 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 338 insertions(+), 1 deletions(-)
---
diff --git a/src/photos-share-point-google.c b/src/photos-share-point-google.c
index 94bd7ed..694a278 100644
--- a/src/photos-share-point-google.c
+++ b/src/photos-share-point-google.c
@@ -26,16 +26,23 @@
 #include <glib/gi18n.h>
 
 #include "photos-base-item.h"
+#include "photos-filterable.h"
+#include "photos-query.h"
+#include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-share-point-google.h"
 #include "photos-source.h"
+#include "photos-tracker-queue.h"
 #include "photos-utils.h"
 
 
 struct _PhotosSharePointGoogle
 {
   PhotosSharePointOnline parent_instance;
+  PhotosTrackerQueue *queue;
   GDataGoaAuthorizer *authorizer;
   GDataPicasaWebService *service;
+  GError *queue_error;
 };
 
 
@@ -52,6 +59,7 @@ typedef struct _PhotosSharePointGoogleShareData PhotosSharePointGoogleShareData;
 struct _PhotosSharePointGoogleShareData
 {
   GDataUploadStream *stream;
+  GDataPicasaWebFile *file_entry;
   PhotosBaseItem *item;
 };
 
@@ -63,6 +71,7 @@ photos_share_point_google_share_data_new (PhotosBaseItem *item)
 
   data = g_slice_new0 (PhotosSharePointGoogleShareData);
   data->item = g_object_ref (item);
+  data->file_entry = NULL;
 
   return data;
 }
@@ -73,6 +82,7 @@ photos_share_point_google_share_data_free (PhotosSharePointGoogleShareData *data
 {
   g_clear_object (&data->stream);
   g_clear_object (&data->item);
+  g_clear_object (&data->file_entry);
   g_slice_free (PhotosSharePointGoogleShareData, data);
 }
 
@@ -92,6 +102,317 @@ photos_share_point_google_parse_error (PhotosSharePoint *self, GError *error)
 
 
 static void
+photos_share_point_google_get_equipment_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+  PhotosSharePointGoogle *self;
+  PhotosSharePointGoogleShareData *data;
+  PhotosSearchContextState *state;
+  PhotosQuery *query;
+  TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR (source_object);
+  GApplication *app;
+  GCancellable *cancellable;
+  GError *error;
+  GTask *task = G_TASK (user_data);
+  const gchar *eqp_urn;
+  const gchar *remote_urn;
+
+  self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task));
+  data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task);
+  cancellable = g_task_get_cancellable (task);
+
+  error = NULL;
+  tracker_sparql_cursor_next_finish (cursor, res, &error);
+  if (error != NULL)
+    {
+      g_warning ("Unable to retrieve equipment from cursor: %s", error->message);
+      g_error_free (error);
+      goto out;
+    }
+
+  eqp_urn = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+  remote_urn = g_object_get_data (G_OBJECT (data->file_entry), "remote_urn");
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nfo:equipment", eqp_urn);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+out:
+  g_object_unref (task);
+  tracker_sparql_cursor_close (cursor);
+}
+
+
+static void
+photos_google_share_point_get_equipment (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+  TrackerSparqlConnection *connection = TRACKER_SPARQL_CONNECTION (source_object);
+  TrackerSparqlCursor *cursor;
+  GTask *task = G_TASK (user_data);
+  GError *error;
+
+  error = NULL;
+  cursor = tracker_sparql_connection_query_finish (connection, res, &error);
+  if (error != NULL)
+    {
+      g_warning ("Unable to retrieve remote image equipment: %s", error->message);
+      g_error_free (error);
+      goto out;
+    }
+
+  tracker_sparql_cursor_next_async (cursor, NULL, photos_share_point_google_get_equipment_cb, g_object_ref 
(task));
+out:
+  g_object_unref (cursor);
+}
+
+
+static void
+photos_share_point_google_relate_objects (PhotosSharePointGoogle *self, GCancellable *cancellable, const 
gchar *domain_urn, const gchar *range_urn)
+{
+  PhotosSearchContextState *state;
+  PhotosQuery *query;
+  GApplication *app;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_relate_objects (state, domain_urn, range_urn);
+  photos_tracker_queue_update (self->queue,
+                               query->sparql,
+                               cancellable,
+                               NULL,
+                               NULL,
+                               NULL);
+
+  query = photos_query_builder_relate_objects (state, range_urn, domain_urn);
+  photos_tracker_queue_update (self->queue,
+                               query->sparql,
+                               cancellable,
+                               NULL,
+                               NULL,
+                               NULL);
+  photos_query_free (query);
+}
+
+
+static void
+photos_google_share_point_tracker_entry_created (GObject *source_object, GAsyncResult *res, gpointer 
user_data)
+{
+  PhotosSharePointGoogle *self;
+  PhotosSearchContextState *state;
+  PhotosSharePointGoogleShareData *data;
+  PhotosQuery *query;
+  TrackerSparqlConnection *connection = TRACKER_SPARQL_CONNECTION (source_object);
+  GApplication *app;
+  GCancellable *cancellable;
+  GDataLink *alternate;
+  GError *error;
+  GList *media_contents;
+  GTask *task = G_TASK (user_data);
+  GTimeVal tv;
+  GVariant *variant;
+  GVariant *child;
+  gint64 timestamp;
+  gboolean flash;
+
+  const gchar *credit;
+  const gchar *make;
+  const gchar *model;
+  const gchar *title;
+  const gchar *summary;
+  const gchar *mime;
+  const gchar *item_urn;
+  const gchar *remote_urn;
+  const gchar *flash_off;
+  const gchar *flash_on;
+  const gchar *alternate_uri;
+
+  gchar *exposure;
+  gchar *focal_length;
+  gchar *fstop;
+  gchar *iso;
+  gchar *width;
+  gchar *height;
+  gchar *time;
+
+  flash_off = "http://www.tracker-project.org/temp/nmm#flash-off";;
+  flash_on = "http://www.tracker-project.org/temp/nmm#flash-on";;
+
+  self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task));
+  cancellable = g_task_get_cancellable (task);
+  data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task);
+  item_urn = photos_filterable_get_id (PHOTOS_FILTERABLE (data->item));
+
+  error = NULL;
+  variant = tracker_sparql_connection_update_blank_finish (connection, res, &error);
+  if (error != NULL)
+    {
+      g_warning ("Could not insert remote object: %s", error->message);
+      g_error_free (error);
+      return;
+    }
+
+  child = g_variant_get_child_value (variant, 0); /* variant is now aa{ss} */
+  g_variant_unref (variant);
+  variant = child;
+
+  child = g_variant_get_child_value (variant, 0); /* variant is now s{ss} */
+  g_variant_unref (variant);
+  variant = child;
+
+  child = g_variant_get_child_value (variant, 0); /* variant is now {ss} */
+  g_variant_unref (variant);
+  variant = child;
+
+  child = g_variant_get_child_value (variant, 1);
+  remote_urn = g_variant_dup_string (child, NULL);
+  g_variant_unref (child);
+
+  g_object_set_data (G_OBJECT (data->file_entry), "remote_urn", (gpointer *) remote_urn);
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  alternate = gdata_entry_look_up_link (GDATA_ENTRY (data->file_entry), GDATA_LINK_ALTERNATE);
+  alternate_uri = gdata_link_get_uri (alternate);
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nie:url", alternate_uri);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  summary = gdata_entry_get_summary (GDATA_ENTRY (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nie:description", summary);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  media_contents = gdata_picasaweb_file_get_contents (data->file_entry);
+  mime = gdata_media_content_get_content_type (GDATA_MEDIA_CONTENT (media_contents->data));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nie:mimeType", mime);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  title = gdata_entry_get_title (GDATA_ENTRY (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nie:title", title);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  credit = gdata_picasaweb_file_get_credit (data->file_entry);
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nco:creator", credit);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  exposure = g_strdup_printf ("%f", gdata_picasaweb_file_get_exposure (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nmm:exposureTime", exposure);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (exposure);
+
+  focal_length = g_strdup_printf ("%f", gdata_picasaweb_file_get_focal_length (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nmm:focalLength", focal_length);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (focal_length);
+
+  fstop = g_strdup_printf ("%f", gdata_picasaweb_file_get_fstop (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nmm:fnumber", fstop);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (fstop);
+
+  iso = g_strdup_printf ("%d", gdata_picasaweb_file_get_iso (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nmm:isoSpeed", iso);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (iso);
+
+  flash = gdata_picasaweb_file_get_flash (data->file_entry);
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nmm:flash", flash ? flash_on : 
flash_off);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+
+  make = gdata_picasaweb_file_get_make (data->file_entry);
+  model = gdata_picasaweb_file_get_model (data->file_entry);
+  if (model != NULL || make != NULL)
+    {
+      query = photos_query_builder_get_equipment_query (state, item_urn);
+      photos_tracker_queue_select (self->queue,
+                                   query->sparql,
+                                   cancellable,
+                                   photos_google_share_point_get_equipment,
+                                   g_object_ref (task),
+                                   g_object_unref);
+    }
+
+  width = g_strdup_printf ("%u", gdata_picasaweb_file_get_width (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nfo:width", width);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (width);
+
+  height = g_strdup_printf ("%u", gdata_picasaweb_file_get_height (data->file_entry));
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nfo:height", height);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (height);
+
+  /* borrowed from query_builder_mtime_update_query */
+  timestamp = gdata_picasaweb_file_get_timestamp (data->file_entry) / G_USEC_PER_SEC;
+  tv.tv_sec = timestamp;
+  tv.tv_usec = 0;
+  time = g_time_val_to_iso8601 (&tv);
+  query = photos_query_builder_insert_or_replace (state, remote_urn, "nie:contentCreated", time);
+  photos_tracker_queue_update (self->queue, query->sparql, cancellable, NULL, NULL, NULL);
+  g_free (time);
+  photos_query_free (query);
+
+  photos_share_point_google_relate_objects (self, cancellable, remote_urn, item_urn);
+}
+
+
+static void
+photos_share_point_google_metadata_added (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+  PhotosBaseItem *item = PHOTOS_BASE_ITEM (source_object);
+  GError *error = NULL;
+
+  photos_base_item_add_metadata_finish (item, res, &error);
+  if (error != NULL)
+    {
+      g_warning ("Could not remote link as metadata: %s", error->message);
+      g_error_free (error);
+    }
+
+ g_object_unref (item);
+}
+
+
+static void
+photos_share_point_google_create_tracker_entry (PhotosSharePointGoogle *self, GTask *task)
+{
+  PhotosSearchContextState *state;
+  PhotosSharePointGoogleShareData *data;
+  PhotosQuery *query;
+  GApplication *app;
+  GCancellable *cancellable;
+  const gchar *id, *tag;
+  gchar *identifier;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  cancellable = g_task_get_cancellable (task);
+  data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task);
+
+  id = gdata_entry_get_id (GDATA_ENTRY (data->file_entry));
+  query = photos_query_builder_insert_remote_object (state, id);
+  photos_tracker_queue_update_blank (self->queue,
+                                     query->sparql,
+                                     cancellable,
+                                     photos_google_share_point_tracker_entry_created,
+                                     g_object_ref (task),
+                                     g_object_unref);
+  photos_query_free (query);
+
+  identifier = g_strdup_printf ("google:picasaweb:%s", id);
+  tag = "Xmp.xmp.gnome-photos.google.identifier";
+  g_object_set_data (G_OBJECT (data->item), "tag", (gpointer *) tag);
+  photos_base_item_add_metadata_async (data->item,
+                                       identifier,
+                                       cancellable,
+                                       photos_share_point_google_metadata_added,
+                                       NULL);
+  g_object_unref (task);
+}
+
+
+static void
 photos_share_point_google_share_save_to_stream (GObject *source_object, GAsyncResult *res, gpointer 
user_data)
 {
   PhotosSharePointGoogle *self;
@@ -123,8 +444,11 @@ photos_share_point_google_share_save_to_stream (GObject *source_object, GAsyncRe
 
   g_task_return_boolean (task, TRUE);
 
+  data->file_entry = GDATA_PICASAWEB_FILE (g_object_ref (file_entry));
+  photos_share_point_google_create_tracker_entry (self, G_TASK (g_object_ref (task)));
+
  out:
-  g_clear_object (&file_entry);
+  g_object_unref (file_entry);
   g_object_unref (task);
 }
 
@@ -259,6 +583,7 @@ photos_share_point_google_dispose (GObject *object)
   PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (object);
 
   g_clear_object (&self->authorizer);
+  g_clear_object (&self->queue);
   g_clear_object (&self->service);
 
   G_OBJECT_CLASS (photos_share_point_google_parent_class)->dispose (object);
@@ -266,8 +591,19 @@ photos_share_point_google_dispose (GObject *object)
 
 
 static void
+photos_share_point_google_finalize (GObject *object)
+{
+  PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (object);
+
+  g_clear_error (&self->queue_error);
+
+  G_OBJECT_CLASS (photos_share_point_google_parent_class)->finalize (object);
+}
+
+static void
 photos_share_point_google_init (PhotosSharePointGoogle *self)
 {
+  self->queue = photos_tracker_queue_dup_singleton (NULL, &self->queue_error);
 }
 
 
@@ -280,6 +616,7 @@ photos_share_point_google_class_init (PhotosSharePointGoogleClass *class)
   object_class->constructed = photos_share_point_google_constructed;
   object_class->dispose = photos_share_point_google_dispose;
   share_point_class->parse_error = photos_share_point_google_parse_error;
+  object_class->finalize = photos_share_point_google_finalize;
   share_point_class->share_async = photos_share_point_google_share_async;
   share_point_class->share_finish = photos_share_point_google_share_finish;
 }


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