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