[nautilus] search-engine: fix search providers handling



commit 37693c427941d60634bad80dd7c2d0b3a8523cea
Author: Alexandru Pandelea <alexandru pandelea gmail com>
Date:   Wed Aug 2 10:54:25 2017 +0100

    search-engine: fix search providers handling
    
    When starting the search providers, some provider might finish
    before all providers are started, so a wrong value of providers_running
    will be used, making Nautilus crash.
    
    To fix this, keep a queue of the started providers and whenever the
    value of the finised/running providers is needed, check the status of
    each provider.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=785723

 src/nautilus-search-directory.c      |    9 +-
 src/nautilus-search-engine-model.c   |   18 ++-
 src/nautilus-search-engine-model.h   |    1 -
 src/nautilus-search-engine-simple.c  |   11 ++
 src/nautilus-search-engine-tracker.c |   12 ++
 src/nautilus-search-engine.c         |  232 ++++++++++++++++++++++++----------
 src/nautilus-search-engine.h         |   10 +-
 src/nautilus-search-provider.c       |    9 ++
 src/nautilus-search-provider.h       |    2 +
 test/test-nautilus-search-engine.c   |    4 +-
 10 files changed, 220 insertions(+), 88 deletions(-)
---
diff --git a/src/nautilus-search-directory.c b/src/nautilus-search-directory.c
index 6692a41..ab3debd 100644
--- a/src/nautilus-search-directory.c
+++ b/src/nautilus-search-directory.c
@@ -173,8 +173,6 @@ set_hidden_files (NautilusSearchDirectory *search)
 static void
 start_search (NautilusSearchDirectory *search)
 {
-    NautilusSearchEngineModel *model_provider;
-    NautilusSearchEngineSimple *simple_provider;
     gboolean recursive;
 
     if (!search->details->query)
@@ -200,12 +198,11 @@ start_search (NautilusSearchDirectory *search)
     nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (search->details->engine),
                                         search->details->query);
 
-    model_provider = nautilus_search_engine_get_model_provider (search->details->engine);
-    nautilus_search_engine_model_set_model (model_provider, search->details->base_model);
+    nautilus_search_engine_set_model (search->details->engine,
+                                      search->details->base_model);
 
-    simple_provider = nautilus_search_engine_get_simple_provider (search->details->engine);
     recursive = nautilus_query_get_recursive (search->details->query);
-    g_object_set (simple_provider, "recursive", recursive, NULL);
+    g_object_set (search->details->engine, "recursive", recursive, NULL);
 
     reset_file_list (search);
 
diff --git a/src/nautilus-search-engine-model.c b/src/nautilus-search-engine-model.c
index b8f2a94..c77a2c1 100644
--- a/src/nautilus-search-engine-model.c
+++ b/src/nautilus-search-engine-model.c
@@ -280,6 +280,17 @@ nautilus_search_engine_model_is_running (NautilusSearchProvider *provider)
     return model->details->query_pending;
 }
 
+static gboolean
+nautilus_search_engine_model_is_finished (NautilusSearchProvider *provider)
+{
+    NautilusSearchEngineModel *model;
+
+    model = NAUTILUS_SEARCH_ENGINE_MODEL (provider);
+
+    return !model->details->query_pending;
+}
+
+
 static void
 nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
 {
@@ -287,6 +298,7 @@ nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
     iface->start = nautilus_search_engine_model_start;
     iface->stop = nautilus_search_engine_model_stop;
     iface->is_running = nautilus_search_engine_model_is_running;
+    iface->is_finished = nautilus_search_engine_model_is_finished;
 }
 
 static void
@@ -353,9 +365,3 @@ nautilus_search_engine_model_set_model (NautilusSearchEngineModel *model,
     g_clear_object (&model->details->directory);
     model->details->directory = nautilus_directory_ref (directory);
 }
