summaryrefslogtreecommitdiff
path: root/src/nautilus-search-engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-search-engine.c')
-rw-r--r--src/nautilus-search-engine.c232
1 files changed, 166 insertions, 66 deletions
diff --git a/src/nautilus-search-engine.c b/src/nautilus-search-engine.c
index 209bd4f80..64cf6702e 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;
-}