bf8be1f
--- nautilus-2.16.2/configure.in.dynamic-search	2006-11-06 12:12:05.000000000 -0500
bf8be1f
+++ nautilus-2.16.2/configure.in	2006-11-14 01:41:48.000000000 -0500
bf8be1f
@@ -230,42 +230,12 @@
bf8be1f
 dnl search implementations
bf8be1f
 dnl ****************************
bf8be1f
 
bf8be1f
-AM_CONDITIONAL(HAVE_TRACKER, false)
bf8be1f
+# We hardcode beagle and tracker use and then load it dynamically			    			  
bf8be1f
+AM_CONDITIONAL(HAVE_TRACKER, true)
bf8be1f
+AC_DEFINE(HAVE_TRACKER, 1, [Define to enable tracker support])
bf8be1f
 
bf8be1f
-dnl libtracker checking
bf8be1f
-			    			  
bf8be1f
-AC_ARG_ENABLE(tracker, [  --disable-tracker     build without tracker support])
bf8be1f
-msg_tracker=no
bf8be1f
-if test "x$enable_tracker" != "xno"; then
bf8be1f
-	PKG_CHECK_MODULES(TRACKER, tracker >= tracker_minver, [
bf8be1f
-		  	  AM_CONDITIONAL(HAVE_TRACKER, true)
bf8be1f
-			  AC_DEFINE(HAVE_TRACKER, 1, [Define to enable tracker support])
bf8be1f
-			  ]
bf8be1f
-                          msg_tracker=yes,
bf8be1f
-	          	  [AM_CONDITIONAL(HAVE_TRACKER, false)])
bf8be1f
-        AC_SUBST(TRACKER_CFLAGS)
bf8be1f
-	AC_SUBST(TRACKER_LIBS)
bf8be1f
-fi
bf8be1f
-
bf8be1f
-dnl ==========================================================================
bf8be1f
-
bf8be1f
-
bf8be1f
-AM_CONDITIONAL(HAVE_BEAGLE, false)
bf8be1f
-
bf8be1f
-dnl libbeagle checking
bf8be1f
-			    			  
bf8be1f
-AC_ARG_ENABLE(beagle, [  --disable-beagle     build without beagle support])
bf8be1f
-msg_beagle=no
bf8be1f
-if test "x$enable_beagle" != "xno"; then
bf8be1f
-	PKG_CHECK_MODULES(BEAGLE, libbeagle-0.0 >= beagle_minver, [
bf8be1f
-		  	  AM_CONDITIONAL(HAVE_BEAGLE, true)
bf8be1f
-			  AC_DEFINE(HAVE_BEAGLE, 1, [Define to enable beagle support])
bf8be1f
-			  ]
bf8be1f
-                          msg_beagle=yes,
bf8be1f
-	          	  [AM_CONDITIONAL(HAVE_BEAGLE, false)])
bf8be1f
-        AC_SUBST(BEAGLE_CFLAGS)
bf8be1f
-	AC_SUBST(BEAGLE_LIBS)
bf8be1f
-fi
bf8be1f
+AM_CONDITIONAL(HAVE_BEAGLE, true)
bf8be1f
+AC_DEFINE(HAVE_BEAGLE, 1, [Define to enable beagle support])
bf8be1f
 
bf8be1f
 dnl ==========================================================================
bf8be1f
 
bf8be1f
--- nautilus-2.16.2/libnautilus-private/nautilus-search-engine-beagle.c.dynamic-search	2006-08-07 06:34:30.000000000 -0400
bf8be1f
+++ nautilus-2.16.2/libnautilus-private/nautilus-search-engine-beagle.c	2006-11-14 01:38:25.000000000 -0500
bf8be1f
@@ -23,10 +23,20 @@
bf8be1f
 
bf8be1f
 #include <config.h>
bf8be1f
 #include "nautilus-search-engine-beagle.h"
bf8be1f
-#include <beagle/beagle.h>
bf8be1f
 
bf8be1f
 #include <eel/eel-gtk-macros.h>