-
-NautilusDirectory *
-nautilus_search_engine_model_get_model (NautilusSearchEngineModel *model)
-{
-    return model->details->directory;
-}
diff --git a/src/nautilus-search-engine-model.h b/src/nautilus-search-engine-model.h
index 16f3388..0b6dee3 100644
--- a/src/nautilus-search-engine-model.h
+++ b/src/nautilus-search-engine-model.h
@@ -47,6 +47,5 @@ GType          nautilus_search_engine_model_get_type  (void);
 NautilusSearchEngineModel* nautilus_search_engine_model_new       (void);
 void                       nautilus_search_engine_model_set_model (NautilusSearchEngineModel *model,
                                                                   NautilusDirectory         *directory);
-NautilusDirectory *        nautilus_search_engine_model_get_model (NautilusSearchEngineModel *model);
 
 #endif /* NAUTILUS_SEARCH_ENGINE_MODEL_H */
diff --git a/src/nautilus-search-engine-simple.c b/src/nautilus-search-engine-simple.c
index ea2dbe3..1e0549b 100644
--- a/src/nautilus-search-engine-simple.c
+++ b/src/nautilus-search-engine-simple.c
@@ -453,6 +453,16 @@ nautilus_search_engine_simple_is_running (NautilusSearchProvider *provider)
     return simple->active_search != NULL;
 }
 
+static gboolean
+nautilus_search_engine_simple_is_finished (NautilusSearchProvider *provider)
+{
+    NautilusSearchEngineSimple *simple;
+
+    simple = NAUTILUS_SEARCH_ENGINE_SIMPLE (provider);
+
+    return simple->active_search == NULL;
+}
+
 static void
 nautilus_search_engine_simple_set_property (GObject      *object,
                                             guint         arg_id,
@@ -508,6 +518,7 @@ nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
     iface->start = nautilus_search_engine_simple_start;
     iface->stop = nautilus_search_engine_simple_stop;
     iface->is_running = nautilus_search_engine_simple_is_running;
+    iface->is_finished = nautilus_search_engine_simple_is_finished;
 }
 
 static void
diff --git a/src/nautilus-search-engine-tracker.c b/src/nautilus-search-engine-tracker.c
index b868dbf..3ca7f40 100644
--- a/src/nautilus-search-engine-tracker.c
+++ b/src/nautilus-search-engine-tracker.c
@@ -485,6 +485,17 @@ nautilus_search_engine_tracker_is_running (NautilusSearchProvider *provider)
     return tracker->details->query_pending;
 }
 
+static gboolean
+nautilus_search_engine_tracker_is_finished (NautilusSearchProvider *provider)
+{
+    NautilusSearchEngineTracker *tracker;
+
+    tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
+
+    return !tracker->details->query_pending;
+}
+
+
 static void
 nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
 {
@@ -492,6 +503,7 @@ nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
     iface->start = nautilus_search_engine_tracker_start;
     iface->stop = nautilus_search_engine_tracker_stop;
     iface->is_running = nautilus_search_engine_tracker_is_running;
+    iface->is_finished = nautilus_search_engine_tracker_is_finished;
 }
 
 static void
diff --git a/src/nautilus-search-engine.c b/src/nautilus-search-engine.c
index 209bd4f..64cf670 100644
--- a/src/nautilus-search-engine.c
+++ b/src/nautilus-search-engine.c
@@ -32,22 +32,23 @@
 
 typedef struct
 {
-    NautilusSearchEngineTracker *tracker;
-    NautilusSearchEngineSimple *simple;
-    NautilusSearchEngineModel *model;
+    GQueue *providers;
 
     GHashTable *uris;
-    guint providers_running;
-    guint providers_finished;
     guint providers_error;
 
     gboolean running;
     gboolean restart;
+
+    NautilusDirectory *directory;
+    NautilusQuery *query;
+    gboolean recursive;
 } NautilusSearchEnginePrivate;
 
 enum
 {
     PROP_0,
+    PROP_RECURSIVE,
     PROP_RUNNING,
     LAST_PROP
 };
