Tomas Bzatek 94fa224
From 62ec35a733aee0a7ce7a820027e8507183ac212d Mon Sep 17 00:00:00 2001
Tomas Bzatek 94fa224
From: Tomas Bzatek <tbzatek@redhat.com>
Tomas Bzatek 94fa224
Date: Wed, 21 Oct 2009 15:23:26 +0200
Tomas Bzatek 94fa224
Subject: [PATCH] Load beagle/tracker at runtime
Tomas Bzatek 94fa224
Tomas Bzatek 94fa224
Dynamically load beagle and tracker client libraries on demand if available.
Tomas Bzatek 94fa224
This allows more flexibility for packagers and users.
Tomas Bzatek 94fa224
Tomas Bzatek 94fa224
See bug 589345 for details.
Tomas Bzatek 94fa224
---
Tomas Bzatek 94fa224
 configure.in                                       |   62 ---------
Tomas Bzatek 94fa224
 libnautilus-private/Makefile.am                    |   20 +---
Tomas Bzatek 94fa224
 .../nautilus-search-engine-beagle.c                |  132 ++++++++++++++++++-
Tomas Bzatek 94fa224
 .../nautilus-search-engine-tracker.c               |  142 ++++++++++++++++----
Tomas Bzatek 94fa224
 libnautilus-private/nautilus-search-engine.c       |    4 -
Tomas Bzatek 94fa224
 5 files changed, 248 insertions(+), 112 deletions(-)
Tomas Bzatek 94fa224
Tomas Bzatek 94fa224
diff --git a/configure.in b/configure.in
Tomas Bzatek 94fa224
index 45f0b26..866e8f3 100644
Tomas Bzatek 94fa224
--- a/configure.in
Tomas Bzatek 94fa224
+++ b/configure.in
Tomas Bzatek 94fa224
@@ -195,66 +195,6 @@ if test "x$enable_xmp" != "xno"; then
Tomas Bzatek 94fa224
 fi
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 dnl ==========================================================================
Tomas Bzatek 94fa224
-dnl search implementations
Tomas Bzatek 94fa224
-dnl ****************************
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-AM_CONDITIONAL(HAVE_TRACKER, false)
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-dnl libtracker checking
Tomas Bzatek 94fa224
-			    			  
Tomas Bzatek 94fa224
-AC_ARG_ENABLE(tracker, 
Tomas Bzatek 94fa224
-	AC_HELP_STRING([--disable-tracker], 
Tomas Bzatek 94fa224
-			[build without tracker support]))
Tomas Bzatek 94fa224
-msg_tracker=no
Tomas Bzatek 94fa224
-if test "x$enable_tracker" != "xno"; then
Tomas Bzatek 94fa224
-	PKG_CHECK_MODULES(TRACKER, tracker-client-0.7, [
Tomas Bzatek 94fa224
-	                  AM_CONDITIONAL(HAVE_TRACKER, true)
Tomas Bzatek 94fa224
-			  AC_DEFINE(HAVE_TRACKER, 1, [Define to enable tracker support])
Tomas Bzatek 94fa224
-			  AC_DEFINE(HAVE_TRACKER_0_7, 1, [Define to enable tracker support])
Tomas Bzatek 94fa224
-			  ]
Tomas Bzatek 94fa224
-                          msg_tracker=yes,
Tomas Bzatek 94fa224
-	                  [
Tomas Bzatek 94fa224
-	                  PKG_CHECK_MODULES(TRACKER, tracker >= tracker_minver, [
Tomas Bzatek 94fa224
-	                                    AM_CONDITIONAL(HAVE_TRACKER, true)
Tomas Bzatek 94fa224
-			                    AC_DEFINE(HAVE_TRACKER, 1, [Define to enable tracker support])
Tomas Bzatek 94fa224
-			                    ]
Tomas Bzatek 94fa224
-		                            msg_tracker=yes,
Tomas Bzatek 94fa224
-	                                   [AM_CONDITIONAL(HAVE_TRACKER, false)])
Tomas Bzatek 94fa224
-	                  ])
Tomas Bzatek 94fa224
-        AC_SUBST(TRACKER_CFLAGS)
Tomas Bzatek 94fa224
-	AC_SUBST(TRACKER_LIBS)
Tomas Bzatek 94fa224
-fi
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-dnl ==========================================================================
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-AM_CONDITIONAL(HAVE_BEAGLE, false)
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-dnl libbeagle checking
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-AC_ARG_ENABLE(beagle, 
Tomas Bzatek 94fa224
-	AC_HELP_STRING([--disable-beagle], 
Tomas Bzatek 94fa224
-			[build without beagle support]))
Tomas Bzatek 94fa224
-msg_beagle=no
Tomas Bzatek 94fa224
-if test "x$enable_beagle" != "xno"; then
Tomas Bzatek 94fa224
-	BEAGLE_PKGCONFIG=
Tomas Bzatek 94fa224
-	if $PKG_CONFIG --exists libbeagle-1.0; then
Tomas Bzatek 94fa224
-		BEAGLE_PKGCONFIG=libbeagle-1.0
Tomas Bzatek 94fa224
-	else
Tomas Bzatek 94fa224
-		BEAGLE_PKGCONFIG=libbeagle-0.0
Tomas Bzatek 94fa224
-	fi
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-	PKG_CHECK_MODULES(BEAGLE, $BEAGLE_PKGCONFIG >= beagle_minver, [
Tomas Bzatek 94fa224
-		  	  AM_CONDITIONAL(HAVE_BEAGLE, true)
Tomas Bzatek 94fa224
-			  AC_DEFINE(HAVE_BEAGLE, 1, [Define to enable beagle support])
Tomas Bzatek 94fa224
-			  ]
Tomas Bzatek 94fa224
-                          msg_beagle=yes,
Tomas Bzatek 94fa224
-	          	  [AM_CONDITIONAL(HAVE_BEAGLE, false)])
Tomas Bzatek 94fa224
-        AC_SUBST(BEAGLE_CFLAGS)
Tomas Bzatek 94fa224
-	AC_SUBST(BEAGLE_LIBS)
Tomas Bzatek 94fa224
-fi
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-dnl ==========================================================================
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 dnl ****************************
Tomas Bzatek 94fa224
 dnl *** Check for libselinux ***
