[tracker/wip/passive-extraction: 7/7] libtracker-extract: Add TrackerFileSniffer
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/passive-extraction: 7/7] libtracker-extract: Add TrackerFileSniffer
- Date: Fri, 3 Jan 2014 01:47:49 +0000 (UTC)
commit 9608c7a05c360f1eef7831d28ab340420560d792
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jan 3 02:21:59 2014 +0100
libtracker-extract: Add TrackerFileSniffer
This is a file-specific implementation of TrackerDataSniffer. On
initialization, this object will query for files missing extraction,
and queueing these. Volumes are also inspected, having unindexed
files processed on mount events.
src/Makefile.am | 2 +-
src/libtracker-extract/Makefile.am | 8 +-
src/libtracker-extract/tracker-extract.h | 2 +
src/libtracker-extract/tracker-file-sniffer.c | 162 +++++++++++++++++++++++++
src/libtracker-extract/tracker-file-sniffer.h | 58 +++++++++
tests/libtracker-extract/Makefile.am | 1 +
6 files changed, 230 insertions(+), 3 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index de3c005..fbf70a9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,8 +18,8 @@ SUBDIRS = \
libtracker-data \
libtracker-direct \
libtracker-sparql-backend \
- libtracker-extract \
libtracker-miner \
+ libtracker-extract \
miners \
plugins \
tracker-store \
diff --git a/src/libtracker-extract/Makefile.am b/src/libtracker-extract/Makefile.am
index 2f7729a..6cc0b75 100644
--- a/src/libtracker-extract/Makefile.am
+++ b/src/libtracker-extract/Makefile.am
@@ -12,6 +12,7 @@ AM_CPPFLAGS = \
lib_LTLIBRARIES = libtracker-extract- TRACKER_API_VERSION@.la
libtracker_extract_ TRACKER_API_VERSION@_la_LIBADD = \
+ $(top_builddir)/src/libtracker-miner/libtracker-miner- TRACKER_API_VERSION@.la \
$(top_builddir)/src/libtracker-sparql-backend/libtracker-sparql- TRACKER_API_VERSION@.la \
$(top_builddir)/src/libtracker-common/libtracker-common.la \
$(BUILD_LIBS) \
@@ -30,6 +31,8 @@ libtracker_extract_ TRACKER_API_VERSION@_la_SOURCES = \
tracker-extract-client.h \
tracker-extract-info.c \
tracker-extract-info.h \
+ tracker-file-sniffer.c \
+ tracker-file-sniffer.h \
tracker-guarantee.c \
tracker-guarantee.h \
tracker-iptc.c \
@@ -101,7 +104,7 @@ INTROSPECTION_SCANNER_ARGS = \
-D TRACKER_COMPILATION \
--c-include="libtracker-extract/tracker-extract.h"
-INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir)/src/libtracker-sparql
+INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir)/src/libtracker-sparql
--includedir=$(top_srcdir)/src/libtracker-miner
if HAVE_INTROSPECTION
INTROSPECTION_CFLAGS += $(AM_CPPFLAGS)
@@ -111,7 +114,8 @@ TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_INCLUDES = GObject-2.0 GMod
TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_SCANNERFLAGS = \
--include-uninstalled=$(top_srcdir)/src/libtracker-sparql/Tracker-$(TRACKER_API_VERSION).gir
TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_CFLAGS = $(INCLUDES)
-TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_LIBS = $(lib_LTLIBRARIES)
+TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_LIBS = $(lib_LTLIBRARIES) \
+ $(top_builddir)/src/libtracker-miner/libtracker-miner- TRACKER_API_VERSION@.la
TrackerExtract_ TRACKER_API_VERSION_UNDERSCORES@_gir_FILES = $(introspection_sources)
INTROSPECTION_GIRS += TrackerExtract-$(TRACKER_API_VERSION).gir
diff --git a/src/libtracker-extract/tracker-extract.h b/src/libtracker-extract/tracker-extract.h
index 5b53a4c..01f6928 100644
--- a/src/libtracker-extract/tracker-extract.h
+++ b/src/libtracker-extract/tracker-extract.h
@@ -25,10 +25,12 @@
#define __LIBTRACKER_EXTRACT_INSIDE__
#include "tracker-data.h"
+#include "tracker-data-sniffer.h"
#include "tracker-encoding.h"
#include "tracker-exif.h"
#include "tracker-extract-client.h"
#include "tracker-extract-info.h"
+#include "tracker-file-sniffer.h"
#include "tracker-module-manager.h"
#include "tracker-guarantee.h"
#include "tracker-iptc.h"
diff --git a/src/libtracker-extract/tracker-file-sniffer.c b/src/libtracker-extract/tracker-file-sniffer.c
new file mode 100644
index 0000000..e8bed83
--- /dev/null
+++ b/src/libtracker-extract/tracker-file-sniffer.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2013, Carlos Garnacho <carlosg gnome org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include "config.h"
+#include "tracker-file-sniffer.h"
+#include <libtracker-common/tracker-ontologies.h>
+#include <libtracker-miner/tracker-storage.h>
+
+#define TRACKER_FILE_SNIFFER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_FILE_SNIFFER,
TrackerFileSnifferPrivate))
+
+typedef struct _TrackerFileSnifferPrivate TrackerFileSnifferPrivate;
+
+struct _TrackerFileSnifferPrivate {
+ TrackerSparqlConnection *sparql_conn;
+ TrackerStorage *storage;
+};
+
+G_DEFINE_TYPE (TrackerFileSniffer, tracker_file_sniffer, TRACKER_TYPE_DATA_SNIFFER)
+
+static void
+tracker_file_sniffer_class_init (TrackerFileSnifferClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (object_class, sizeof (TrackerFileSnifferPrivate));
+}
+
+static void
+check_files_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ TrackerSparqlConnection *conn;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ conn = TRACKER_SPARQL_CONNECTION (object);
+ cursor = tracker_sparql_connection_query_finish (conn, result, &error);
+
+ if (error) {
+ g_critical ("Could not query files: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+ const gchar *urn, *url;
+
+ urn = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+ url = tracker_sparql_cursor_get_string (cursor, 1, NULL);
+ g_signal_emit_by_name (user_data, "updated", urn, url);
+ }
+
+ g_object_unref (cursor);
+}
+
+static void
+check_files (TrackerFileSniffer *sniffer,
+ const gchar *mount_point_urn)
+{
+ TrackerFileSnifferPrivate *priv;
+ const gchar *data_source;
+ GString *query;
+
+ priv = sniffer->priv;
+ data_source = tracker_data_sniffer_get_data_source (TRACKER_DATA_SNIFFER (sniffer));
+ query = g_string_new ("SELECT ?urn ?url { "
+ " ?urn a nfo:FileDataObject ;"
+ " nie:url ?url ;");
+
+ if (mount_point_urn) {
+ g_string_append_printf (query,
+ "nie:dataSource <%s> ;",
+ mount_point_urn);
+ }
+
+ g_string_append_printf (query,
+ "tracker:available true . "
+ "FILTER (NOT EXISTS { ?urn nie:dataSource <%s> })}",
+ data_source);
+
+ tracker_sparql_connection_query_async (priv->sparql_conn, query->str,
+ NULL, check_files_cb, sniffer);
+ g_string_free (query, TRUE);
+}
+
+static void
+mount_point_added_cb (TrackerStorage *storage,
+ const gchar *uuid,
+ const gchar *mount_point,
+ const gchar *mount_name,
+ gboolean removable,
+ gboolean optical,
+ gpointer user_data)
+{
+ gchar *urn;
+
+ urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", uuid);
+ check_files (user_data, urn);
+ g_free (urn);
+}
+
+static void
+mount_point_removed_cb (TrackerStorage *storage,
+ const gchar *uuid,
+ const gchar *mount_point,
+ gpointer user_data)
+{
+ /* FIXME: remove queued elements from processing */
+}
+
+static void
+tracker_file_sniffer_init (TrackerFileSniffer *sniffer)
+{
+ TrackerFileSnifferPrivate *priv;
+ GError *error = NULL;
+
+ sniffer->priv = priv = TRACKER_FILE_SNIFFER_GET_PRIVATE (sniffer);
+ priv->storage = tracker_storage_new ();
+
+ g_signal_connect (priv->storage, "mount-point-added",
+ G_CALLBACK (mount_point_added_cb), sniffer);
+
+ g_signal_connect (priv->storage, "mount-point-removed",
+ G_CALLBACK (mount_point_removed_cb), sniffer);
+
+ priv->sparql_conn = tracker_sparql_connection_get (NULL, &error);
+
+ if (error) {
+ g_critical ("Could not get sparql connection: %s", error->message);
+ g_error_free (error);
+ }
+
+ check_files (sniffer, NULL);
+}
+
+TrackerDataSniffer *
+tracker_file_sniffer_new (const gchar *class_name,
+ const gchar *data_source_urn)
+{
+ g_return_val_if_fail (data_source_urn != NULL, NULL);
+
+ return g_object_new (TRACKER_TYPE_FILE_SNIFFER,
+ "class-name", class_name,
+ "data-source", data_source_urn,
+ NULL);
+}
diff --git a/src/libtracker-extract/tracker-file-sniffer.h b/src/libtracker-extract/tracker-file-sniffer.h
new file mode 100644
index 0000000..2fc19eb
--- /dev/null
+++ b/src/libtracker-extract/tracker-file-sniffer.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013, Carlos Garnacho <carlosg gnome org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __LIBTRACKER_FILE_SNIFFER_H__
+#define __LIBTRACKER_FILE_SNIFFER_H__
+
+#if !defined (__LIBTRACKER_EXTRACT_INSIDE__) && !defined (TRACKER_COMPILATION)
+#error "only <libtracker-extract/tracker-extract.h> must be included directly."
+#endif
+
+#include "tracker-data-sniffer.h"
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_FILE_SNIFFER (tracker_file_sniffer_get_type())
+#define TRACKER_FILE_SNIFFER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_FILE_SNIFFER,
TrackerFileSniffer))
+#define TRACKER_FILE_SNIFFER_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_FILE_SNIFFER,
TrackerFileSnifferClass))
+#define TRACKER_IS_FILE_SNIFFER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_FILE_SNIFFER))
+#define TRACKER_IS_FILE_SNIFFER_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), TRACKER_TYPE_FILE_SNIFFER))
+#define TRACKER_FILE_SNIFFER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_FILE_SNIFFER,
TrackerFileSnifferClass))
+
+typedef struct _TrackerFileSniffer TrackerFileSniffer;
+typedef struct _TrackerFileSnifferClass TrackerFileSnifferClass;
+
+struct _TrackerFileSniffer {
+ TrackerDataSniffer parent_instance;
+ gpointer priv;
+};
+
+struct _TrackerFileSnifferClass {
+ TrackerDataSnifferClass parent_class;
+};
+
+GType tracker_file_sniffer_get_type (void) G_GNUC_CONST;
+
+TrackerDataSniffer * tracker_file_sniffer_new (const gchar *class_name,
+ const gchar *data_source_urn);
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_FILE_SNIFFER_H__ */
diff --git a/tests/libtracker-extract/Makefile.am b/tests/libtracker-extract/Makefile.am
index b8f5a90..9f4a281 100644
--- a/tests/libtracker-extract/Makefile.am
+++ b/tests/libtracker-extract/Makefile.am
@@ -38,6 +38,7 @@ LDADD = \
$(top_builddir)/tests/common/libtracker-testcommon.la \
$(top_builddir)/src/libtracker-common/libtracker-common.la \
$(top_builddir)/src/libtracker-extract/libtracker-extract- TRACKER_API_VERSION@.la \
+ $(top_builddir)/src/libtracker-miner/libtracker-miner- TRACKER_API_VERSION@.la \
$(top_builddir)/src/libtracker-sparql-backend/libtracker-sparql- TRACKER_API_VERSION@.la \
$(BUILD_LIBS) \
$(LIBTRACKER_EXTRACT_LIBS)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]