Blame src/gom-gdata-miner.c

Packit f01ec2
/*
Packit f01ec2
 * GNOME Online Miners - crawls through your online content
Packit f01ec2
 * Copyright (c) 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
Packit f01ec2
 *
Packit f01ec2
 * This program is free software; you can redistribute it and/or
Packit f01ec2
 * modify it under the terms of the GNU General Public License
Packit f01ec2
 * as published by the Free Software Foundation; either version 2
Packit f01ec2
 * of the License, or (at your option) any later version.
Packit f01ec2
 *
Packit f01ec2
 * This program is distributed in the hope that it will be useful,
Packit f01ec2
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit f01ec2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit f01ec2
 * GNU General Public License for more details.
Packit f01ec2
 *
Packit f01ec2
 * You should have received a copy of the GNU General Public License
Packit f01ec2
 * along with this program; if not, write to the Free Software
Packit f01ec2
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit f01ec2
 * 02110-1301, USA.
Packit f01ec2
 *
Packit f01ec2
 * Author: Cosimo Cecchi <cosimoc@redhat.com>
Packit f01ec2
 *
Packit f01ec2
 */
Packit f01ec2
Packit f01ec2
#include "config.h"
Packit f01ec2
Packit f01ec2
#include <gdata/gdata.h>
Packit f01ec2
Packit f01ec2
#include "gom-utils.h"
Packit f01ec2
#include "gom-gdata-miner.h"
Packit f01ec2
Packit f01ec2
#define MINER_IDENTIFIER "gd:gdata:miner:86ec9bc9-c242-427f-aa19-77b5a2c9b6f0"
Packit f01ec2
#define PARENT_LINK_REL "http://schemas.google.com/docs/2007#parent"
Packit f01ec2
Packit f01ec2
/* used by applications to identify the source of an entry */
Packit f01ec2
#define PREFIX_DRIVE "google:drive:"
Packit f01ec2
#define PREFIX_PICASAWEB "google:picasaweb:"
Packit f01ec2
Packit f01ec2
static const guint MAX_RESULTS = 50;
Packit f01ec2
Packit f01ec2
G_DEFINE_TYPE (GomGDataMiner, gom_gdata_miner, GOM_TYPE_MINER)
Packit f01ec2
Packit f01ec2
static gchar *
Packit f01ec2
generate_fake_email_from_fullname (const gchar *fullname)
Packit f01ec2
{
Packit f01ec2
  GChecksum *checksum;
Packit f01ec2
  const gchar *digest;
Packit f01ec2
  gchar *retval;
Packit f01ec2
Packit f01ec2
  checksum = g_checksum_new (G_CHECKSUM_MD5);
Packit f01ec2
  g_checksum_update (checksum, fullname, -1);
Packit f01ec2
  digest = g_checksum_get_string (checksum);
Packit f01ec2
  retval = g_strdup (digest);
Packit f01ec2
  g_checksum_free (checksum);
Packit f01ec2
  return retval;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static gboolean
Packit f01ec2
account_miner_job_process_entry (TrackerSparqlConnection *connection,
Packit f01ec2
                                 GHashTable *previous_resources,
Packit f01ec2
                                 const gchar *datasource_urn,
Packit f01ec2
                                 GDataDocumentsService *service,
Packit f01ec2
                                 GDataDocumentsEntry *doc_entry,
Packit f01ec2
                                 GCancellable *cancellable,
Packit f01ec2
                                 GError **error)
Packit f01ec2
{
Packit f01ec2
  GDataEntry *entry = GDATA_ENTRY (doc_entry);
Packit f01ec2
  gchar *resource = NULL;
Packit f01ec2
  gchar *date, *identifier;
Packit f01ec2
  const gchar *class = NULL;
Packit f01ec2
  const gchar *mimetype_override = NULL;
Packit f01ec2
  gboolean mtime_changed, resource_exists;
Packit f01ec2
  gint64 new_mtime;
Packit f01ec2
Packit f01ec2
  GList *authors, *l, *parents = NULL;
Packit f01ec2
  GDataAuthor *author;
Packit f01ec2
  GDataLink *parent;
Packit f01ec2
Packit f01ec2
  GDataLink *alternate;
Packit f01ec2
  const gchar *alternate_uri;
Packit f01ec2
Packit f01ec2
  GList *categories;
Packit f01ec2
  GDataCategory *category;
Packit f01ec2
  gboolean starred = FALSE;
Packit f01ec2
Packit f01ec2
  GDataFeed *access_rules = NULL;
Packit f01ec2
Packit f01ec2
  if (GDATA_IS_DOCUMENTS_FOLDER (doc_entry))
Packit f01ec2
    {
Packit f01ec2
      GDataLink *link;
Packit f01ec2
Packit f01ec2
      link = gdata_entry_look_up_link (entry, GDATA_LINK_SELF);
Packit f01ec2
      identifier = g_strdup_printf ("gd:collection:%s%s", PREFIX_DRIVE, gdata_link_get_uri (link));
Packit f01ec2
    }
Packit f01ec2
  else
Packit f01ec2
    {
Packit f01ec2
      const gchar *id;
Packit f01ec2
Packit f01ec2
      id = gdata_entry_get_id (entry);
Packit f01ec2
      identifier = g_strdup_printf ("%s%s", PREFIX_DRIVE, id);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  /* remove from the list of the previous resources, if any */
Packit f01ec2
  if (previous_resources != NULL)
Packit f01ec2
    g_hash_table_remove (previous_resources, identifier);
Packit f01ec2
Packit f01ec2
  if (GDATA_IS_DOCUMENTS_PRESENTATION (doc_entry))
Packit f01ec2
    class = "nfo:Presentation";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_SPREADSHEET (doc_entry))
Packit f01ec2
    class = "nfo:Spreadsheet";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_TEXT (doc_entry))
Packit f01ec2
    class = "nfo:PaginatedTextDocument";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_DRAWING (doc_entry))
