summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-18 14:35:23 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-18 15:07:18 -0400
commita36dc6aefac077354fbea2145e9e5a61c46ce740 (patch)
tree22a085859e0709bc49889e44fa7d62ee0f22d01e
parent546184ca418672533504c4121bd681fb547d2e01 (diff)
downloadnautilus-a36dc6aefac077354fbea2145e9e5a61c46ce740.tar.gz
search-engine-tracker: refactor search completion notification
Keep a ref to the engine while the async search is in progress. This is what all the other engines do, and not doing it causes problems when cancelling the operation. While we're at it, also refactor the completion notification code in a single function. https://bugzilla.gnome.org/show_bug.cgi?id=686168
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.c73
1 files changed, 38 insertions, 35 deletions
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c
index ae3f2ecdb..0d5469b0e 100644
--- a/libnautilus-private/nautilus-search-engine-tracker.c
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -89,6 +89,28 @@ check_pending_hits (NautilusSearchEngineTracker *tracker,
g_list_free_full (hits, g_object_unref);
}
+static void
+search_finished (NautilusSearchEngineTracker *tracker,
+ GError *error)
+{
+ if (error == NULL) {
+ check_pending_hits (tracker, TRUE);
+ } else {
+ g_queue_foreach (tracker->details->hits_pending, (GFunc) g_object_unref, NULL);
+ g_queue_clear (tracker->details->hits_pending);
+ }
+
+ tracker->details->query_pending = FALSE;
+
+ if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (tracker), error->message);
+ } else {
+ nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (tracker));
+ }
+
+ g_object_unref (tracker);
+}
+
static void cursor_callback (GObject *object,
GAsyncResult *result,
gpointer user_data);
@@ -117,34 +139,19 @@ cursor_callback (GObject *object,
const char *atime_str;
GTimeVal tv;
gdouble rank, match;
- gboolean success, has_error;
+ gboolean success;
gchar *basename;
tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (user_data);
cursor = TRACKER_SPARQL_CURSOR (object);
- has_error = FALSE;
success = tracker_sparql_cursor_next_finish (cursor, result, &error);
- if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (tracker), error->message);
- has_error = TRUE;
- }
-
- g_clear_error (&error);
-
if (!success) {
- if (!has_error) {
- check_pending_hits (tracker, TRUE);
- } else {
- g_queue_foreach (tracker->details->hits_pending,
- (GFunc) g_object_unref, NULL);
- g_queue_clear (tracker->details->hits_pending);
- }
+ search_finished (tracker, error);
- tracker->details->query_pending = FALSE;
- nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (tracker));
- g_object_unref (cursor);
+ g_clear_error (&error);
+ g_clear_object (&cursor);
return;
}
@@ -202,26 +209,20 @@ query_callback (GObject *object,
result,
&error);
- if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (tracker), error->message);
- }
-
- g_clear_error (&error);
-
- if (!cursor) {
- tracker->details->query_pending = FALSE;
- nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (tracker));
- return;
+ if (error != NULL) {
+ search_finished (tracker, error);
+ g_error_free (error);
+ } else {
+ cursor_next (tracker, cursor);
}
-
- cursor_next (tracker, cursor);
}
static gboolean
search_finished_idle (gpointer user_data)
{
- NautilusSearchProvider *provider = user_data;
- nautilus_search_provider_finished (provider);
+ NautilusSearchEngineTracker *tracker = user_data;
+
+ search_finished (tracker, NULL);
return FALSE;
}
@@ -241,6 +242,9 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
return;
}
+ g_object_ref (tracker);
+ tracker->details->query_pending = TRUE;
+
if (tracker->details->connection == NULL) {
g_idle_add (search_finished_idle, provider);
return;
@@ -289,7 +293,6 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append (sparql, ")} ORDER BY DESC (fts:rank(?urn))");
tracker->details->cancellable = g_cancellable_new ();
- tracker->details->query_pending = TRUE;
tracker_sparql_connection_query_async (tracker->details->connection,
sparql->str,
tracker->details->cancellable,
@@ -309,7 +312,7 @@ nautilus_search_engine_tracker_stop (NautilusSearchProvider *provider)
tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
- if (tracker->details->query && tracker->details->query_pending) {
+ if (tracker->details->query_pending) {
g_cancellable_cancel (tracker->details->cancellable);
g_clear_object (&tracker->details->cancellable);
tracker->details->query_pending = FALSE;