typedef struct _TrackerClient TrackerClient;
+typedef enum
+{
+ TRACKER_0_6 = 1 << 0,
+ TRACKER_0_7 = 1 << 1
+} TrackerVersion;
+
typedef void (*TrackerArrayReply) (char **result, GError *error, gpointer user_data);
-static TrackerClient * (*tracker_connect) (gboolean enable_warnings) = NULL;
+static TrackerClient * (*tracker_connect) (gboolean enable_warnings, gint timeout) = NULL;
static void (*tracker_disconnect) (TrackerClient *client) = NULL;
static int (*tracker_get_version) (TrackerClient *client, GError **error) = NULL;
static void (*tracker_cancel_last_call) (TrackerClient *client) = NULL;
{
const char *fn_name;
gpointer *fn_ptr_ref;
+ TrackerVersion versions;
} tracker_dl_mapping[] =
{
-#define MAP(a) { #a, (gpointer *)&a }
- MAP (tracker_connect),
- MAP (tracker_disconnect),
- MAP (tracker_get_version),
- MAP (tracker_cancel_last_call),
- MAP (tracker_search_metadata_by_text_async),
- MAP (tracker_search_metadata_by_text_and_location_async),
+#define MAP(a,v) { #a, (gpointer *)&a, v }
+ MAP (tracker_connect, TRACKER_0_6 | TRACKER_0_7),
+ MAP (tracker_disconnect, TRACKER_0_6 | TRACKER_0_7),
+ MAP (tracker_get_version, TRACKER_0_6),
+ MAP (tracker_cancel_last_call, TRACKER_0_6 | TRACKER_0_7),
+ MAP (tracker_search_metadata_by_text_async, TRACKER_0_6 | TRACKER_0_7),
+ MAP (tracker_search_metadata_by_text_and_location_async, TRACKER_0_6 | TRACKER_0_7),
#undef MAP
};
-static void
+static TrackerVersion
open_libtracker (void)
{
static gboolean done = FALSE;
+ static TrackerVersion version = 0;
if (!done)
{
done = TRUE;
flags = G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL;
- tracker = g_module_open ("libtrackerclient.so.0", flags);
+ tracker = g_module_open ("libtracker-client-0.7.so.0", flags);
+ version = TRACKER_0_7;
+
+ if (!tracker)
+ {
+ tracker = g_module_open ("libtrackerclient.so.0", flags);
+ version = TRACKER_0_6;
+ }
if (!tracker)
- tracker = g_module_open ("libtracker.so.0", flags);
+ {
+ tracker = g_module_open ("libtracker.so.0", flags);
+ version = TRACKER_0_6;
+ }
if (!tracker)
- return;
+ return 0;
for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++)
{
+ if ((tracker_dl_mapping[i].versions & version) == 0)
+ continue;
+
if (!g_module_symbol (tracker, tracker_dl_mapping[i].fn_name,
tracker_dl_mapping[i].fn_ptr_ref))
{
for (i = 0; i < G_N_ELEMENTS (tracker_dl_mapping); i++)
tracker_dl_mapping[i].fn_ptr_ref = NULL;
- return;
+ return 0;
}
}
}
+
+ return version;
}
struct _GtkSearchEngineTrackerPrivate
GtkQuery *query;
TrackerClient *client;
gboolean query_pending;
+ TrackerVersion version;
};
G_DEFINE_TYPE (GtkSearchEngineTracker, _gtk_search_engine_tracker, GTK_TYPE_SEARCH_ENGINE);
{
gchar *uri;
- uri = g_filename_to_uri (*results_p, NULL, NULL);
+ if (tracker->priv->version == TRACKER_0_6)
+ uri = g_filename_to_uri (*results_p, NULL, NULL);
+ else
+ uri = *results_p;
+
if (uri)
hit_uris = g_list_prepend (hit_uris, uri);
}
_gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker));
g_strfreev (results);
- g_list_foreach (hit_uris, (GFunc)g_free, NULL);
+ if (tracker->priv->version == TRACKER_0_6)
+ g_list_foreach (hit_uris, (GFunc)g_free, NULL);
g_list_free (hit_uris);
}
location = NULL;
if (location_uri)
{
- location = g_filename_from_uri (location_uri, NULL, NULL);
- g_free (location_uri);
- }
+ if (tracker->priv->version == TRACKER_0_6)
+ {
+ location = g_filename_from_uri (location_uri, NULL, NULL);
+ g_free (location_uri);
+ }
+ else
+ location = location_uri;
+ }
if (location)
{
{
GtkSearchEngineTracker *engine;
TrackerClient *tracker_client;
+ TrackerVersion version;
GError *err = NULL;
- open_libtracker ();
+ version = open_libtracker ();
if (!tracker_connect)
return NULL;
- tracker_client = tracker_connect (FALSE);
+ tracker_client = tracker_connect (FALSE, -1);
if (!tracker_client)
return NULL;
- if (!tracker_get_version)
- return NULL;
+ if (version == TRACKER_0_6)
+ {
+ if (!tracker_get_version)
+ return NULL;
- tracker_get_version (tracker_client, &err);
+ tracker_get_version (tracker_client, &err);
- if (err != NULL)
- {
- g_error_free (err);
- tracker_disconnect (tracker_client);
- return NULL;
+ if (err != NULL)
+ {
+ g_error_free (err);
+ tracker_disconnect (tracker_client);
+ return NULL;
+ }
}
engine = g_object_new (GTK_TYPE_SEARCH_ENGINE_TRACKER, NULL);
engine->priv->client = tracker_client;
engine->priv->query_pending = FALSE;
+ engine->priv->version = version;
return GTK_SEARCH_ENGINE (engine);
}