[tracker/wip/passive-extraction: 7/7] libtracker-extract: Add TrackerFileSniffer



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]