diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-18 14:35:23 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-18 15:07:18 -0400 |
commit | a36dc6aefac077354fbea2145e9e5a61c46ce740 (patch) | |
tree | 22a085859e0709bc49889e44fa7d62ee0f22d01e | |
parent | 546184ca418672533504c4121bd681fb547d2e01 (diff) | |
download | nautilus-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.c | 73 |
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; |