bf8be1f
 #include <eel/eel-glib-extensions.h>
bf8be1f
+#include <gmodule.h>
bf8be1f
+
bf8be1f
+typedef struct _BeagleHit BeagleHit;
bf8be1f
+typedef struct _BeagleQuery BeagleQuery;
bf8be1f
+typedef struct _BeagleClient BeagleClient;
bf8be1f
+typedef struct _BeagleRequest BeagleRequest;
bf8be1f
+typedef struct _BeagleFinishedResponse BeagleFinishedResponse;
bf8be1f
+typedef struct _BeagleHitsAddedResponse BeagleHitsAddedResponse;
bf8be1f
+typedef struct _BeagleQueryPartProperty BeagleQueryPartProperty;
bf8be1f
+typedef struct _BeagleQueryPart BeagleQueryPart;
bf8be1f
+typedef struct _BeagleHitsSubtractedResponse BeagleHitsSubtractedResponse;
bf8be1f
 
bf8be1f
 struct NautilusSearchEngineBeagleDetails {
bf8be1f
 	BeagleClient *client;
bf8be1f
@@ -37,6 +47,127 @@
bf8be1f
 	gboolean query_finished;
bf8be1f
 };
bf8be1f
 
bf8be1f
+/* We dlopen() all the following from libbeagle at runtime */
bf8be1f
+#define BEAGLE_HIT(x) ((BeagleHit *)(x))
bf8be1f
+#define BEAGLE_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), beagle_request_get_type(), BeagleRequest))
bf8be1f
+#define BEAGLE_QUERY_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), beagle_query_part_get_type(), BeagleQueryPart))
bf8be1f
+
bf8be1f
+typedef enum {
bf8be1f
+        BEAGLE_QUERY_PART_LOGIC_REQUIRED   = 1,
bf8be1f
+	BEAGLE_QUERY_PART_LOGIC_PROHIBITED = 2
bf8be1f
+} BeagleQueryPartLogic;
bf8be1f
+
bf8be1f
+typedef enum {
bf8be1f
+	BEAGLE_PROPERTY_TYPE_UNKNOWN = 0,
bf8be1f
+	BEAGLE_PROPERTY_TYPE_TEXT    = 1,
bf8be1f
+	BEAGLE_PROPERTY_TYPE_KEYWORD = 2,
bf8be1f
+	BEAGLE_PROPERTY_TYPE_DATE    = 3,
bf8be1f
+	BEAGLE_PROPERTY_TYPE_LAST    = 4
bf8be1f
+} BeaglePropertyType;
bf8be1f
+
bf8be1f
+/* *static* wrapper function pointers */
bf8be1f
+static gboolean (*beagle_client_send_request_async) (BeagleClient  *client,
bf8be1f
+                                                    BeagleRequest  *request,
bf8be1f
+                                                    GError        **err) = NULL;
bf8be1f
+static G_CONST_RETURN char *(*beagle_hit_get_uri) (BeagleHit *hit) = NULL;
bf8be1f
+static GSList *(*beagle_hits_added_response_get_hits) (BeagleHitsAddedResponse *response) = NULL;
bf8be1f
+static BeagleQuery *(*beagle_query_new) (void) = NULL;
bf8be1f
+static void (*beagle_query_add_text) (BeagleQuery     *query,
bf8be1f
+				      const char      *str) = NULL;
bf8be1f
+static void (*beagle_query_add_hit_type) (BeagleQuery *query,
bf8be1f
+					  const char  *hit_type) = NULL;
bf8be1f
+static BeagleQueryPartProperty *(*beagle_query_part_property_new) (void) = NULL;
bf8be1f
+static void (*beagle_query_part_set_logic) (BeagleQueryPart      *part, 
bf8be1f
+					    BeagleQueryPartLogic  logic) = NULL;
bf8be1f
+static void (*beagle_query_part_property_set_key) (BeagleQueryPartProperty *part, 
bf8be1f
+						   const char              *key) = NULL;
bf8be1f
+static void (*beagle_query_part_property_set_value) (BeagleQueryPartProperty *part, 
bf8be1f
+						     const char *             value) = NULL;
bf8be1f
+static void (*beagle_query_part_property_set_property_type) (BeagleQueryPartProperty *part, 
bf8be1f
+							     BeaglePropertyType       prop_type) = NULL;
bf8be1f
+static void (*beagle_query_add_part) (BeagleQuery     *query, 
bf8be1f
+				      BeagleQueryPart *part) = NULL;
bf8be1f
+static GType (*beagle_request_get_type) (void) = NULL;
bf8be1f
+static GType (*beagle_query_part_get_type) (void) = NULL;
bf8be1f
+static gboolean (*beagle_util_daemon_is_running) (void) = NULL;
bf8be1f
+static BeagleClient *(*beagle_client_new_real) (const char *client_name) = NULL;
bf8be1f
+static void (*beagle_query_set_max_hits) (BeagleQuery *query, 
bf8be1f
+					  int max_hits) = NULL;
bf8be1f
+static void (*beagle_query_add_mime_type) (BeagleQuery *query,
bf8be1f
+					   const char  *mime_type) = NULL;
bf8be1f
+static GSList *(*beagle_hits_subtracted_response_get_uris) (BeagleHitsSubtractedResponse *response) = NULL;
bf8be1f
+
bf8be1f
+static struct BeagleDlMapping
bf8be1f
+{
bf8be1f
+  const char *fn_name;
bf8be1f
+  gpointer *fn_ptr_ref;
bf8be1f
+} beagle_dl_mapping[] =
bf8be1f
+{
bf8be1f
+#define MAP(a) { #a, (gpointer *)&a }
bf8be1f
+  MAP (beagle_client_send_request_async),
bf8be1f
+  MAP (beagle_hit_get_uri),
bf8be1f
+  MAP (beagle_hits_added_response_get_hits),
bf8be1f
+  MAP (beagle_query_new),
bf8be1f
+  MAP (beagle_query_add_text),
bf8be1f
+  MAP (beagle_query_add_hit_type),
bf8be1f
+  MAP (beagle_query_part_property_new),
bf8be1f
+  MAP (beagle_query_part_set_logic),
bf8be1f
+  MAP (beagle_query_part_property_set_key),
bf8be1f
+  MAP (beagle_query_part_property_set_value),
bf8be1f
+  MAP (beagle_query_part_property_set_property_type),
bf8be1f
+  MAP (beagle_query_add_part),
bf8be1f
+  MAP (beagle_request_get_type),
bf8be1f
+  MAP (beagle_query_part_get_type),
bf8be1f
+  MAP (beagle_util_daemon_is_running),
bf8be1f
+  MAP (beagle_query_set_max_hits),
bf8be1f
+  MAP (beagle_query_add_mime_type),
bf8be1f
+  MAP (beagle_hits_subtracted_response_get_uris),
bf8be1f
+#undef MAP
bf8be1f
+  { "beagle_client_new", (gpointer *)&beagle_client_new_real },
bf8be1f
+};
bf8be1f
+
bf8be1f
+static void 
bf8be1f
+open_libbeagle (void)
bf8be1f
+{
bf8be1f
+  static gboolean done = FALSE;
bf8be1f
+
bf8be1f
+  if (!done)
bf8be1f
+    {
bf8be1f
+      int i;
bf8be1f
+      GModule *beagle;
bf8be1f
+      
bf8be1f
+      done = TRUE;
bf8be1f
+ 
bf8be1f
+      beagle = g_module_open ("libbeagle.so.0", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
bf8be1f
+      if (!beagle)
bf8be1f
+	return;
bf8be1f
+      
bf8be1f
+      for (i = 0; i < G_N_ELEMENTS (beagle_dl_mapping); i++)
bf8be1f
+	{
bf8be1f
+	  if (!g_module_symbol (beagle, beagle_dl_mapping[i].fn_name,
bf8be1f
+				beagle_dl_mapping[i].fn_ptr_ref))
bf8be1f
+	    {
bf8be1f
+	      g_warning ("Missing symbol '%s' in libbeagle\n",
bf8be1f
+			 beagle_dl_mapping[i].fn_name);
bf8be1f
+	      g_module_close (beagle);
bf8be1f
+
bf8be1f
+	      for (i = 0; i < G_N_ELEMENTS (beagle_dl_mapping); i++)
bf8be1f
+		beagle_dl_mapping[i].fn_ptr_ref = NULL;
bf8be1f
+
bf8be1f
+	      return;
bf8be1f
+	    }
bf8be1f
+	}
bf8be1f
+    }
bf8be1f
+}
bf8be1f
+
bf8be1f
+static BeagleClient *
bf8be1f
+beagle_client_new (const char *client_name)
bf8be1f
+{
bf8be1f
+  if (beagle_client_new_real)
bf8be1f
+    return beagle_client_new_real (client_name);
bf8be1f
+
bf8be1f
+  return NULL;
bf8be1f
+}
bf8be1f
 
bf8be1f
 static void  nautilus_search_engine_beagle_class_init       (NautilusSearchEngineBeagleClass *class);
bf8be1f
 static void  nautilus_search_engine_beagle_init             (NautilusSearchEngineBeagle      *engine);
bf8be1f
@@ -274,8 +405,11 @@
bf8be1f
 {
bf8be1f
 	NautilusSearchEngineBeagle *engine;
bf8be1f
 	BeagleClient *client;
bf8be1f
+
bf8be1f
+	open_libbeagle ();
bf8be1f
 	
bf8be1f
-	if (!beagle_util_daemon_is_running ()) {
bf8be1f
+	if (beagle_util_daemon_is_running == NULL ||
bf8be1f
+	    !beagle_util_daemon_is_running ()) {
bf8be1f
 		/* check whether daemon is running as beagle_client_new
bf8be1f
 		 * doesn't fail when a stale socket file exists */
bf8be1f
 		return NULL;
bf8be1f
--- nautilus-2.16.2/libnautilus-private/nautilus-search-engine-tracker.c.dynamic-search	2006-11-14 01:39:07.000000000 -0500
bf8be1f
+++ nautilus-2.16.2/libnautilus-private/nautilus-search-engine-tracker.c	2006-11-14 01:40:36.000000000 -0500
bf8be1f
@@ -23,12 +23,94 @@
bf8be1f
 
bf8be1f
 #include <config.h>
bf8be1f
 #include "nautilus-search-engine-tracker.h"
bf8be1f
-#include <tracker.h>
bf8be1f
+#include <gmodule.h>
bf8be1f
 #include <libgnomevfs/gnome-vfs-utils.h>
bf8be1f
 #include <eel/eel-gtk-macros.h>
bf8be1f
 #include <eel/eel-glib-extensions.h>
bf8be1f
 
bf8be1f
 
bf8be1f
+typedef struct _TrackerClient TrackerClient;
bf8be1f
+
bf8be1f
+typedef void (*TrackerArrayReply) (char **result, GError *error, gpointer user_data);
bf8be1f
+
bf8be1f
+static TrackerClient * (*tracker_connect) (gboolean enable_warnings) = NULL;
bf8be1f
+static void	       (*tracker_disconnect) (TrackerClient *client) = NULL;
bf8be1f
+static void            (*tracker_cancel_last_call) (TrackerClient *client) = NULL;
bf8be1f
+
bf8be1f
+static void (*tracker_search_metadata_by_text_async) (TrackerClient *client, 
bf8be1f
+						      const char *query, 
bf8be1f
+						      TrackerArrayReply callback, 
bf8be1f
+						      gpointer user_data) = NULL;
bf8be1f
+static void (*tracker_search_metadata_by_text_and_mime_async) (TrackerClient *client, 
bf8be1f
+							       const char *query, 
bf8be1f
+							       const char **mimes, 
bf8be1f
+							       TrackerArrayReply callback, 
bf8be1f
+							       gpointer user_data) = NULL;
bf8be1f
+static void (*tracker_search_metadata_by_text_and_location_async) (TrackerClient *client, 
bf8be1f
+								   const char *query, 
bf8be1f
+								   const char *location, 
bf8be1f
+								   TrackerArrayReply callback, 
bf8be1f
+								   gpointer user_data) = NULL;
bf8be1f
+static void (*tracker_search_metadata_by_text_and_mime_and_location_async) (TrackerClient *client, 
bf8be1f
+									    const char *query, 
bf8be1f
+									    const char **mimes, 
bf8be1f
+									    const char *location, 
bf8be1f
+									    TrackerArrayReply callback, 
bf8be1f
+									    gpointer user_data) = NULL;
bf8be1f
+
bf8be1f
+
bf8be1f
+static struct TrackerDlMapping
bf8be1f
+{
bf8be1f
+  const char *fn_name;
bf8be1f
+  gpointer *fn_ptr_ref;
bf8be1f
+} tracker_dl_mapping[] =
bf8be1f
+{
bf8be1f
+#define MAP(a) { #a, (gpointer *)&a }
bf8be1f
+  MAP (tracker_connect),
bf8be1f
+  MAP (tracker_disconnect),
bf8be1f
+  MAP (tracker_cancel_last_call),
bf8be1f
+  MAP (tracker_search_metadata_by_text_async),
bf8be1f
+  MAP (tracker_search_metadata_by_text_and_mime_async),
bf8be1f
+  MAP (tracker_search_metadata_by_text_and_location_async),
bf8be1f
+  MAP (tracker_search_metadata_by_text_and_mime_and_location_async)
bf8be1f
+#undef MAP
bf8be1f
+};
bf8be1f
+
bf8be1f
+
bf8be1f
+static void 
bf8be1f
+open_libtracker (void)
bf8be1f
+{
bf8be1f
+  static gboolean done = FALSE;
bf8be1f
+
bf8be1f
+  if (!done)
bf8be1f
+    {
bf8be1f
+      int i;
bf8be1f
+      GModule *tracker;
bf8be1f
+      
bf8be1f
+      done = TRUE;
bf8be1f
+ 
c06b89b
+      tracker = g_module_open ("libtrackerclient.so.0", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
bf8be1f
+      if (!tracker)
bf8be1f
+	return;
bf8be1f
+      
bf8be1f
+      for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++)
bf8be1f
+	{
bf8be1f
+	  if (!g_module_symbol (tracker, tracker_dl_mapping[i].fn_name,
bf8be1f
+				tracker_dl_mapping[i].fn_ptr_ref))
bf8be1f
+	    {
bf8be1f
+	      g_warning ("Missing symbol '%s' in libtracker\n",
bf8be1f
+			 tracker_dl_mapping[i].fn_name);
bf8be1f
+	      g_module_close (tracker);
bf8be1f
+
bf8be1f
+	      for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++)
bf8be1f
+		tracker_dl_mapping[i].fn_ptr_ref = NULL;
bf8be1f
+
bf8be1f
+	      return;
bf8be1f
+	    }
bf8be1f
+	}
bf8be1f
+    }
bf8be1f
+}
bf8be1f
+
bf8be1f
 
bf8be1f
 struct NautilusSearchEngineTrackerDetails {
bf8be1f
 	NautilusQuery 	*query;
bf8be1f
@@ -260,6 +342,12 @@
bf8be1f
 	NautilusSearchEngineTracker *engine;
bf8be1f
 	TrackerClient *tracker_client;
bf8be1f
 
bf8be1f
+	open_libtracker ();
bf8be1f
+
bf8be1f
+	if (!tracker_connect) {
bf8be1f
+		return NULL;
bf8be1f
+	}
bf8be1f
+
bf8be1f
 	tracker_client =  tracker_connect (FALSE);
bf8be1f
 
bf8be1f
 	if (!tracker_client) {