summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2006-01-16 09:30:59 +0000
committerAlexander Larsson <alexl@src.gnome.org>2006-01-16 09:30:59 +0000
commit75faa2bce664b2f47c06c2d4728bc915e4bc3de3 (patch)
treec275f468e9ffe0eff4c2fda75e97258b8764eff7 /libnautilus-private
parentba96e073f64e978664c91f484e18fa3c033b6e4c (diff)
downloadnautilus-75faa2bce664b2f47c06c2d4728bc915e4bc3de3.tar.gz
Add search support for the Tracker indexing engine.
2006-01-16 Alexander Larsson <alexl@redhat.com> * configure.in: * libnautilus-private/Makefile.am: * libnautilus-private/nautilus-search-engine-tracker.[ch]: * libnautilus-private/nautilus-search-engine.c: Add search support for the Tracker indexing engine.
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/Makefile.am11
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.c276
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.h51
-rw-r--r--libnautilus-private/nautilus-search-engine.c8
4 files changed, 346 insertions, 0 deletions
diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am
index 7535c2c87..b13f1759b 100644
--- a/libnautilus-private/Makefile.am
+++ b/libnautilus-private/Makefile.am
@@ -8,6 +8,7 @@ INCLUDES = \
-I$(top_srcdir)/cut-n-paste-code \
$(CORE_CFLAGS) \
$(DISABLE_DEPRECATED_CFLAGS) \
+ $(TRACKER_CFLAGS) \
$(BEAGLE_CFLAGS) \
-DDATADIR=\""$(datadir)"\" \
-DSYSCONFDIR=\""$(sysconfdir)"\" \
@@ -29,6 +30,7 @@ libnautilus_private_la_LDFLAGS = \
libnautilus_private_la_LIBADD = \
$(dependency_static_libs) \
$(BEAGLE_LIBS) \
+ $(TRACKER_LIBS) \
$(top_builddir)/libnautilus-extension/libnautilus-extension.la \
$(CORE_LIBS) \
$(NULL)
@@ -211,6 +213,14 @@ if HAVE_BEAGLE
libnautilus_private_la_SOURCES += $(BEAGLE_SOURCES)
endif
+TRACKER_SOURCES = \
+ nautilus-search-engine-tracker.c \
+ nautilus-search-engine-tracker.h
+
+if HAVE_TRACKER
+libnautilus_private_la_SOURCES += $(TRACKER_SOURCES)
+endif
+
$(lib_LTLIBRARIES): $(dependency_static_libs)
$(nautilus_metafile_server_idl_sources): nautilus_metafile_server_idl_stamp
@@ -247,6 +257,7 @@ EXTRA_DIST = \
nautilus-marshal.list \
$(schema_in_files) \
$(BEAGLE_SOURCES) \
+ $(TRACKER_SOURCES) \
$(NULL)
CLEANFILES = \
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c
new file mode 100644
index 000000000..6799c053a
--- /dev/null
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -0,0 +1,276 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * Copyright (C) 2005 Mr Jamie McCracken
+ *
+ * Nautilus is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * Nautilus 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; see the file COPYING. If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Jamie McCracken <jamiemcc@gnome.org>
+ *
+ */
+
+#include <config.h>
+#include "nautilus-search-engine-tracker.h"
+#include <tracker.h>
+#include <libgnomevfs/gnome-vfs-utils.h>
+#include <eel/eel-gtk-macros.h>
+#include <eel/eel-glib-extensions.h>
+
+
+
+struct NautilusSearchEngineTrackerDetails {
+ NautilusQuery *query;
+ TrackerClient *client;
+ gboolean query_pending;
+};
+
+
+static void nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *class);
+static void nautilus_search_engine_tracker_init (NautilusSearchEngineTracker *engine);
+
+G_DEFINE_TYPE (NautilusSearchEngineTracker,
+ nautilus_search_engine_tracker,
+ NAUTILUS_TYPE_SEARCH_ENGINE);
+
+static NautilusSearchEngineClass *parent_class = NULL;
+
+static void
+finalize (GObject *object)
+{
+ NautilusSearchEngineTracker *tracker;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (object);
+
+ if (tracker->details->query) {
+ g_object_unref (tracker->details->query);
+ tracker->details->query = NULL;
+ }
+
+ tracker_disconnect (tracker->details->client);
+
+ g_free (tracker->details);
+
+ EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+
+static void
+search_callback (char **results, GError *error, gpointer user_data)
+{
+ NautilusSearchEngineTracker *tracker;
+ char **results_p;
+ GList *hit_uris;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (user_data);
+ hit_uris = NULL;
+
+ tracker->details->query_pending = FALSE;
+
+ if (error) {
+ nautilus_search_engine_error ( NAUTILUS_SEARCH_ENGINE (tracker), error->message);
+ g_error_free (error);
+ return;
+ }
+
+ if (!results) {
+ return;
+ }
+
+ for (results_p = results; *results_p; results_p++) {
+
+ char *uri;
+
+ uri = gnome_vfs_get_uri_from_local_path ((char *)*results_p);
+ if (uri) {
+ hit_uris = g_list_prepend (hit_uris, (char *)uri);
+ }
+ }
+
+ nautilus_search_engine_hits_added (NAUTILUS_SEARCH_ENGINE (tracker), hit_uris);
+ nautilus_search_engine_finished (NAUTILUS_SEARCH_ENGINE (tracker));
+ g_strfreev (results);
+ eel_g_list_free_deep (hit_uris);
+
+}
+
+
+static void
+nautilus_search_engine_tracker_start (NautilusSearchEngine *engine)
+{
+ NautilusSearchEngineTracker *tracker;
+ GList *mimetypes, *l;
+ char *search_text, *location, *location_uri;
+ char **mimes;
+ int i, mime_count;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
+
+ if (tracker->details->query_pending) {
+ return;
+ }
+
+ if (tracker->details->query == NULL) {
+ return;
+ }
+
+ search_text = nautilus_query_get_text (tracker->details->query);
+
+ mimetypes = nautilus_query_get_mime_types (tracker->details->query);
+
+ location_uri = nautilus_query_get_location (tracker->details->query);
+
+ if (location_uri) {
+ location = gnome_vfs_get_local_path_from_uri (location_uri);
+ g_free (location_uri);
+ } else {
+ location = NULL;
+ }
+
+ mime_count = g_list_length (mimetypes);
+
+ i = 0;
+
+ /* convert list into array */
+ if (mime_count > 0) {
+
+ mimes = g_new (char *, (mime_count + 1));
+
+ for (l = mimetypes; l != NULL; l = l->next) {
+ mimes[i] = g_strdup (l->data);
+ i++;
+ }
+
+ mimes[mime_count] = NULL;
+
+ if (location) {
+ tracker_search_metadata_by_text_and_mime_and_location_async (tracker->details->client,
+ search_text, (const char **)mimes, location,
+ search_callback,
+ tracker);
+ g_free (location);
+ } else {
+ tracker_search_metadata_by_text_and_mime_async (tracker->details->client,
+ search_text, (const char**)mimes,
+ search_callback,
+ tracker);
+ }
+
+ g_strfreev (mimes);
+
+
+ } else {
+ if (location) {
+ tracker_search_metadata_by_text_and_location_async (tracker->details->client,
+ search_text,
+ location,
+ search_callback,
+ tracker);
+ g_free (location);
+ } else {
+ tracker_search_metadata_by_text_async (tracker->details->client,
+ search_text,
+ search_callback,
+ tracker);
+ }
+
+ }
+
+ tracker->details->query_pending = TRUE;
+ g_free (search_text);
+ eel_g_list_free_deep (mimetypes);
+}
+
+static void
+nautilus_search_engine_tracker_stop (NautilusSearchEngine *engine)
+{
+ NautilusSearchEngineTracker *tracker;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
+
+ if (tracker->details->query && tracker->details->query_pending) {
+ tracker_cancel_last_call (tracker->details->client);
+ tracker->details->query_pending = FALSE;
+ }
+}
+
+static gboolean
+nautilus_search_engine_tracker_is_indexed (NautilusSearchEngine *engine)
+{
+ return TRUE;
+}
+
+static void
+nautilus_search_engine_tracker_set_query (NautilusSearchEngine *engine, NautilusQuery *query)
+{
+ NautilusSearchEngineTracker *tracker;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
+
+ if (query) {
+ g_object_ref (query);
+ }
+
+ if (tracker->details->query) {
+ g_object_unref (tracker->details->query);
+ }
+
+ tracker->details->query = query;
+}
+
+static void
+nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *class)
+{
+ GObjectClass *gobject_class;
+ NautilusSearchEngineClass *engine_class;
+
+ parent_class = g_type_class_peek_parent (class);
+
+ gobject_class = G_OBJECT_CLASS (class);
+ gobject_class->finalize = finalize;
+
+ engine_class = NAUTILUS_SEARCH_ENGINE_CLASS (class);
+ engine_class->set_query = nautilus_search_engine_tracker_set_query;
+ engine_class->start = nautilus_search_engine_tracker_start;
+ engine_class->stop = nautilus_search_engine_tracker_stop;
+ engine_class->is_indexed = nautilus_search_engine_tracker_is_indexed;
+}
+
+static void
+nautilus_search_engine_tracker_init (NautilusSearchEngineTracker *engine)
+{
+ engine->details = g_new0 (NautilusSearchEngineTrackerDetails, 1);
+}
+
+
+NautilusSearchEngine *
+nautilus_search_engine_tracker_new (void)
+{
+ NautilusSearchEngineTracker *engine;
+ TrackerClient *tracker_client;
+
+ tracker_client = tracker_connect (FALSE);
+
+ if (!tracker_client) {
+ return NULL;
+ }
+
+ engine = g_object_new (NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NULL);
+
+ engine->details->client = tracker_client;
+
+ engine->details->query_pending = FALSE;
+
+ return NAUTILUS_SEARCH_ENGINE (engine);
+}
diff --git a/libnautilus-private/nautilus-search-engine-tracker.h b/libnautilus-private/nautilus-search-engine-tracker.h
new file mode 100644
index 000000000..7c6dc3362
--- /dev/null
+++ b/libnautilus-private/nautilus-search-engine-tracker.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * Copyright (C) 2005 Mr Jamie McCracken
+ *
+ * Nautilus is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * Nautilus 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; see the file COPYING. If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Jamie McCracken (jamiemcc@gnome.org)
+ *
+ */
+
+#ifndef NAUTILUS_SEARCH_ENGINE_TRACKER_H
+#define NAUTILUS_SEARCH_ENGINE_TRACKER_H
+
+#include <libnautilus-private/nautilus-search-engine.h>
+
+#define NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER (nautilus_search_engine_tracker_get_type ())
+#define NAUTILUS_SEARCH_ENGINE_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NautilusSearchEngineTracker))
+#define NAUTILUS_SEARCH_ENGINE_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NautilusSearchEngineTrackerClass))
+#define NAUTILUS_IS_SEARCH_ENGINE_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER))
+#define NAUTILUS_IS_SEARCH_ENGINE_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER))
+#define NAUTILUS_SEARCH_ENGINE_TRACKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NautilusSearchEngineTrackerClass))
+
+typedef struct NautilusSearchEngineTrackerDetails NautilusSearchEngineTrackerDetails;
+
+typedef struct NautilusSearchEngineTracker {
+ NautilusSearchEngine parent;
+ NautilusSearchEngineTrackerDetails *details;
+} NautilusSearchEngineTracker;
+
+typedef struct {
+ NautilusSearchEngineClass parent_class;
+} NautilusSearchEngineTrackerClass;
+
+GType nautilus_search_engine_tracker_get_type (void);
+
+NautilusSearchEngine* nautilus_search_engine_tracker_new (void);
+
+#endif /* NAUTILUS_SEARCH_ENGINE_TRACKER_H */
diff --git a/libnautilus-private/nautilus-search-engine.c b/libnautilus-private/nautilus-search-engine.c
index d98b1f40e..243a7f6bb 100644
--- a/libnautilus-private/nautilus-search-engine.c
+++ b/libnautilus-private/nautilus-search-engine.c
@@ -25,6 +25,7 @@
#include "nautilus-search-engine.h"
#include "nautilus-search-engine-beagle.h"
#include "nautilus-search-engine-simple.h"
+#include "nautilus-search-engine-tracker.h"
#include <eel/eel-gtk-macros.h>
@@ -125,6 +126,13 @@ nautilus_search_engine_new (void)
{
NautilusSearchEngine *engine;
+#ifdef HAVE_TRACKER
+ engine = nautilus_search_engine_tracker_new ();
+ if (engine) {
+ return engine;
+ }
+#endif
+
#ifdef HAVE_BEAGLE
engine = nautilus_search_engine_beagle_new ();
if (engine) {