Tomas Bzatek 94fa224
@@ -470,8 +410,6 @@ nautilus-$VERSION:
Tomas Bzatek 94fa224
 	prefix:                 ${prefix}
Tomas Bzatek 94fa224
 	source code location:	${srcdir}
Tomas Bzatek 94fa224
 	compiler:		${CC}
Tomas Bzatek 94fa224
-	tracker support:	$msg_tracker
Tomas Bzatek 94fa224
-	beagle support:		$msg_beagle
Tomas Bzatek 94fa224
 	xmp support:		$msg_xmp
Tomas Bzatek 94fa224
 	PackageKit support:     $msg_packagekit
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am
Tomas Bzatek 94fa224
index e831d43..0f817fc 100644
Tomas Bzatek 94fa224
--- a/libnautilus-private/Makefile.am
Tomas Bzatek 94fa224
+++ b/libnautilus-private/Makefile.am
Tomas Bzatek 94fa224
@@ -154,6 +154,10 @@ libnautilus_private_la_SOURCES = \
Tomas Bzatek 94fa224
 	nautilus-search-engine.h \
Tomas Bzatek 94fa224
 	nautilus-search-engine-simple.c \
Tomas Bzatek 94fa224
 	nautilus-search-engine-simple.h \
Tomas Bzatek 94fa224
+	nautilus-search-engine-beagle.c \
Tomas Bzatek 94fa224
+	nautilus-search-engine-beagle.h \
Tomas Bzatek 94fa224
+	nautilus-search-engine-tracker.c \
Tomas Bzatek 94fa224
+	nautilus-search-engine-tracker.h \
Tomas Bzatek 94fa224
 	nautilus-sidebar-provider.c \
Tomas Bzatek 94fa224
 	nautilus-sidebar-provider.h \
Tomas Bzatek 94fa224
 	nautilus-sidebar.c \
