static void finalize (GObject *object) { GtkSearchEngineTracker *tracker; tracker = GTK_SEARCH_ENGINE_TRACKER (object); if (tracker->priv->cancellable) { g_cancellable_cancel (tracker->priv->cancellable); g_object_unref (tracker->priv->cancellable); tracker->priv->cancellable = NULL; } if (tracker->priv->query) { g_object_unref (tracker->priv->query); tracker->priv->query = NULL; } if (tracker->priv->connection) { g_object_unref (tracker->priv->connection); tracker->priv->connection = NULL; } G_OBJECT_CLASS (_gtk_search_engine_tracker_parent_class)->finalize (object); }
static void cursor_callback (GObject *object, GAsyncResult *result, gpointer user_data) { GtkSearchEngineTracker *tracker; GError *error = NULL; TrackerSparqlCursor *cursor; GList *hits; gboolean success; gdk_threads_enter (); tracker = GTK_SEARCH_ENGINE_TRACKER (user_data); cursor = TRACKER_SPARQL_CURSOR (object); success = tracker_sparql_cursor_next_finish (cursor, result, &error); if (error) { _gtk_search_engine_error (GTK_SEARCH_ENGINE (tracker), error->message); g_error_free (error); if (cursor) g_object_unref (cursor); gdk_threads_leave (); return; } if (!success) { _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker)); if (cursor) g_object_unref (cursor); gdk_threads_leave (); return; } /* We iterate result by result, not n at a time. */ hits = g_list_append (NULL, (gchar*) tracker_sparql_cursor_get_string (cursor, 0, NULL)); _gtk_search_engine_hits_added (GTK_SEARCH_ENGINE (tracker), hits); g_list_free (hits); /* Get next */ cursor_next (tracker, cursor); gdk_threads_leave (); }
static void gtk_search_engine_tracker_stop (GtkSearchEngine *engine) { GtkSearchEngineTracker *tracker; tracker = GTK_SEARCH_ENGINE_TRACKER (engine); if (tracker->priv->query && tracker->priv->query_pending) { tracker_cancel_last_call (tracker->priv->client); tracker->priv->query_pending = FALSE; } }
static void gtk_search_engine_tracker_start (GtkSearchEngine *engine) { GtkSearchEngineTracker *tracker; gchar *search_text, *location, *location_uri; tracker = GTK_SEARCH_ENGINE_TRACKER (engine); if (tracker->priv->query_pending) return; if (tracker->priv->query == NULL) return; search_text = _gtk_query_get_text (tracker->priv->query); location_uri = _gtk_query_get_location (tracker->priv->query); location = NULL; if (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) { tracker_search_metadata_by_text_and_location_async (tracker->priv->client, search_text, location, search_callback, tracker); g_free (location); } else { tracker_search_metadata_by_text_async (tracker->priv->client, search_text, search_callback, tracker); } tracker->priv->query_pending = TRUE; g_free (search_text); }
static void gtk_search_engine_tracker_stop (GtkSearchEngine *engine) { GtkSearchEngineTracker *tracker; tracker = GTK_SEARCH_ENGINE_TRACKER (engine); g_debug ("Query stopping"); if (tracker->priv->query && tracker->priv->query_pending) { g_cancellable_cancel (tracker->priv->cancellable); tracker->priv->query_pending = FALSE; } }
static void gtk_search_engine_tracker_set_query (GtkSearchEngine *engine, GtkQuery *query) { GtkSearchEngineTracker *tracker; tracker = GTK_SEARCH_ENGINE_TRACKER (engine); if (query) g_object_ref (query); if (tracker->priv->query) g_object_unref (tracker->priv->query); tracker->priv->query = query; }
static void finalize (GObject *object) { GtkSearchEngineTracker *tracker; tracker = GTK_SEARCH_ENGINE_TRACKER (object); if (tracker->priv->query) { g_object_unref (tracker->priv->query); tracker->priv->query = NULL; } tracker_disconnect (tracker->priv->client); G_OBJECT_CLASS (_gtk_search_engine_tracker_parent_class)->finalize (object); }
static void search_callback (gchar **results, GError *error, gpointer user_data) { GtkSearchEngineTracker *tracker; gchar **results_p; GList *hit_uris; tracker = GTK_SEARCH_ENGINE_TRACKER (user_data); hit_uris = NULL; tracker->priv->query_pending = FALSE; if (error) { _gtk_search_engine_error ( GTK_SEARCH_ENGINE (tracker), error->message); g_error_free (error); return; } if (!results) return; for (results_p = results; *results_p; results_p++) { gchar *uri; 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_hits_added (GTK_SEARCH_ENGINE (tracker), hit_uris); _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker)); g_strfreev (results); if (tracker->priv->version == TRACKER_0_6) g_list_foreach (hit_uris, (GFunc)g_free, NULL); g_list_free (hit_uris); }
static void query_callback (GObject *object, GAsyncResult *result, gpointer user_data) { GtkSearchEngineTracker *tracker; TrackerSparqlConnection *connection; TrackerSparqlCursor *cursor; GError *error = NULL; gdk_threads_enter (); tracker = GTK_SEARCH_ENGINE_TRACKER (user_data); tracker->priv->query_pending = FALSE; connection = TRACKER_SPARQL_CONNECTION (object); cursor = tracker_sparql_connection_query_finish (connection, result, &error); g_debug ("Query returned cursor:%p", cursor); if (error) { _gtk_search_engine_error (GTK_SEARCH_ENGINE (tracker), error->message); g_error_free (error); gdk_threads_leave (); return; } if (!cursor) { _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker)); gdk_threads_leave (); return; } cursor_next (tracker, cursor); gdk_threads_leave (); }
static void gtk_search_engine_tracker_start (GtkSearchEngine *engine) { GtkSearchEngineTracker *tracker; gchar *search_text, *location_uri; GString *sparql; tracker = GTK_SEARCH_ENGINE_TRACKER (engine); if (tracker->priv->query_pending) { g_debug ("Attempt to start a new search while one is pending, doing nothing"); return; } if (tracker->priv->query == NULL) { g_debug ("Attempt to start a new search with no GtkQuery, doing nothing"); return; } search_text = _gtk_query_get_text (tracker->priv->query); location_uri = _gtk_query_get_location (tracker->priv->query); g_debug ("Query starting, search criteria:'%s', location:'%s'", search_text, location_uri); #ifdef FTS_MATCHING /* Using FTS: */ sparql = g_string_new ("SELECT nie:url(?urn) " "WHERE {" " ?urn a nfo:FileDataObject ;" " tracker:available true ; " " fts:match "); sparql_append_string_literal (sparql, search_text); if (location_uri) { g_string_append (sparql, " . FILTER (fn:starts-with(nie:url(?urn),"); sparql_append_string_literal (sparql, location_uri); g_string_append (sparql, "))"); } g_string_append (sparql, " } ORDER BY DESC(fts:rank(?urn)) ASC(nie:url(?urn))"); #else /* FTS_MATCHING */ /* Using filename matching: */ sparql = g_string_new ("SELECT nie:url(?urn) " "WHERE {" " ?urn a nfo:FileDataObject ;" " tracker:available true ." " FILTER (fn:contains(nfo:fileName(?urn),"); sparql_append_string_literal (sparql, search_text); g_string_append (sparql, "))" "} ORDER BY DESC(nie:url(?urn)) DESC(nfo:fileName(?urn))"); #endif /* FTS_MATCHING */ tracker_sparql_connection_query_async (tracker->priv->connection, sparql->str, tracker->priv->cancellable, query_callback, tracker); g_string_free (sparql, TRUE); tracker->priv->query_pending = TRUE; g_free (search_text); }