Blame src/gom-zpj-miner.c

Packit f01ec2
/*
Packit f01ec2
 * GNOME Online Miners - crawls through your online content
Packit f01ec2
 * Copyright (c) 2012 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: Debarshi Ray <debarshir@gnome.org>
Packit f01ec2
 *
Packit f01ec2
 */
Packit f01ec2
Packit f01ec2
#include "config.h"
Packit f01ec2
Packit f01ec2
#include <goa/goa.h>
Packit f01ec2
#include <zpj/zpj.h>
Packit f01ec2
Packit f01ec2
#include "gom-zpj-miner.h"
Packit f01ec2
#include "gom-utils.h"
Packit f01ec2
Packit f01ec2
#define MINER_IDENTIFIER "gd:zpj:miner:30058620-777c-47a3-a19c-a6cdf4a315c4"
Packit f01ec2
Packit f01ec2
G_DEFINE_TYPE (GomZpjMiner, gom_zpj_miner, GOM_TYPE_MINER)
Packit f01ec2
Packit f01ec2
static gboolean
Packit f01ec2
account_miner_job_process_entry (GomAccountMinerJob *job,
Packit f01ec2
                                 TrackerSparqlConnection *connection,
Packit f01ec2
                                 GHashTable *previous_resources,
Packit f01ec2
                                 const gchar *datasource_urn,
Packit f01ec2
                                 ZpjSkydriveEntry *entry,
Packit f01ec2
                                 GCancellable *cancellable,
Packit f01ec2
                                 GError **error)