@@ -56,6 +57,12 @@ static void nautilus_search_provider_init (NautilusSearchProviderInterface *ifac
 
 static gboolean nautilus_search_engine_is_running (NautilusSearchProvider *provider);
 
+static void connect_provider_signals (NautilusSearchEngine   *engine,
+                                      NautilusSearchProvider *provider);
+
+static void disconnect_provider_signals (NautilusSearchEngine   *engine,
+                                         NautilusSearchProvider *provider);
+
 G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngine,
                          nautilus_search_engine,
                          G_TYPE_OBJECT,
@@ -64,6 +71,35 @@ G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngine,
                                                 nautilus_search_provider_init))
 
 static void
+clear_providers_queue (NautilusSearchEngine *engine)
+{
+    NautilusSearchEnginePrivate *priv;
+    GList *l;
+
+    priv = nautilus_search_engine_get_instance_private (engine);
+
+    for (l = g_queue_peek_head_link (priv->providers); l != NULL; l = l->next)
+    {
+        disconnect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (l->data));
+        g_clear_object (&l->data);
+    }
+
+    g_queue_clear (priv->providers);
+}
+
+void
+nautilus_search_engine_set_model (NautilusSearchEngine *engine,
+                                  NautilusDirectory    *directory)
+{
+    NautilusSearchEnginePrivate *priv;
+
+    priv = nautilus_search_engine_get_instance_private (engine);
+
+    g_clear_object (&priv->directory);
+    priv->directory = g_object_ref (directory);
+}
+
+static void
 nautilus_search_engine_set_query (NautilusSearchProvider *provider,
                                   NautilusQuery          *query)
 {
@@ -73,20 +109,41 @@ nautilus_search_engine_set_query (NautilusSearchProvider *provider,
     engine = NAUTILUS_SEARCH_ENGINE (provider);
     priv = nautilus_search_engine_get_instance_private (engine);
 
-    nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (priv->tracker), query);
-    nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (priv->model), query);
-    nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (priv->simple), query);
+    g_object_ref (query);
+    g_clear_object (&priv->query);
+    priv->query = query;
 }
 
 static void
 search_engine_start_real (NautilusSearchEngine *engine)
 {
     NautilusSearchEnginePrivate *priv;
+    NautilusSearchEngineTracker *tracker;
+    NautilusSearchEngineSimple *simple;
+    NautilusSearchEngineModel *model;
+    GList *l;
 
     priv = nautilus_search_engine_get_instance_private (engine);
 
-    priv->providers_running = 0;
-    priv->providers_finished = 0;
+    clear_providers_queue (engine);
+
+    tracker = nautilus_search_engine_tracker_new ();
+    g_queue_push_head (priv->providers, tracker);
+    connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (tracker));
+
+    simple = nautilus_search_engine_simple_new ();
+    connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (simple));
+    g_object_set (simple, "recursive", priv->recursive, NULL);
+    g_queue_push_head (priv->providers, simple);
+
+    if (priv->directory)
+    {
+        model = nautilus_search_engine_model_new ();
+        connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (model));
+        nautilus_search_engine_model_set_model (model, priv->directory);
+        g_queue_push_head (priv->providers, model);
+    }
+
     priv->providers_error = 0;
 
     priv->restart = FALSE;
@@ -95,17 +152,12 @@ search_engine_start_real (NautilusSearchEngine *engine)
 
     g_object_ref (engine);
 
-    nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (priv->tracker));
-    priv->providers_running++;
-
-    if (nautilus_search_engine_model_get_model (priv->model))
+    for (l = g_queue_peek_head_link (priv->providers); l != NULL; l = l->next)
     {
-        nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (priv->model));
-        priv->providers_running++;
+        nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (l->data),
+                                            priv->query);
+        nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (l->data));
     }
-
-    nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (priv->simple));
-    priv->providers_running++;
 }
 
 static void
