|
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 |
}
|