Packit f01ec2
{
Packit f01ec2
  GDateTime *created_time, *updated_time;
Packit f01ec2
  gchar *contact_resource;
Packit f01ec2
  gchar *resource = NULL;
Packit f01ec2
  gchar *date, *identifier;
Packit f01ec2
  const gchar *class = NULL, *id, *name;
Packit f01ec2
  gboolean resource_exists, mtime_changed;
Packit f01ec2
  gint64 new_mtime;
Packit f01ec2
Packit f01ec2
  id = zpj_skydrive_entry_get_id (entry);
Packit f01ec2
Packit f01ec2
  identifier = g_strdup_printf ("%swindows-live:skydrive:%s",
Packit f01ec2
                                ZPJ_IS_SKYDRIVE_FOLDER (entry) ? "gd:collection:" : "",
Packit f01ec2
                                id);
Packit f01ec2
Packit f01ec2
  /* remove from the list of the previous resources */
Packit f01ec2
  g_hash_table_remove (previous_resources, identifier);
Packit f01ec2
Packit f01ec2
  name = zpj_skydrive_entry_get_name (entry);
Packit f01ec2
Packit f01ec2
  if (ZPJ_IS_SKYDRIVE_FILE (entry))
Packit f01ec2
    class = gom_filename_to_rdf_type (name);
Packit f01ec2
  else if (ZPJ_IS_SKYDRIVE_FOLDER (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
  updated_time = zpj_skydrive_entry_get_updated_time (entry);
Packit f01ec2
  new_mtime = g_date_time_to_unix (updated_time);
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
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:url", identifier);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  if (ZPJ_IS_SKYDRIVE_FILE (entry))
Packit f01ec2
    {
Packit f01ec2
      gchar *parent_resource_urn, *parent_identifier;
Packit f01ec2
      gchar *mime;
Packit f01ec2
      const gchar *parent_id;
Packit f01ec2
Packit f01ec2
      parent_id = zpj_skydrive_entry_get_parent_id (entry);
Packit f01ec2
      parent_identifier = g_strconcat ("gd:collection:windows-live:skydrive:", parent_id, NULL);
Packit f01ec2
      parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
        (connection, cancellable, error,
Packit f01ec2
         NULL,
Packit f01ec2
         datasource_urn, parent_identifier,
Packit f01ec2
         "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
Packit f01ec2
      g_free (parent_identifier);
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
      mime = g_content_type_guess (name, NULL, 0, NULL);
Packit f01ec2
      if (mime != 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:mimeType", mime);
Packit f01ec2
          g_free (mime);
Packit f01ec2
Packit f01ec2
          if (*error != NULL)
Packit f01ec2
            goto out;
Packit f01ec2
        }
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
     "nie:description", zpj_skydrive_entry_get_description (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
     "nfo:fileName", name);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  contact_resource = gom_tracker_utils_ensure_contact_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, zpj_skydrive_entry_get_from_name (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
     "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
  created_time = zpj_skydrive_entry_get_created_time (entry);
Packit f01ec2
  date = gom_iso8601_from_timestamp (g_date_time_to_unix (created_time));
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 (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
account_miner_job_traverse_folder (GomAccountMinerJob *job,
Packit f01ec2
                                   TrackerSparqlConnection *connection,
Packit f01ec2
                                   GHashTable *previous_resources,
Packit f01ec2
                                   const gchar *datasource_urn,
Packit f01ec2
                                   const gchar *folder_id,
Packit f01ec2
                                   GCancellable *cancellable,
Packit f01ec2
                                   GError **error)
Packit f01ec2
{
Packit f01ec2
  GList *entries = NULL, *l;
Packit f01ec2
  ZpjSkydrive *skydrive;
Packit f01ec2
Packit f01ec2
  skydrive = ZPJ_SKYDRIVE (g_hash_table_lookup (job->services, "documents"));
Packit f01ec2
  if (skydrive == NULL)
Packit f01ec2
    {
Packit f01ec2
      /* FIXME: use proper #defines and enumerated types */
Packit f01ec2
      g_set_error (error,
Packit f01ec2
                   g_quark_from_static_string ("gom-error"),
Packit f01ec2
                   0,
Packit f01ec2
                   "Can not query without a service");
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  entries = zpj_skydrive_list_folder_id (skydrive,
Packit f01ec2
                                         folder_id,
Packit f01ec2
                                         cancellable,
Packit f01ec2
                                         error);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  for (l = entries; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      ZpjSkydriveEntry *entry = (ZpjSkydriveEntry *) l->data;
Packit f01ec2
      const gchar *id;
Packit f01ec2
Packit f01ec2
      id = zpj_skydrive_entry_get_id (entry);
Packit f01ec2
Packit f01ec2
      if (ZPJ_IS_SKYDRIVE_FOLDER (entry))
Packit f01ec2
        {
Packit f01ec2
          account_miner_job_traverse_folder (job, connection, previous_resources, datasource_urn, id, cancellable, error);
Packit f01ec2
          if (*error != NULL)
Packit f01ec2
            goto out;
Packit f01ec2
        }
Packit f01ec2
      else if (ZPJ_IS_SKYDRIVE_PHOTO (entry))
Packit f01ec2
        continue;
Packit f01ec2
Packit f01ec2
      account_miner_job_process_entry (job, connection, previous_resources, datasource_urn, entry, cancellable, error);
Packit f01ec2
Packit f01ec2
      if (*error != NULL)
Packit f01ec2
        {
Packit f01ec2
          g_warning ("Unable to process entry %p: %s", l->data, (*error)->message);
Packit f01ec2
          g_clear_error (error);
Packit f01ec2
        }
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  if (entries != NULL)
Packit f01ec2
    g_list_free_full (entries, g_object_unref);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
query_zpj (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
  account_miner_job_traverse_folder (job,
Packit f01ec2
                                     connection,
Packit f01ec2
                                     previous_resources,
Packit f01ec2
                                     datasource_urn,
Packit f01ec2
                                     ZPJ_SKYDRIVE_FOLDER_SKYDRIVE,
Packit f01ec2
                                     cancellable,
Packit f01ec2
                                     error);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static GHashTable *
Packit f01ec2
create_services (GomMiner *self,
Packit f01ec2
                 GoaObject *object)
Packit f01ec2
{
Packit f01ec2
  GHashTable *services;
Packit f01ec2
  ZpjGoaAuthorizer *authorizer;
Packit f01ec2
  ZpjSkydrive *service;
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
  if (gom_miner_supports_type (self, "documents"))
Packit f01ec2
    {
Packit f01ec2
      authorizer = zpj_goa_authorizer_new (object);
Packit f01ec2
      service = zpj_skydrive_new (ZPJ_AUTHORIZER (authorizer));
Packit f01ec2
Packit f01ec2
      /* the service takes ownership of the authorizer */
Packit f01ec2
      g_object_unref (authorizer);
Packit f01ec2
      g_hash_table_insert (services, "documents", service);
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  return services;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_zpj_miner_init (GomZpjMiner *self)
Packit f01ec2
{
Packit f01ec2
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_zpj_miner_class_init (GomZpjMinerClass *klass)
Packit f01ec2
{
Packit f01ec2
  GomMinerClass *miner_class = GOM_MINER_CLASS (klass);
Packit f01ec2
Packit f01ec2
  miner_class->goa_provider_type = "windows_live";
Packit f01ec2
  miner_class->miner_identifier = MINER_IDENTIFIER;
Packit f01ec2
  miner_class->version = 1;
Packit f01ec2
Packit f01ec2
  miner_class->create_services = create_services;
Packit f01ec2
  miner_class->query = query_zpj;
Packit f01ec2
}