@@ -113,18 +165,23 @@ nautilus_search_engine_start (NautilusSearchProvider *provider)
 {
     NautilusSearchEngine *engine;
     NautilusSearchEnginePrivate *priv;
-    gint num_finished;
+    gboolean all_providers_finished;
+    GList *l;
 
     engine = NAUTILUS_SEARCH_ENGINE (provider);
     priv = nautilus_search_engine_get_instance_private (engine);
 
     DEBUG ("Search engine start");
 
-    num_finished = priv->providers_error + priv->providers_finished;
+    all_providers_finished = TRUE;
+    for (l = g_queue_peek_head_link (priv->providers); l != NULL; l = l->next)
+    {
+        all_providers_finished &= nautilus_search_provider_is_finished (NAUTILUS_SEARCH_PROVIDER (l->data));
+    }
 
     if (priv->running)
     {
-        if (num_finished == priv->providers_running &&
+        if (all_providers_finished &&
             priv->restart)
         {
             search_engine_start_real (engine);
@@ -137,7 +194,7 @@ nautilus_search_engine_start (NautilusSearchProvider *provider)
 
     g_object_notify (G_OBJECT (provider), "running");
 
-    if (num_finished < priv->providers_running)
+    if (!all_providers_finished)
     {
         priv->restart = TRUE;
     }
@@ -152,15 +209,17 @@ nautilus_search_engine_stop (NautilusSearchProvider *provider)
 {
     NautilusSearchEngine *engine;
     NautilusSearchEnginePrivate *priv;
+    GList *l;
 
     engine = NAUTILUS_SEARCH_ENGINE (provider);
     priv = nautilus_search_engine_get_instance_private (engine);
 
     DEBUG ("Search engine stop");
 
-    nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (priv->tracker));
-    nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (priv->model));
-    nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (priv->simple));
+    for (l = g_queue_peek_head_link (priv->providers); l != NULL; l = l->next)
+    {
+        nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (l->data));
+    }
 
     priv->running = FALSE;
     priv->restart = FALSE;
@@ -212,17 +271,23 @@ static void
 check_providers_status (NautilusSearchEngine *engine)
 {
     NautilusSearchEnginePrivate *priv;
-    gint num_finished;
+    gboolean all_providers_finished;
+    GList *l;
 
     priv = nautilus_search_engine_get_instance_private (engine);
-    num_finished = priv->providers_error + priv->providers_finished;
 
-    if (num_finished < priv->providers_running)
+    all_providers_finished = TRUE;
+    for (l = g_queue_peek_head_link (priv->providers); l != NULL; l = l->next)
+    {
+        all_providers_finished &= nautilus_search_provider_is_finished (NAUTILUS_SEARCH_PROVIDER (l->data));
+    }
+
+    if (!all_providers_finished)
     {
         return;
     }
 
-    if (num_finished == priv->providers_error)
+    if (g_queue_get_length (priv->providers) == priv->providers_error)
     {
         DEBUG ("Search engine error");
         nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (engine),
@@ -276,13 +341,8 @@ search_provider_finished (NautilusSearchProvider       *provider,
                           NautilusSearchProviderStatus  status,
                           NautilusSearchEngine         *engine)
 {
-    NautilusSearchEnginePrivate *priv;
-
     DEBUG ("Search provider finished");
 
-    priv = nautilus_search_engine_get_instance_private (engine);
-    priv->providers_finished++;
-
     check_providers_status (engine);
 }
 
@@ -301,6 +361,21 @@ connect_provider_signals (NautilusSearchEngine   *engine,
                       engine);
 }
 
+static void
+disconnect_provider_signals (NautilusSearchEngine   *engine,
+                             NautilusSearchProvider *provider)
+{
+    g_signal_handlers_disconnect_by_func (provider,
+                                          search_provider_hits_added,
+                                          engine);
+    g_signal_handlers_disconnect_by_func (provider,
+                                          search_provider_finished,
+                                          engine);
+    g_signal_handlers_disconnect_by_func (provider,
+                                          search_provider_error,
+                                          engine);
+}
+
 static gboolean
 nautilus_search_engine_is_running (NautilusSearchProvider *provider)
 {
@@ -333,9 +408,11 @@ nautilus_search_engine_finalize (GObject *object)
 
     g_hash_table_destroy (priv->uris);
 
-    g_clear_object (&priv->tracker);
-    g_clear_object (&priv->model);
-    g_clear_object (&priv->simple);
+    clear_providers_queue (engine);
+    g_queue_free (priv->providers);
+
+    g_clear_object (&priv->directory);
+    g_clear_object (&priv->query);
 
     G_OBJECT_CLASS (nautilus_search_engine_parent_class)->finalize (object);
 }
@@ -346,8 +423,11 @@ nautilus_search_engine_get_property (GObject    *object,
                                      GValue     *value,
                                      GParamSpec *pspec)
 {
+    NautilusSearchEnginePrivate *priv;
     NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
 
+    priv = nautilus_search_engine_get_instance_private (NAUTILUS_SEARCH_ENGINE (self));
+
     switch (prop_id)
     {
         case PROP_RUNNING:
@@ -356,12 +436,45 @@ nautilus_search_engine_get_property (GObject    *object,
         }
         break;
 
+        case PROP_RECURSIVE:
+        {
+            g_value_set_boolean (value, priv->recursive);
+        }
+        break;
+
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
 }
 
 static void
+nautilus_search_engine_set_property (GObject      *object,
+                                     guint         arg_id,
+                                     const GValue *value,
+                                     GParamSpec   *pspec)
+{
+    NautilusSearchEnginePrivate *priv;
+    NautilusSearchEngine *engine = NAUTILUS_SEARCH_ENGINE (object);
+
+    priv = nautilus_search_engine_get_instance_private (NAUTILUS_SEARCH_ENGINE (engine));
+
+    switch (arg_id)
+    {
+        case PROP_RECURSIVE:
+        {
+            priv->recursive = g_value_get_boolean (value);
+        }
+        break;
+
+        default:
+        {
+            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, arg_id, pspec);
+        }
+        break;
+    }
+}
+
+static void
 nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
 {
     GObjectClass *object_class;
@@ -370,6 +483,20 @@ nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
 
     object_class->finalize = nautilus_search_engine_finalize;
     object_class->get_property = nautilus_search_engine_get_property;
+    object_class->set_property = nautilus_search_engine_set_property;
+
+    /**
+     * NautilusSearchEngine::recursive:
+     *
+     * Whether the search is recursive or not.
+     */
+    g_object_class_install_property (object_class,
+                                     PROP_RECURSIVE,
+                                     g_param_spec_boolean ("recursive",
+                                                           "recursive",
+                                                           "recursive",
+                                                           FALSE,
+                                                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT | 
G_PARAM_STATIC_STRINGS));
 
     /**
      * NautilusSearchEngine::running:
@@ -387,14 +514,7 @@ nautilus_search_engine_init (NautilusSearchEngine *engine)
     priv = nautilus_search_engine_get_instance_private (engine);
     priv->uris = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 
-    priv->tracker = nautilus_search_engine_tracker_new ();
-    connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (priv->tracker));
-
-    priv->model = nautilus_search_engine_model_new ();
-    connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (priv->model));
-
-    priv->simple = nautilus_search_engine_simple_new ();
-    connect_provider_signals (engine, NAUTILUS_SEARCH_PROVIDER (priv->simple));
+    priv->providers = g_queue_new ();
 }
 
 NautilusSearchEngine *
@@ -406,23 +526,3 @@ nautilus_search_engine_new (void)
 
     return engine;
 }
-
-NautilusSearchEngineModel *
-nautilus_search_engine_get_model_provider (NautilusSearchEngine *engine)
-{
-    NautilusSearchEnginePrivate *priv;
-
-    priv = nautilus_search_engine_get_instance_private (engine);
-
-    return priv->model;
-}
-
-NautilusSearchEngineSimple *
-nautilus_search_engine_get_simple_provider (NautilusSearchEngine *engine)
-{
-    NautilusSearchEnginePrivate *priv;
-
-    priv = nautilus_search_engine_get_instance_private (engine);
-
-    return priv->simple;
-}
diff --git a/src/nautilus-search-engine.h b/src/nautilus-search-engine.h
index 0416e83..93892a2 100644
--- a/src/nautilus-search-engine.h
+++ b/src/nautilus-search-engine.h
@@ -30,7 +30,7 @@
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_SEARCH_ENGINE            (nautilus_search_engine_get_type ())
+#define NAUTILUS_TYPE_SEARCH_ENGINE     (nautilus_search_engine_get_type ())
 
 G_DECLARE_DERIVABLE_TYPE (NautilusSearchEngine, nautilus_search_engine, NAUTILUS, SEARCH_ENGINE, GObject)
 
@@ -39,11 +39,9 @@ struct _NautilusSearchEngineClass
   GObjectClass parent_class;
 };
 
-NautilusSearchEngine *nautilus_search_engine_new                (void);
-NautilusSearchEngineModel *
-                      nautilus_search_engine_get_model_provider (NautilusSearchEngine *engine);
-NautilusSearchEngineSimple *
-                      nautilus_search_engine_get_simple_provider (NautilusSearchEngine *engine);
+NautilusSearchEngine *nautilus_search_engine_new (void);
+void nautilus_search_engine_set_model            (NautilusSearchEngine *engine,
+                                                  NautilusDirectory    *directory);
 
 G_END_DECLS
 
diff --git a/src/nautilus-search-provider.c b/src/nautilus-search-provider.c
index 9a4a655..572e34d 100644
--- a/src/nautilus-search-provider.c
+++ b/src/nautilus-search-provider.c
@@ -143,3 +143,12 @@ nautilus_search_provider_is_running (NautilusSearchProvider *provider)
 
     return NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_running (provider);
 }
+
+gboolean
+nautilus_search_provider_is_finished (NautilusSearchProvider *provider)
+{
+    g_return_val_if_fail (NAUTILUS_IS_SEARCH_PROVIDER (provider), FALSE);
+    g_return_val_if_fail (NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_finished, FALSE);
+
+    return NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_finished (provider);
+}
diff --git a/src/nautilus-search-provider.h b/src/nautilus-search-provider.h
index d019c66..b0c2a69 100644
--- a/src/nautilus-search-provider.h
+++ b/src/nautilus-search-provider.h
@@ -73,6 +73,7 @@ struct _NautilusSearchProviderInterface {
                           NautilusSearchProviderStatus  status);
         void (*error) (NautilusSearchProvider *provider, const char *error_message);
         gboolean (*is_running) (NautilusSearchProvider *provider);
+        gboolean (*is_finished) (NautilusSearchProvider *provider);
 };
 
 GType          nautilus_search_provider_get_type        (void) G_GNUC_CONST;
@@ -91,6 +92,7 @@ void           nautilus_search_provider_error           (NautilusSearchProvider
                                                          const char *error_message);
 
 gboolean       nautilus_search_provider_is_running      (NautilusSearchProvider *provider);
+gboolean       nautilus_search_provider_is_finished     (NautilusSearchProvider *provider);
 
 G_END_DECLS
 
diff --git a/test/test-nautilus-search-engine.c b/test/test-nautilus-search-engine.c
index 2ed8af7..fa30f35 100644
--- a/test/test-nautilus-search-engine.c
+++ b/test/test-nautilus-search-engine.c
@@ -28,7 +28,6 @@ main (int   argc,
       char *argv[])
 {
     NautilusSearchEngine *engine;
-    NautilusSearchEngineModel *model;
     NautilusDirectory *directory;
     NautilusQuery *query;
     GFile *location;
@@ -52,8 +51,7 @@ main (int   argc,
     directory = nautilus_directory_get (location);
     g_object_unref (location);
 
-    model = nautilus_search_engine_get_model_provider (engine);
-    nautilus_search_engine_model_set_model (model, directory);
+    nautilus_search_engine_set_model (engine, directory);
     g_object_unref (directory);
 
     nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (engine));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]