Tomas Bzatek 94fa224
@@ -195,22 +199,6 @@ libnautilus_private_la_SOURCES = \
Tomas Bzatek 94fa224
 	nautilus-window-slot-info.h \
Tomas Bzatek 94fa224
 	$(NULL)
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-BEAGLE_SOURCES = \
Tomas Bzatek 94fa224
-	nautilus-search-engine-beagle.c \
Tomas Bzatek 94fa224
-	nautilus-search-engine-beagle.h
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-if HAVE_BEAGLE
Tomas Bzatek 94fa224
-libnautilus_private_la_SOURCES += $(BEAGLE_SOURCES)
Tomas Bzatek 94fa224
-endif
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-TRACKER_SOURCES = \
Tomas Bzatek 94fa224
-	nautilus-search-engine-tracker.c \
Tomas Bzatek 94fa224
-	nautilus-search-engine-tracker.h
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
-if HAVE_TRACKER
Tomas Bzatek 94fa224
-libnautilus_private_la_SOURCES += $(TRACKER_SOURCES)
Tomas Bzatek 94fa224
-endif
Tomas Bzatek 94fa224
-
Tomas Bzatek 94fa224
 $(lib_LTLIBRARIES): $(dependency_static_libs)
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 nautilus-marshal.h: nautilus-marshal.list $(GLIB_GENMARSHAL)
Tomas Bzatek 94fa224
diff --git a/libnautilus-private/nautilus-search-engine-beagle.c b/libnautilus-private/nautilus-search-engine-beagle.c
Tomas Bzatek 94fa224
index 3ab6507..930923f 100644
Tomas Bzatek 94fa224
--- a/libnautilus-private/nautilus-search-engine-beagle.c
Tomas Bzatek 94fa224
+++ b/libnautilus-private/nautilus-search-engine-beagle.c
Tomas Bzatek 94fa224
@@ -23,10 +23,20 @@
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 #include <config.h>
Tomas Bzatek 94fa224
 #include "nautilus-search-engine-beagle.h"
Tomas Bzatek 94fa224
-#include <beagle/beagle.h>
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 #include <eel/eel-gtk-macros.h>
Tomas Bzatek 94fa224
 #include <eel/eel-glib-extensions.h>