Packit f01ec2
    class = "nfo:PaginatedTextDocument";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_PDF (doc_entry))
Packit f01ec2
    class = "nfo:PaginatedTextDocument";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_FOLDER (doc_entry))
Packit f01ec2
    class = "nfo:DataContainer";
Packit f01ec2
Packit f01ec2
  resource = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     &resource_exists,
Packit f01ec2
     datasource_urn, identifier,
Packit f01ec2
     "nfo:RemoteDataObject", class, NULL);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_update_datasource (connection, datasource_urn,
Packit f01ec2
                                 resource_exists, identifier, resource,
Packit f01ec2
                                 cancellable, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  new_mtime = gdata_entry_get_updated (entry);
Packit f01ec2
  mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
Packit f01ec2
                                            resource_exists, identifier, resource,
Packit f01ec2
                                            cancellable, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* avoid updating the DB if the entry already exists and has not
Packit f01ec2
   * been modified since our last run.
Packit f01ec2
   */
Packit f01ec2
  if (!mtime_changed)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* the resource changed - just set all the properties again */
Packit f01ec2
  alternate = gdata_entry_look_up_link (entry, GDATA_LINK_ALTERNATE);
Packit f01ec2
  alternate_uri = gdata_link_get_uri (alternate);
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:url", alternate_uri);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* fake a drawing mimetype, so Documents can get the correct icon */
Packit f01ec2
  if (GDATA_IS_DOCUMENTS_DRAWING (doc_entry))
Packit f01ec2
    mimetype_override = "application/vnd.sun.xml.draw";
Packit f01ec2
  else if (GDATA_IS_DOCUMENTS_PDF (doc_entry))
Packit f01ec2
    mimetype_override = "application/pdf";
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:mimeType", mimetype_override);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  parents = gdata_entry_look_up_links (entry, PARENT_LINK_REL);
Packit f01ec2
  for (l = parents; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      gchar *parent_resource_urn, *parent_resource_id;
Packit f01ec2
Packit f01ec2
      parent = l->data;
Packit f01ec2
      parent_resource_id =
Packit f01ec2
        g_strdup_printf ("gd:collection:%s%s", PREFIX_DRIVE, gdata_link_get_uri (parent));
Packit f01ec2
Packit f01ec2
      parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
        (connection, cancellable, error,
Packit f01ec2
         NULL,
Packit f01ec2
         datasource_urn, parent_resource_id,
Packit f01ec2
         "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
Packit f01ec2
      g_free (parent_resource_id);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
Packit f01ec2
      gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
        (connection,
Packit f01ec2
         cancellable, error,
Packit f01ec2
         datasource_urn, resource,
Packit f01ec2
         "nie:isPartOf", parent_resource_urn);
Packit f01ec2
      g_free (parent_resource_urn);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  categories = gdata_entry_get_categories (entry);
Packit f01ec2
  for (l = categories; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      category = l->data;
Packit f01ec2
      if (g_strcmp0 (gdata_category_get_term (category), GDATA_CATEGORY_SCHEMA_LABELS_STARRED) == 0)
Packit f01ec2
        {
Packit f01ec2
          starred = TRUE;
Packit f01ec2
          break;
Packit f01ec2
        }
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_toggle_favorite
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     resource, starred);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:description", gdata_entry_get_summary (entry));
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:title", gdata_entry_get_title (entry));
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  authors = gdata_entry_get_authors (entry);
Packit f01ec2
  for (l = authors; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      gchar *contact_resource;
Packit f01ec2
Packit f01ec2
      author = l->data;
Packit f01ec2
Packit f01ec2
      contact_resource = gom_tracker_utils_ensure_contact_resource (connection,
Packit f01ec2
                                                                    cancellable, error,
Packit f01ec2
                                                                    gdata_author_get_email_address (author),
Packit f01ec2
                                                                    gdata_author_get_name (author));
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
Packit f01ec2
      gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
        (connection,
Packit f01ec2
         cancellable, error,
Packit f01ec2
         datasource_urn, resource,
Packit f01ec2
         "nco:creator", contact_resource);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
Packit f01ec2
      g_free (contact_resource);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  access_rules = gdata_access_handler_get_rules (GDATA_ACCESS_HANDLER (entry),
Packit f01ec2
                                                 GDATA_SERVICE (service),
Packit f01ec2
                                                 cancellable,
Packit f01ec2
                                                 NULL, NULL, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
      goto out;
Packit f01ec2
Packit f01ec2
  for (l = gdata_feed_get_entries (access_rules); l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      GDataAccessRule *rule = l->data;
Packit f01ec2
      const gchar *scope_type;
Packit f01ec2
      const gchar *scope_value;
Packit f01ec2
      gchar *contact_resource;
Packit f01ec2
Packit f01ec2
      gdata_access_rule_get_scope (rule, &scope_type, &scope_value);
Packit f01ec2
Packit f01ec2
      /* default scope access means the document is completely public */
Packit f01ec2
      if (g_strcmp0 (scope_type, GDATA_ACCESS_SCOPE_DEFAULT) == 0)
Packit f01ec2
        continue;
Packit f01ec2
Packit f01ec2
      /* skip domain scopes */
Packit f01ec2
      if (g_strcmp0 (scope_type, GDATA_ACCESS_SCOPE_DOMAIN) == 0)
Packit f01ec2
        continue;
Packit f01ec2
Packit f01ec2
      contact_resource = gom_tracker_utils_ensure_contact_resource (connection,
Packit f01ec2
                                                                    cancellable, error,
Packit f01ec2
                                                                    scope_value,
Packit f01ec2
                                                                    "");
Packit f01ec2
Packit f01ec2
      gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
        (connection,
Packit f01ec2
         cancellable, error,
Packit f01ec2
         datasource_urn, resource,
Packit f01ec2
         "nco:contributor", contact_resource);
Packit f01ec2
Packit f01ec2
      g_free (contact_resource);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  date = gom_iso8601_from_timestamp (gdata_entry_get_published (entry));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:contentCreated", date);
Packit f01ec2
  g_free (date);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_clear_object (&access_rules);
Packit f01ec2
  g_free (resource);
Packit f01ec2
  g_free (identifier);
Packit f01ec2
Packit f01ec2
  g_list_free (parents);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    return FALSE;
Packit f01ec2
Packit f01ec2
  return TRUE;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static gchar *
Packit f01ec2
account_miner_job_process_photo (TrackerSparqlConnection *connection,
Packit f01ec2
                                 GHashTable *previous_resources,
Packit f01ec2
                                 const gchar *datasource_urn,
Packit f01ec2
                                 GDataPicasaWebFile *photo,
Packit f01ec2
                                 const gchar *parent_resource_urn,
Packit f01ec2
                                 GCancellable *cancellable,
Packit f01ec2
                                 GError **error)
Packit f01ec2
{
Packit f01ec2
  GList *l, *media_contents;
Packit f01ec2
  gchar *resource = NULL, *equipment_resource = NULL;
Packit f01ec2
  gchar *contact_resource, *date, *identifier = NULL;
Packit f01ec2
  gboolean resource_exists, mtime_changed;
Packit f01ec2
  gint64 new_mtime;
Packit f01ec2
  gint64 timestamp;
Packit f01ec2
Packit f01ec2
  const gchar *flash_off = "http://www.tracker-project.org/temp/nmm#flash-off";
Packit f01ec2
  const gchar *flash_on = "http://www.tracker-project.org/temp/nmm#flash-on";
Packit f01ec2
Packit f01ec2
  gboolean flash;
Packit f01ec2
  const gchar *credit;
Packit f01ec2
  const gchar *id;
Packit f01ec2
  const gchar *make;
Packit f01ec2
  const gchar *model;
Packit f01ec2
  const gchar *title;
Packit f01ec2
  const gchar *summary;
Packit f01ec2
  const gchar *mime;
Packit f01ec2
Packit f01ec2
  gchar *email;
Packit f01ec2
  gchar *exposure;
Packit f01ec2
  gchar *focal_length;
Packit f01ec2
  gchar *fstop;
Packit f01ec2
  gchar *iso;
Packit f01ec2
  gchar *width;
Packit f01ec2
  gchar *height;
Packit f01ec2
Packit f01ec2
  GDataLink *alternate;
Packit f01ec2
  const gchar *alternate_uri;
Packit f01ec2
Packit f01ec2
  id = gdata_entry_get_id (GDATA_ENTRY (photo));
Packit f01ec2
Packit f01ec2
  media_contents = gdata_picasaweb_file_get_contents (photo);
Packit f01ec2
  for (l = media_contents; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      GDataMediaContent *media_content = GDATA_MEDIA_CONTENT (l->data);
Packit f01ec2
      GDataMediaMedium medium;
Packit f01ec2
Packit f01ec2
      medium = gdata_media_content_get_medium (media_content);
Packit f01ec2
      if (medium != GDATA_MEDIA_IMAGE)
Packit f01ec2
        {
Packit f01ec2
          g_debug ("Skipping %s because medium(%d) is not an image", id, medium);
Packit f01ec2
          goto out;
Packit f01ec2
        }
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  identifier = g_strdup_printf ("%s%s", PREFIX_PICASAWEB, id);
Packit f01ec2
Packit f01ec2
  /* remove from the list of the previous resources, if any */
Packit f01ec2
  if (previous_resources != NULL)
Packit f01ec2
    g_hash_table_remove (previous_resources, identifier);
Packit f01ec2
Packit f01ec2
  resource = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     &resource_exists,
Packit f01ec2
     datasource_urn, identifier,
Packit f01ec2
     "nfo:RemoteDataObject", "nmm:Photo", NULL);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_update_datasource (connection, datasource_urn,
Packit f01ec2
                                 resource_exists, identifier, resource,
Packit f01ec2
                                 cancellable, error);
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* Check updated time to avoid updating the DB if it has not
Packit f01ec2
   * been modified since our last run
Packit f01ec2
   */
Packit f01ec2
  new_mtime = gdata_entry_get_updated (GDATA_ENTRY (photo));
Packit f01ec2
  mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
Packit f01ec2
                                            resource_exists, identifier, resource,
Packit f01ec2
                                            cancellable, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* avoid updating the DB if the resource already exists and has not
Packit f01ec2
   * been modified since our last run.
Packit f01ec2
   */
Packit f01ec2
  if (!mtime_changed)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* the resource changed - just set all the properties again */
Packit f01ec2
  alternate = gdata_entry_look_up_link (GDATA_ENTRY (photo), GDATA_LINK_ALTERNATE);
Packit f01ec2
  alternate_uri = gdata_link_get_uri (alternate);
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:url", alternate_uri);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  summary = gdata_entry_get_summary ((GDATA_ENTRY (photo)));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:description", summary);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  if (parent_resource_urn != NULL)
Packit f01ec2
    {
Packit f01ec2
      gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
        (connection,
Packit f01ec2
         cancellable, error,
Packit f01ec2
         datasource_urn, resource,
Packit f01ec2
         "nie:isPartOf", parent_resource_urn);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  mime = gdata_media_content_get_content_type (GDATA_MEDIA_CONTENT (media_contents->data));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:mimeType", mime);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  title = gdata_entry_get_title ((GDATA_ENTRY (photo)));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:title", title);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  credit = gdata_picasaweb_file_get_credit (photo);
Packit f01ec2
  email = generate_fake_email_from_fullname (credit);
Packit f01ec2
  contact_resource = gom_tracker_utils_ensure_contact_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     email, credit);
Packit f01ec2
  g_free (email);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nco:creator", contact_resource);
Packit f01ec2
Packit f01ec2
  g_free (contact_resource);
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  exposure = g_strdup_printf ("%f", gdata_picasaweb_file_get_exposure (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nmm:exposureTime", exposure);
Packit f01ec2
  g_free (exposure);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  focal_length = g_strdup_printf ("%f", gdata_picasaweb_file_get_focal_length (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nmm:focalLength", focal_length);
Packit f01ec2
  g_free (focal_length);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  fstop = g_strdup_printf ("%f", gdata_picasaweb_file_get_fstop (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nmm:fnumber", fstop);
Packit f01ec2
  g_free (fstop);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  iso = g_strdup_printf ("%ld", (glong) gdata_picasaweb_file_get_iso (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nmm:isoSpeed", iso);
Packit f01ec2
  g_free (iso);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  flash = gdata_picasaweb_file_get_flash (photo);
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nmm:flash", flash ? flash_on : flash_off);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  make = gdata_picasaweb_file_get_make (photo);
Packit f01ec2
  model = gdata_picasaweb_file_get_model (photo);
Packit f01ec2
Packit f01ec2
  if (make != NULL || model != NULL)
Packit f01ec2
    {
Packit f01ec2
      equipment_resource = gom_tracker_utils_ensure_equipment_resource (connection,
Packit f01ec2
                                                                        cancellable,
Packit f01ec2
                                                                        error,
Packit f01ec2
                                                                        make,
Packit f01ec2
                                                                        model);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
Packit f01ec2
      gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
        (connection,
Packit f01ec2
         cancellable, error,
Packit f01ec2
         datasource_urn, resource,
Packit f01ec2
         "nfo:equipment", equipment_resource);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  width = g_strdup_printf ("%u", gdata_picasaweb_file_get_width (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nfo:width", width);
Packit f01ec2
  g_free (width);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  height = g_strdup_printf ("%u", gdata_picasaweb_file_get_height (photo));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nfo:height", height);
Packit f01ec2
  g_free (height);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  timestamp = gdata_picasaweb_file_get_timestamp (photo);
Packit f01ec2
  date = gom_iso8601_from_timestamp (timestamp / 1000);
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:contentCreated", date);
Packit f01ec2
  g_free (date);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_free (identifier);
Packit f01ec2
  g_free (equipment_resource);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    return NULL;
Packit f01ec2
Packit f01ec2
  return resource;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static gboolean
Packit f01ec2
account_miner_job_process_album (TrackerSparqlConnection *connection,
Packit f01ec2
                                 GHashTable *previous_resources,
Packit f01ec2
                                 const gchar *datasource_urn,
Packit f01ec2
                                 GDataPicasaWebService *service,
Packit f01ec2
                                 GDataPicasaWebAlbum *album,
Packit f01ec2
                                 GCancellable *cancellable,
Packit f01ec2
                                 GError **error)
Packit f01ec2
{
Packit f01ec2
  GDataFeed *feed = NULL;
Packit f01ec2
  GDataPicasaWebQuery *query;
Packit f01ec2
  gchar *resource = NULL;
Packit f01ec2
  gchar *contact_resource, *date, *identifier;
Packit f01ec2
  gchar *email;
Packit f01ec2
  gboolean resource_exists, mtime_changed;
Packit f01ec2
  gint64 new_mtime;
Packit f01ec2
  gint64 timestamp;
Packit f01ec2
Packit f01ec2
  const gchar *album_id;
Packit f01ec2
  const gchar *nickname;
Packit f01ec2
  const gchar *title;
Packit f01ec2
  const gchar *summary;
Packit f01ec2
Packit f01ec2
  GList *l, *photos = NULL;
Packit f01ec2
Packit f01ec2
  GDataLink *alternate;
Packit f01ec2
  const gchar *alternate_uri;
Packit f01ec2
Packit f01ec2
  album_id = gdata_entry_get_id (GDATA_ENTRY (album));
Packit f01ec2
  identifier = g_strdup_printf ("photos:collection:%s%s", PREFIX_PICASAWEB, album_id);
Packit f01ec2
Packit f01ec2
  /* remove from the list of the previous resources, if any */
Packit f01ec2
  if (previous_resources != NULL)
Packit f01ec2
    g_hash_table_remove (previous_resources, identifier);
Packit f01ec2
Packit f01ec2
  resource = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     &resource_exists,
Packit f01ec2
     datasource_urn, identifier,
Packit f01ec2
     "nfo:RemoteDataObject", "nfo:DataContainer",
Packit f01ec2
     NULL);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_update_datasource
Packit f01ec2
    (connection, datasource_urn,
Packit f01ec2
     resource_exists, identifier, resource,
Packit f01ec2
     cancellable, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* Check updated time to avoid updating the DB if it has not
Packit f01ec2
   * been modified since our last run
Packit f01ec2
   */
Packit f01ec2
  new_mtime = gdata_entry_get_updated (GDATA_ENTRY (album));
Packit f01ec2
  mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
Packit f01ec2
                                            resource_exists, identifier, resource,
Packit f01ec2
                                            cancellable, error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* avoid updating the DB if the resource already exists and has not
Packit f01ec2
   * been modified since our last run.
Packit f01ec2
   */
Packit f01ec2
  if (!mtime_changed)
Packit f01ec2
    goto album_photos;
Packit f01ec2
Packit f01ec2
  /* the resource changed - just set all the properties again */
Packit f01ec2
  alternate = gdata_entry_look_up_link (GDATA_ENTRY (album), GDATA_LINK_ALTERNATE);
Packit f01ec2
  alternate_uri = gdata_link_get_uri (alternate);
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:url", alternate_uri);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  summary = gdata_entry_get_summary ((GDATA_ENTRY (album)));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:description", summary);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  title = gdata_entry_get_title ((GDATA_ENTRY (album)));
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:title", title);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  nickname = gdata_picasaweb_album_get_nickname (album);
Packit f01ec2
  email = generate_fake_email_from_fullname (nickname);
Packit f01ec2
  contact_resource = gom_tracker_utils_ensure_contact_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     email, nickname);
Packit f01ec2
  g_free (email);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nco:creator", contact_resource);
Packit f01ec2
  g_free (contact_resource);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  timestamp = gdata_picasaweb_album_get_timestamp (album);
Packit f01ec2
  date = gom_iso8601_from_timestamp (timestamp / 1000);
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:contentCreated", date);
Packit f01ec2
  g_free (date);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
 album_photos:
Packit f01ec2
  query = gdata_picasaweb_query_new (NULL);
Packit f01ec2
  gdata_picasaweb_query_set_image_size (query, "d");
Packit f01ec2
  feed = gdata_picasaweb_service_query_files (service, album, GDATA_QUERY (query),
Packit f01ec2
                                              cancellable, NULL, NULL, error);
Packit f01ec2
Packit f01ec2
  g_object_unref (query);
Packit f01ec2
Packit f01ec2
  if (feed == NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  photos = gdata_feed_get_entries (feed);
Packit f01ec2
  for (l = photos; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      GDataPicasaWebFile *file = GDATA_PICASAWEB_FILE (l->data);
Packit f01ec2
      gchar *photo_resource_urn = NULL;
Packit f01ec2
Packit f01ec2
      photo_resource_urn = account_miner_job_process_photo (connection,
Packit f01ec2
                                                            previous_resources,
Packit f01ec2
                                                            datasource_urn,
Packit f01ec2
                                                            file,
Packit f01ec2
                                                            resource,
Packit f01ec2
                                                            cancellable,
Packit f01ec2
                                                            error);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        {
Packit f01ec2
          const gchar *photo_id;
Packit f01ec2
Packit f01ec2
          photo_id = gdata_picasaweb_file_get_id (file);
Packit f01ec2
          g_warning ("Unable to process photo %s: %s", photo_id, (*error)->message);
Packit f01ec2
          g_clear_error (error);
Packit f01ec2
        }
Packit f01ec2
Packit f01ec2
      g_free (photo_resource_urn);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_clear_object (&feed);
Packit f01ec2
  g_free (resource);
Packit f01ec2
  g_free (identifier);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    return FALSE;
Packit f01ec2
Packit f01ec2
  return TRUE;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
insert_shared_content_photos (TrackerSparqlConnection *connection,
Packit f01ec2
                              const gchar *datasource_urn,
Packit f01ec2
                              const gchar *shared_id,
Packit f01ec2
                              const gchar *source_urn,
Packit f01ec2
                              GDataPicasaWebService *service,
Packit f01ec2
                              GCancellable *cancellable,
Packit f01ec2
                              GError **error)
Packit f01ec2
{
Packit f01ec2
  GError *local_error;
Packit f01ec2
  GDataAuthorizationDomain *authorization_domain;
Packit f01ec2
  GDataEntry *entry = NULL;
Packit f01ec2
  GDataPicasaWebFile *file;
Packit f01ec2
  GDataPicasaWebQuery *query = NULL;
Packit f01ec2
  gchar *photo_resource_urn = NULL;
Packit f01ec2
Packit f01ec2
  authorization_domain = gdata_picasaweb_service_get_primary_authorization_domain ();
Packit f01ec2
Packit f01ec2
  query = gdata_picasaweb_query_new (NULL);
Packit f01ec2
  gdata_picasaweb_query_set_image_size (query, "d");
Packit f01ec2
Packit f01ec2
  local_error = NULL;
Packit f01ec2
  entry = gdata_service_query_single_entry (GDATA_SERVICE (service),
Packit f01ec2
                                            authorization_domain,
Packit f01ec2
                                            shared_id,
Packit f01ec2
                                            GDATA_QUERY (query),
Packit f01ec2
                                            GDATA_TYPE_PICASAWEB_FILE,
Packit f01ec2
                                            cancellable,
Packit f01ec2
                                            &local_error);
Packit f01ec2
  if (local_error != NULL)
Packit f01ec2
    {
Packit f01ec2
      g_propagate_error (error, local_error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  file = GDATA_PICASAWEB_FILE (entry);
Packit f01ec2
Packit f01ec2
  local_error = NULL;
Packit f01ec2
  photo_resource_urn = account_miner_job_process_photo (connection,
Packit f01ec2
                                                        NULL,
Packit f01ec2
                                                        datasource_urn,
Packit f01ec2
                                                        file,
Packit f01ec2
                                                        NULL,
Packit f01ec2
                                                        cancellable,
Packit f01ec2
                                                        &local_error);
Packit f01ec2
  if (local_error != NULL)
Packit f01ec2
    {
Packit f01ec2
      g_propagate_error (error, local_error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  local_error = NULL;
Packit f01ec2
  if (!gom_tracker_sparql_connection_insert_or_replace_triple (connection,
Packit f01ec2
                                                               cancellable,
Packit f01ec2
                                                               &local_error,
Packit f01ec2
                                                               datasource_urn,
Packit f01ec2
                                                               source_urn,
Packit f01ec2
                                                               "nie:relatedTo",
Packit f01ec2
                                                               photo_resource_urn))
Packit f01ec2
    {
Packit f01ec2
      g_propagate_error (error, local_error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  local_error = NULL;
Packit f01ec2
  if (!gom_tracker_sparql_connection_insert_or_replace_triple (connection,
Packit f01ec2
                                                               cancellable,
Packit f01ec2
                                                               &local_error,
Packit f01ec2
                                                               datasource_urn,
Packit f01ec2
                                                               photo_resource_urn,
Packit f01ec2
                                                               "nie:links",
Packit f01ec2
                                                               source_urn))
Packit f01ec2
    {
Packit f01ec2
      g_propagate_error (error, local_error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_clear_object (&entry);
Packit f01ec2
  g_clear_object (&query);
Packit f01ec2
  g_free (photo_resource_urn);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
insert_shared_content (GomMiner *miner,
Packit f01ec2
                       gpointer service,
Packit f01ec2
                       TrackerSparqlConnection *connection,
Packit f01ec2
                       const gchar *datasource_urn,
Packit f01ec2
                       const gchar *shared_id,
Packit f01ec2
                       const gchar *shared_type,
Packit f01ec2
                       const gchar *source_urn,
Packit f01ec2
                       GCancellable *cancellable,
Packit f01ec2
                       GError **error)
Packit f01ec2
{
Packit f01ec2
  if (g_strcmp0 (shared_type, "photos") == 0)
Packit f01ec2
    insert_shared_content_photos (connection,
Packit f01ec2
                                  datasource_urn,
Packit f01ec2
                                  shared_id,
Packit f01ec2
                                  source_urn,
Packit f01ec2
                                  GDATA_PICASAWEB_SERVICE (service),
Packit f01ec2
                                  cancellable,
Packit f01ec2
                                  error);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
query_gdata_documents (GomAccountMinerJob *job,
Packit f01ec2
                       TrackerSparqlConnection *connection,
Packit f01ec2
                       GHashTable *previous_resources,
Packit f01ec2
                       const gchar *datasource_urn,
Packit f01ec2
                       GDataDocumentsService *service,
Packit f01ec2
                       GCancellable *cancellable,
Packit f01ec2
                       GError **error)
Packit f01ec2
{
Packit f01ec2
  GDataDocumentsQuery *query = NULL;
Packit f01ec2
  GDataDocumentsFeed *feed = NULL;
Packit f01ec2
  GList *entries, *l;
Packit f01ec2
  gboolean succeeded_once = FALSE;
Packit f01ec2
Packit f01ec2
  query = gdata_documents_query_new_with_limits (NULL, 1, MAX_RESULTS);
Packit f01ec2
  gdata_documents_query_set_show_folders (query, TRUE);
Packit f01ec2
Packit f01ec2
  while (TRUE)
Packit f01ec2
    {
Packit f01ec2
      GError *local_error;
Packit f01ec2
Packit f01ec2
      local_error = NULL;
Packit f01ec2
      feed = gdata_documents_service_query_documents
Packit f01ec2
        (service, query,
Packit f01ec2
         cancellable, NULL, NULL, &local_error);
Packit f01ec2
      if (local_error != NULL)
Packit f01ec2
        {
Packit f01ec2
          if (succeeded_once)
Packit f01ec2
            {
Packit f01ec2
              g_warning ("Unable to query: %s", local_error->message);
Packit f01ec2
              g_error_free (local_error);
Packit f01ec2
            }
Packit f01ec2
          else
Packit f01ec2
            {
Packit f01ec2
              g_propagate_error (error, local_error);
Packit f01ec2
            }
Packit f01ec2
Packit f01ec2
          break;
Packit f01ec2
        }
Packit f01ec2
Packit f01ec2
      succeeded_once = TRUE;
Packit f01ec2
Packit f01ec2
      entries = gdata_feed_get_entries (GDATA_FEED (feed));
Packit f01ec2
      if (entries == NULL)
Packit f01ec2
        break;
Packit f01ec2
Packit f01ec2
      for (l = entries; l != NULL; l = l->next)
Packit f01ec2
        {
Packit f01ec2
          local_error = NULL;
Packit f01ec2
          account_miner_job_process_entry (connection,
Packit f01ec2
                                           previous_resources,
Packit f01ec2
                                           datasource_urn,
Packit f01ec2
                                           service,
Packit f01ec2
                                           l->data,
Packit f01ec2
                                           cancellable,
Packit f01ec2
                                           &local_error);
Packit f01ec2
Packit f01ec2
          if (local_error != NULL)
Packit f01ec2
            {
Packit f01ec2
              g_warning ("Unable to process entry %p: %s", l->data, local_error->message);
Packit f01ec2
              g_error_free (local_error);
Packit f01ec2
            }
Packit f01ec2
        }
Packit f01ec2
Packit f01ec2
      gdata_query_next_page (GDATA_QUERY (query));
Packit f01ec2
      g_clear_object (&feed);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_clear_object (&feed);
Packit f01ec2
  g_clear_object (&query);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
query_gdata_photos (GomAccountMinerJob *job,
Packit f01ec2
                    TrackerSparqlConnection *connection,
Packit f01ec2
                    GHashTable *previous_resources,
Packit f01ec2
                    const gchar *datasource_urn,
Packit f01ec2
                    GDataPicasaWebService *service,
Packit f01ec2
                    GCancellable *cancellable,
Packit f01ec2
                    GError **error)
Packit f01ec2
{
Packit f01ec2
  GDataFeed *feed;
Packit f01ec2
  GList *albums, *l;
Packit f01ec2
Packit f01ec2
  feed = gdata_picasaweb_service_query_all_albums (service, NULL, NULL, cancellable, NULL, NULL, error);
Packit f01ec2
Packit f01ec2
  if (feed == NULL)
Packit f01ec2
    return;
Packit f01ec2
Packit f01ec2
  albums = gdata_feed_get_entries (feed);
Packit f01ec2
  for (l = albums; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      GDataPicasaWebAlbum *album = GDATA_PICASAWEB_ALBUM (l->data);
Packit f01ec2
Packit f01ec2
      account_miner_job_process_album (connection,
Packit f01ec2
                                       previous_resources,
Packit f01ec2
                                       datasource_urn,
Packit f01ec2
                                       service,
Packit f01ec2
                                       album,
Packit f01ec2
                                       cancellable,
Packit f01ec2
                                       error);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        {
Packit f01ec2
          const gchar *album_id;
Packit f01ec2
Packit f01ec2
          album_id = gdata_picasaweb_album_get_id (album);
Packit f01ec2
          g_warning ("Unable to process album %s: %s", album_id, (*error)->message);
Packit f01ec2
          g_clear_error (error);
Packit f01ec2
        }
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  g_object_unref (feed);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
query_gdata (GomAccountMinerJob *job,
Packit f01ec2
             TrackerSparqlConnection *connection,
Packit f01ec2
             GHashTable *previous_resources,
Packit f01ec2
             const gchar *datasource_urn,
Packit f01ec2
             GCancellable *cancellable,
Packit f01ec2
             GError **error)
Packit f01ec2
{
Packit f01ec2
  gpointer service;
Packit f01ec2
Packit f01ec2
  service = g_hash_table_lookup (job->services, "documents");
Packit f01ec2
  if (service != NULL)
Packit f01ec2
    query_gdata_documents (job,
Packit f01ec2
                           connection,
Packit f01ec2
                           previous_resources,
Packit f01ec2
                           datasource_urn,
Packit f01ec2
                           GDATA_DOCUMENTS_SERVICE (service),
Packit f01ec2
                           cancellable,
Packit f01ec2
                           error);
Packit f01ec2
Packit f01ec2
  service = g_hash_table_lookup (job->services, "photos");
Packit f01ec2
  if (service != NULL)
Packit f01ec2
    query_gdata_photos (job,
Packit f01ec2
                        connection,
Packit f01ec2
                        previous_resources,
Packit f01ec2
                        datasource_urn,
Packit f01ec2
                        GDATA_PICASAWEB_SERVICE (service),
Packit f01ec2
                        cancellable,
Packit f01ec2
                        error);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static gpointer
Packit f01ec2
create_service (GomMiner *miner, GoaObject *object, const gchar *type)
Packit f01ec2
{
Packit f01ec2
  GDataGoaAuthorizer *authorizer;
Packit f01ec2
  gpointer service = NULL;
Packit f01ec2
Packit f01ec2
  authorizer = gdata_goa_authorizer_new (object);
Packit f01ec2
Packit f01ec2
  if (g_strcmp0 (type, "documents") == 0)
Packit f01ec2
    service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer));
Packit f01ec2
Packit f01ec2
  if (g_strcmp0 (type, "photos") == 0)
Packit f01ec2
    service = gdata_picasaweb_service_new (GDATA_AUTHORIZER (authorizer));
Packit f01ec2
Packit f01ec2
  g_object_unref (authorizer);
Packit f01ec2
  return service;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static GHashTable *
Packit f01ec2
create_services (GomMiner *self,
Packit f01ec2
                 GoaObject *object)
Packit f01ec2
{
Packit f01ec2
  GDataGoaAuthorizer *authorizer;
Packit f01ec2
  GHashTable *services;
Packit f01ec2
Packit f01ec2
  services = g_hash_table_new_full (g_str_hash, g_str_equal,
Packit f01ec2
                                    NULL, (GDestroyNotify) g_object_unref);
Packit f01ec2
Packit f01ec2
  authorizer = gdata_goa_authorizer_new (object);
Packit f01ec2
Packit f01ec2
  if (gom_miner_supports_type (self, "documents") && goa_object_peek_documents (object) != NULL)
Packit f01ec2
    {
Packit f01ec2
      GDataDocumentsService *service;
Packit f01ec2
Packit f01ec2
      service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer));
Packit f01ec2
      g_hash_table_insert (services, "documents", service);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  if (gom_miner_supports_type (self, "photos") && goa_object_peek_photos (object) != NULL)
Packit f01ec2
    {
Packit f01ec2
      GDataPicasaWebService *service;
Packit f01ec2
Packit f01ec2
      service = gdata_picasaweb_service_new (GDATA_AUTHORIZER (authorizer));
Packit f01ec2
      g_hash_table_insert (services, "photos", service);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  /* the service takes ownership of the authorizer */
Packit f01ec2
  g_object_unref (authorizer);
Packit f01ec2
  return services;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
destroy_service (GomMiner *miner, gpointer service)
Packit f01ec2
{
Packit f01ec2
  g_object_unref (service);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_gdata_miner_init (GomGDataMiner *miner)
Packit f01ec2
{
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_gdata_miner_class_init (GomGDataMinerClass *klass)
Packit f01ec2
{
Packit f01ec2
  GomMinerClass *miner_class = GOM_MINER_CLASS (klass);
Packit f01ec2
Packit f01ec2
  miner_class->goa_provider_type = "google";
Packit f01ec2
  miner_class->miner_identifier = MINER_IDENTIFIER;
Packit f01ec2
  miner_class->version = 5;
Packit f01ec2
Packit f01ec2
  miner_class->create_service = create_service;
Packit f01ec2
  miner_class->create_services = create_services;
Packit f01ec2
  miner_class->destroy_service = destroy_service;
Packit f01ec2
  miner_class->insert_shared_content = insert_shared_content;
Packit f01ec2
  miner_class->query = query_gdata;
Packit f01ec2
}