Tomas Bzatek 94fa224
+#include <gmodule.h>
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+typedef struct _BeagleHit BeagleHit;
Tomas Bzatek 94fa224
+typedef struct _BeagleQuery BeagleQuery;
Tomas Bzatek 94fa224
+typedef struct _BeagleClient BeagleClient;
Tomas Bzatek 94fa224
+typedef struct _BeagleRequest BeagleRequest;
Tomas Bzatek 94fa224
+typedef struct _BeagleFinishedResponse BeagleFinishedResponse;
Tomas Bzatek 94fa224
+typedef struct _BeagleHitsAddedResponse BeagleHitsAddedResponse;
Tomas Bzatek 94fa224
+typedef struct _BeagleQueryPartProperty BeagleQueryPartProperty;
Tomas Bzatek 94fa224
+typedef struct _BeagleQueryPart BeagleQueryPart;
Tomas Bzatek 94fa224
+typedef struct _BeagleHitsSubtractedResponse BeagleHitsSubtractedResponse;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 struct NautilusSearchEngineBeagleDetails {
Tomas Bzatek 94fa224
 	BeagleClient *client;
Tomas Bzatek 94fa224
@@ -37,6 +47,121 @@ struct NautilusSearchEngineBeagleDetails {
Tomas Bzatek 94fa224
 	gboolean query_finished;
Tomas Bzatek 94fa224
 };
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
+/* We dlopen() all the following from libbeagle at runtime */
Tomas Bzatek 94fa224
+#define BEAGLE_HIT(x) ((BeagleHit *)(x))
Tomas Bzatek 94fa224
+#define BEAGLE_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), beagle_request_get_type(), BeagleRequest))
Tomas Bzatek 94fa224
+#define BEAGLE_QUERY_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), beagle_query_part_get_type(), BeagleQueryPart))
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+typedef enum {
Tomas Bzatek 94fa224
+	BEAGLE_QUERY_PART_LOGIC_REQUIRED   = 1,
Tomas Bzatek 94fa224
+	BEAGLE_QUERY_PART_LOGIC_PROHIBITED = 2
Tomas Bzatek 94fa224
+} BeagleQueryPartLogic;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+typedef enum {
Tomas Bzatek 94fa224
+	BEAGLE_PROPERTY_TYPE_UNKNOWN = 0,
Tomas Bzatek 94fa224
+	BEAGLE_PROPERTY_TYPE_TEXT    = 1,
Tomas Bzatek 94fa224
+	BEAGLE_PROPERTY_TYPE_KEYWORD = 2,
Tomas Bzatek 94fa224
+	BEAGLE_PROPERTY_TYPE_DATE    = 3,
Tomas Bzatek 94fa224
+	BEAGLE_PROPERTY_TYPE_LAST    = 4
Tomas Bzatek 94fa224
+} BeaglePropertyType;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+/* *static* wrapper function pointers */
Tomas Bzatek 94fa224
+static gboolean (*beagle_client_send_request_async) (BeagleClient  *client,
Tomas Bzatek 94fa224
+                                                    BeagleRequest  *request,
Tomas Bzatek 94fa224
+                                                    GError        **err) = NULL;
Tomas Bzatek 94fa224
+static G_CONST_RETURN char *(*beagle_hit_get_uri) (BeagleHit *hit) = NULL;
Tomas Bzatek 94fa224
+static GSList *(*beagle_hits_added_response_get_hits) (BeagleHitsAddedResponse *response) = NULL;
Tomas Bzatek 94fa224
+static BeagleQuery *(*beagle_query_new) (void) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_add_text) (BeagleQuery     *query,
Tomas Bzatek 94fa224
+				      const char      *str) = NULL;
Tomas Bzatek 94fa224
+static BeagleQueryPartProperty *(*beagle_query_part_property_new) (void) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_part_set_logic) (BeagleQueryPart      *part,
Tomas Bzatek 94fa224
+					    BeagleQueryPartLogic  logic) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_part_property_set_key) (BeagleQueryPartProperty *part,
Tomas Bzatek 94fa224
+						   const char              *key) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_part_property_set_value) (BeagleQueryPartProperty *part,
Tomas Bzatek 94fa224
+						     const char *             value) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_part_property_set_property_type) (BeagleQueryPartProperty *part,
Tomas Bzatek 94fa224
+							     BeaglePropertyType       prop_type) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_add_part) (BeagleQuery     *query,
Tomas Bzatek 94fa224
+				      BeagleQueryPart *part) = NULL;
Tomas Bzatek 94fa224
+static GType (*beagle_request_get_type) (void) = NULL;
Tomas Bzatek 94fa224
+static GType (*beagle_query_part_get_type) (void) = NULL;
Tomas Bzatek 94fa224
+static gboolean (*beagle_util_daemon_is_running) (void) = NULL;
Tomas Bzatek 94fa224
+static BeagleClient *(*beagle_client_new_real) (const char *client_name) = NULL;
Tomas Bzatek 94fa224
+static void (*beagle_query_set_max_hits) (BeagleQuery *query,
Tomas Bzatek 94fa224
+					  int max_hits) = NULL;
Tomas Bzatek 94fa224
+static GSList *(*beagle_hits_subtracted_response_get_uris) (BeagleHitsSubtractedResponse *response) = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static struct BeagleDlMapping
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+  const char *fn_name;
Tomas Bzatek 94fa224
+  gpointer *fn_ptr_ref;
Tomas Bzatek 94fa224
+} beagle_dl_mapping[] =
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+#define MAP(a) { #a, (gpointer *)&a }
Tomas Bzatek 94fa224
+  MAP (beagle_client_send_request_async),
Tomas Bzatek 94fa224
+  MAP (beagle_hit_get_uri),
Tomas Bzatek 94fa224
+  MAP (beagle_hits_added_response_get_hits),
Tomas Bzatek 94fa224
+  MAP (beagle_query_new),
Tomas Bzatek 94fa224
+  MAP (beagle_query_add_text),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_property_new),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_set_logic),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_property_set_key),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_property_set_value),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_property_set_property_type),
Tomas Bzatek 94fa224
+  MAP (beagle_query_add_part),
Tomas Bzatek 94fa224
+  MAP (beagle_request_get_type),
Tomas Bzatek 94fa224
+  MAP (beagle_query_part_get_type),
Tomas Bzatek 94fa224
+  MAP (beagle_util_daemon_is_running),
Tomas Bzatek 94fa224
+  MAP (beagle_query_set_max_hits),
Tomas Bzatek 94fa224
+  MAP (beagle_hits_subtracted_response_get_uris),
Tomas Bzatek 94fa224
+#undef MAP
Tomas Bzatek 94fa224
+  { "beagle_client_new", (gpointer *)&beagle_client_new_real },
Tomas Bzatek 94fa224
+};
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static void 
Tomas Bzatek 94fa224
+open_libbeagle (void)
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+  static gboolean done = FALSE;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+  if (!done)
Tomas Bzatek 94fa224
+    {
Tomas Bzatek 94fa224
+      int i;
Tomas Bzatek 94fa224
+      GModule *beagle;
Tomas Bzatek 94fa224
+      
Tomas Bzatek 94fa224
+      done = TRUE;
Tomas Bzatek 94fa224
+ 
Tomas Bzatek 94fa224
+      beagle = g_module_open ("libbeagle.so.1", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
Tomas Bzatek 94fa224
+      if (!beagle)
Tomas Bzatek 94fa224
+	return;
Tomas Bzatek 94fa224
+      
Tomas Bzatek 94fa224
+      for (i = 0; i < G_N_ELEMENTS (beagle_dl_mapping); i++)
Tomas Bzatek 94fa224
+	{
Tomas Bzatek 94fa224
+	  if (!g_module_symbol (beagle, beagle_dl_mapping[i].fn_name,
Tomas Bzatek 94fa224
+				beagle_dl_mapping[i].fn_ptr_ref))
Tomas Bzatek 94fa224
+	    {
Tomas Bzatek 94fa224
+	      g_warning ("Missing symbol '%s' in libbeagle\n",
Tomas Bzatek 94fa224
+			 beagle_dl_mapping[i].fn_name);
Tomas Bzatek 94fa224
+	      g_module_close (beagle);
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	      for (i = 0; i < G_N_ELEMENTS (beagle_dl_mapping); i++)
Tomas Bzatek 94fa224
+		beagle_dl_mapping[i].fn_ptr_ref = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	      return;
Tomas Bzatek 94fa224
+	    }
Tomas Bzatek 94fa224
+	}
Tomas Bzatek 94fa224
+    }
Tomas Bzatek 94fa224
+}
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static BeagleClient *
Tomas Bzatek 94fa224
+beagle_client_new (const char *client_name)
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+  if (beagle_client_new_real)
Tomas Bzatek 94fa224
+    return beagle_client_new_real (client_name);
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+  return NULL;
Tomas Bzatek 94fa224
+}
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 static void  nautilus_search_engine_beagle_class_init       (NautilusSearchEngineBeagleClass *class);
Tomas Bzatek 94fa224
 static void  nautilus_search_engine_beagle_init             (NautilusSearchEngineBeagle      *engine);
Tomas Bzatek 94fa224
@@ -276,8 +401,11 @@ nautilus_search_engine_beagle_new (void)
Tomas Bzatek 94fa224
 {
Tomas Bzatek 94fa224
 	NautilusSearchEngineBeagle *engine;
Tomas Bzatek 94fa224
 	BeagleClient *client;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	open_libbeagle ();
Tomas Bzatek 94fa224
 	
Tomas Bzatek 94fa224
-	if (!beagle_util_daemon_is_running ()) {
Tomas Bzatek 94fa224
+	if (beagle_util_daemon_is_running == NULL ||
Tomas Bzatek 94fa224
+	    !beagle_util_daemon_is_running ()) {
Tomas Bzatek 94fa224
 		/* check whether daemon is running as beagle_client_new
Tomas Bzatek 94fa224
 		 * doesn't fail when a stale socket file exists */
Tomas Bzatek 94fa224
 		return NULL;
Tomas Bzatek 94fa224
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c
Tomas Bzatek 94fa224
index eec8d74..ff1e2d3 100644
Tomas Bzatek 94fa224
--- a/libnautilus-private/nautilus-search-engine-tracker.c
Tomas Bzatek 94fa224
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
Tomas Bzatek 94fa224
@@ -25,13 +25,103 @@
Tomas Bzatek 94fa224
 #include "nautilus-search-engine-tracker.h"
Tomas Bzatek 94fa224
 #include <eel/eel-gtk-macros.h>
Tomas Bzatek 94fa224
 #include <eel/eel-glib-extensions.h>
Tomas Bzatek 94fa224
+#include <gmodule.h>
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+typedef struct _TrackerClient TrackerClient;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+typedef void (*TrackerArrayReply) (char **result, GError *error, gpointer user_data);
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static TrackerClient *	(*tracker_connect)		(gboolean enable_warnings) = NULL;
Tomas Bzatek 94fa224
+static TrackerClient *	(*tracker_connect_07)		(gboolean enable_warnings,
Tomas Bzatek 94fa224
+							 gint     timeout) = NULL;
Tomas Bzatek 94fa224
+static void		(*tracker_disconnect)		(TrackerClient *client) = NULL;
Tomas Bzatek 94fa224
+static void		(*tracker_cancel_last_call)	(TrackerClient *client) = NULL;
Tomas Bzatek 94fa224
+static int		(*tracker_get_version)		(TrackerClient *client, GError **error) = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static void (*tracker_search_metadata_by_text_async) (TrackerClient *client,
Tomas Bzatek 94fa224
+						      const char *query,
Tomas Bzatek 94fa224
+						      TrackerArrayReply callback,
Tomas Bzatek 94fa224
+						      gpointer user_data) = NULL;
Tomas Bzatek 94fa224
+static void (*tracker_search_metadata_by_text_and_mime_async) (TrackerClient *client,
Tomas Bzatek 94fa224
+							       const char *query,
Tomas Bzatek 94fa224
+							       const char **mimes,
Tomas Bzatek 94fa224
+							       TrackerArrayReply callback,
Tomas Bzatek 94fa224
+							       gpointer user_data) = NULL;
Tomas Bzatek 94fa224
+static void (*tracker_search_metadata_by_text_and_location_async) (TrackerClient *client,
Tomas Bzatek 94fa224
+								   const char *query,
Tomas Bzatek 94fa224
+								   const char *location,
Tomas Bzatek 94fa224
+								   TrackerArrayReply callback,
Tomas Bzatek 94fa224
+								   gpointer user_data) = NULL;
Tomas Bzatek 94fa224
+static void (*tracker_search_metadata_by_text_and_mime_and_location_async) (TrackerClient *client,
Tomas Bzatek 94fa224
+									    const char *query,
Tomas Bzatek 94fa224
+									    const char **mimes,
Tomas Bzatek 94fa224
+									    const char *location,
Tomas Bzatek 94fa224
+									    TrackerArrayReply callback,
Tomas Bzatek 94fa224
+									    gpointer user_data) = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static struct TrackerDlMapping {
Tomas Bzatek 94fa224
+	const char	*fn_name;
Tomas Bzatek 94fa224
+	gpointer	*fn_ptr_ref;
Tomas Bzatek 94fa224
+	gboolean	 mandatory;
Tomas Bzatek 94fa224
+} tracker_dl_mapping[] =
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+#define MAP(a, b) { #a, (gpointer *)&a, b }
Tomas Bzatek 94fa224
+	MAP (tracker_connect, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_disconnect, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_cancel_last_call, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_search_metadata_by_text_async, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_search_metadata_by_text_and_mime_async, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_search_metadata_by_text_and_location_async, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_search_metadata_by_text_and_mime_and_location_async, TRUE),
Tomas Bzatek 94fa224
+	MAP (tracker_get_version, FALSE)
Tomas Bzatek 94fa224
+#undef MAP
Tomas Bzatek 94fa224
+};
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+static gboolean tracker_07;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-#ifdef HAVE_TRACKER_0_7
Tomas Bzatek 94fa224
-#include <libtracker-client/tracker.h>
Tomas Bzatek 94fa224
-#else
Tomas Bzatek 94fa224
-#include <tracker.h>
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
+static void
Tomas Bzatek 94fa224
+open_libtracker (void)
Tomas Bzatek 94fa224
+{
Tomas Bzatek 94fa224
+	static gboolean done = FALSE;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	if (! done) {
Tomas Bzatek 94fa224
+		int i;
Tomas Bzatek 94fa224
+		GModule *tracker;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+		done = TRUE;
Tomas Bzatek 94fa224
+		tracker_07 = TRUE;
Tomas Bzatek 94fa224
+		tracker_connect_07 = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+		tracker = g_module_open ("libtracker-client-0.7.so.0", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
Tomas Bzatek 94fa224
+		if (! tracker) {
Tomas Bzatek 94fa224
+			tracker = g_module_open ("libtrackerclient.so.0", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
Tomas Bzatek 94fa224
+			tracker_07 = FALSE;
Tomas Bzatek 94fa224
+		}
Tomas Bzatek 94fa224
+		if (! tracker)
Tomas Bzatek 94fa224
+			return;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+		for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++) {
Tomas Bzatek 94fa224
+			if (! g_module_symbol (tracker, tracker_dl_mapping[i].fn_name,
Tomas Bzatek 94fa224
+			                       tracker_dl_mapping[i].fn_ptr_ref) &&
Tomas Bzatek 94fa224
+			      tracker_dl_mapping[i].mandatory) {
Tomas Bzatek 94fa224
+				g_warning ("Missing symbol '%s' in libtracker\n",
Tomas Bzatek 94fa224
+					    tracker_dl_mapping[i].fn_name);
Tomas Bzatek 94fa224
+				g_module_close (tracker);
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+				for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++)
Tomas Bzatek 94fa224
+					tracker_dl_mapping[i].fn_ptr_ref = NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+				return;
Tomas Bzatek 94fa224
+			}
Tomas Bzatek 94fa224
+		}
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
+		if (tracker_07) {
Tomas Bzatek 94fa224
+			tracker_connect_07 = (gpointer)tracker_connect;
Tomas Bzatek 94fa224
+		}
Tomas Bzatek 94fa224
+	}
Tomas Bzatek 94fa224
+}
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 struct NautilusSearchEngineTrackerDetails {
Tomas Bzatek 94fa224
@@ -96,11 +186,7 @@ search_callback (char **results, GError *error, gpointer user_data)
Tomas Bzatek 94fa224
 		
Tomas Bzatek 94fa224
 		char *uri;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-#ifdef HAVE_TRACKER_0_7
Tomas Bzatek 94fa224
-		uri = g_strdup ((char *)*results_p);
Tomas Bzatek 94fa224
-#else
Tomas Bzatek 94fa224
-		uri = g_filename_to_uri ((char *)*results_p, NULL, NULL);
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
+		uri = tracker_07 ? g_strdup ((char *)*results_p) : g_filename_to_uri ((char *)*results_p, NULL, NULL);
Tomas Bzatek 94fa224
 		if (uri) {
Tomas Bzatek 94fa224
 			hit_uris = g_list_prepend (hit_uris, (char *)uri);
Tomas Bzatek 94fa224
 		}
Tomas Bzatek 94fa224
@@ -139,11 +225,7 @@ nautilus_search_engine_tracker_start (NautilusSearchEngine *engine)
Tomas Bzatek 94fa224
 	location_uri = nautilus_query_get_location (tracker->details->query);
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 	if (location_uri) {
Tomas Bzatek 94fa224
-#ifdef HAVE_TRACKER_0_7
Tomas Bzatek 94fa224
-		location = g_strdup (location_uri);
Tomas Bzatek 94fa224
-#else
Tomas Bzatek 94fa224
-		location = g_filename_from_uri (location_uri, NULL, NULL);
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
+		location = tracker_07 ? g_strdup (location_uri) : g_filename_from_uri (location_uri, NULL, NULL);
Tomas Bzatek 94fa224
 		g_free (location_uri);
Tomas Bzatek 94fa224
 	} else {
Tomas Bzatek 94fa224
 		location = NULL;
Tomas Bzatek 94fa224
@@ -271,27 +353,31 @@ nautilus_search_engine_tracker_new (void)
Tomas Bzatek 94fa224
 	NautilusSearchEngineTracker *engine;
Tomas Bzatek 94fa224
 	TrackerClient *tracker_client;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-#ifdef HAVE_TRACKER_0_7
Tomas Bzatek 94fa224
-	tracker_client = tracker_connect (FALSE, -1);
Tomas Bzatek 94fa224
-#else
Tomas Bzatek 94fa224
-	tracker_client = tracker_connect (FALSE);
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
+	open_libtracker ();
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	if (! tracker_connect)
Tomas Bzatek 94fa224
+		return NULL;
Tomas Bzatek 94fa224
+
Tomas Bzatek 94fa224
+	if (tracker_07)
Tomas Bzatek 94fa224
+		tracker_client = tracker_connect_07 (FALSE, -1);
Tomas Bzatek 94fa224
+	else
Tomas Bzatek 94fa224
+		tracker_client = tracker_connect (FALSE);
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 	if (!tracker_client) {
Tomas Bzatek 94fa224
 		return NULL;
Tomas Bzatek 94fa224
 	}
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-#ifndef HAVE_TRACKER_0_7
Tomas Bzatek 94fa224
-	GError *err = NULL;
Tomas Bzatek 94fa224
+	if (! tracker_07) {
Tomas Bzatek 94fa224
+		GError *err = NULL;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-	tracker_get_version (tracker_client, &err;;
Tomas Bzatek 94fa224
+		tracker_get_version (tracker_client, &err;;
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
-	if (err != NULL) {
Tomas Bzatek 94fa224
-		g_error_free (err);
Tomas Bzatek 94fa224
-		tracker_disconnect (tracker_client);
Tomas Bzatek 94fa224
-		return NULL;
Tomas Bzatek 94fa224
+		if (err != NULL) {
Tomas Bzatek 94fa224
+			g_error_free (err);
Tomas Bzatek 94fa224
+			tracker_disconnect (tracker_client);
Tomas Bzatek 94fa224
+			return NULL;
Tomas Bzatek 94fa224
+		}
Tomas Bzatek 94fa224
 	}
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 	engine = g_object_new (NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NULL);
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
diff --git a/libnautilus-private/nautilus-search-engine.c b/libnautilus-private/nautilus-search-engine.c
Tomas Bzatek 94fa224
index 2030d95..d225237 100644
Tomas Bzatek 94fa224
--- a/libnautilus-private/nautilus-search-engine.c
Tomas Bzatek 94fa224
+++ b/libnautilus-private/nautilus-search-engine.c
Tomas Bzatek 94fa224
@@ -126,19 +126,15 @@ nautilus_search_engine_new (void)
Tomas Bzatek 94fa224
 {
Tomas Bzatek 94fa224
 	NautilusSearchEngine *engine;
Tomas Bzatek 94fa224
 	
Tomas Bzatek 94fa224
-#ifdef HAVE_BEAGLE
Tomas Bzatek 94fa224
 	engine = nautilus_search_engine_beagle_new ();
Tomas Bzatek 94fa224
 	if (engine) {
Tomas Bzatek 94fa224
 		return engine;
Tomas Bzatek 94fa224
 	}
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
 	
Tomas Bzatek 94fa224
-#ifdef HAVE_TRACKER
Tomas Bzatek 94fa224
 	engine = nautilus_search_engine_tracker_new ();
Tomas Bzatek 94fa224
 	if (engine) {
Tomas Bzatek 94fa224
 		return engine;
Tomas Bzatek 94fa224
 	}
Tomas Bzatek 94fa224
-#endif
Tomas Bzatek 94fa224
 
Tomas Bzatek 94fa224
 	engine = nautilus_search_engine_simple_new ();
Tomas Bzatek 94fa224
 	return engine;
Tomas Bzatek 94fa224
-- 
Tomas Bzatek 94fa224
1.6.5.rc2
Tomas Bzatek 94fa224