summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-10-06 07:09:11 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2016-01-17 14:59:20 -0200
commit515f51e18ef3b67e6b23669975eced1980651152 (patch)
treec93e516196adc771a4c5e0de974cb05aa9e1290a
parentc98a07508cdfc814dbb9a0c35675cb61d34a07a8 (diff)
downloadnautilus-wip/gbsneto/search-popover.tar.gz
search-engines: adapt to the new search modelwip/gbsneto/search-popover
The search engines currently aren't able to perform searches against modification or access times. Also, exposes the current operation status, i.e. whether it's running or not. This commit implements it for simple, model & tracker search engines.
-rw-r--r--libnautilus-private/nautilus-search-directory.c14
-rw-r--r--libnautilus-private/nautilus-search-engine-model.c98
-rw-r--r--libnautilus-private/nautilus-search-engine-simple.c72
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.c77
-rw-r--r--libnautilus-private/nautilus-search-engine.c55
-rw-r--r--libnautilus-private/nautilus-search-provider.c65
-rw-r--r--libnautilus-private/nautilus-search-provider.h14
7 files changed, 328 insertions, 67 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index f861906dd..dcda82c70 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -65,6 +65,8 @@ struct NautilusSearchDirectoryDetails {
GList *callback_list;
GList *pending_callback_list;
+ GBinding *binding;
+
NautilusDirectory *base_model;
};
@@ -918,18 +920,26 @@ nautilus_search_directory_set_query (NautilusSearchDirectory *search,
old_query = search->details->query;
- if (g_set_object (&search->details->query, query)) {
+ if (search->details->query != query) {
+ search->details->query = query;
+
+ g_clear_pointer (&search->details->binding, g_binding_unbind);
+
/* Disconnect from the previous query changes */
if (old_query) {
g_signal_handlers_disconnect_by_func (old_query, search_force_reload, search);
}
if (query) {
+ search->details->binding = g_object_bind_property (search->details->engine, "running",
+ query, "searching",
+ G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
g_signal_connect_swapped (query, "notify", G_CALLBACK (search_force_reload), search);
}
-
g_object_notify_by_pspec (G_OBJECT (search), properties[PROP_QUERY]);
+
+ g_clear_object (&old_query);
}
file = nautilus_directory_get_existing_corresponding_file (NAUTILUS_DIRECTORY (search));
diff --git a/libnautilus-private/nautilus-search-engine-model.c b/libnautilus-private/nautilus-search-engine-model.c
index 4dfb5ebd0..a6542af9b 100644
--- a/libnautilus-private/nautilus-search-engine-model.c
+++ b/libnautilus-private/nautilus-search-engine-model.c
@@ -45,7 +45,13 @@ struct NautilusSearchEngineModelDetails {
guint finished_id;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineModel,
nautilus_search_engine_model,
@@ -90,6 +96,9 @@ search_finished (NautilusSearchEngineModel *model)
}
model->details->query_pending = FALSE;
+
+ g_object_notify (G_OBJECT (model), "running");
+
DEBUG ("Model engine finished");
nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (model),
NAUTILUS_SEARCH_PROVIDER_STATUS_NORMAL);
@@ -120,9 +129,11 @@ model_directory_ready_cb (NautilusDirectory *directory,
gdouble match;
gboolean found;
NautilusSearchHit *hit;
+ GDateTime *dt;
files = nautilus_directory_get_file_list (directory);
mime_types = nautilus_query_get_mime_types (model->details->query);
+ dt = nautilus_query_get_date (model->details->query);
hits = NULL;
for (l = files; l != NULL; l = l->next) {
@@ -143,9 +154,53 @@ model_directory_ready_cb (NautilusDirectory *directory,
}
}
+ if (found && dt != NULL) {
+ NautilusQuerySearchType type;
+ guint64 query_time, current_file_time;
+ const gchar *attrib;
+ GFileInfo *info;
+ GError *error;
+ GFile *location;
+
+ g_message ("searching for date %s", g_date_time_format (dt, "%X"));
+
+ type = nautilus_query_get_search_type (model->details->query);
+ location = nautilus_file_get_location (file);
+ error = NULL;
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ query_time = g_date_time_to_unix (dt);
+
+ /* Query current file's attribute */
+ info = g_file_query_info (location,
+ attrib,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL,
+ &error);
+
+ if (error) {
+ /* Silently ignore errors */
+ g_clear_error (&error);
+ found = FALSE;
+ } else {
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+ found = (query_time <= current_file_time);
+ }
+
+ g_clear_object (&location);
+ }
+
if (found) {
uri = nautilus_file_get_uri (file);
hit = nautilus_search_hit_new (uri);
+
+ g_message ("found in model engine - %s", uri);
+
nautilus_search_hit_set_fts_rank (hit, match);
hits = g_list_prepend (hits, hit);
g_free (uri);
@@ -177,6 +232,8 @@ nautilus_search_engine_model_start (NautilusSearchProvider *provider)
g_object_ref (model);
model->details->query_pending = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (model->details->directory == NULL) {
search_finished_idle (model);
return;
@@ -218,12 +275,41 @@ nautilus_search_engine_model_set_query (NautilusSearchProvider *provider,
model->details->query = query;
}
+static gboolean
+nautilus_search_engine_model_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineModel *model;
+
+ model = NAUTILUS_SEARCH_ENGINE_MODEL (provider);
+
+ return model->details->query_pending;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_model_set_query;
iface->start = nautilus_search_engine_model_start;
iface->stop = nautilus_search_engine_model_stop;
+ iface->is_running = nautilus_search_engine_model_is_running;
+}
+
+static void
+nautilus_search_engine_model_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_model_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
@@ -233,6 +319,14 @@ nautilus_search_engine_model_class_init (NautilusSearchEngineModelClass *class)
gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = finalize;
+ gobject_class->get_property = nautilus_search_engine_model_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineModelDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine-simple.c b/libnautilus-private/nautilus-search-engine-simple.c
index f3557d6b1..35912ae55 100644
--- a/libnautilus-private/nautilus-search-engine-simple.c
+++ b/libnautilus-private/nautilus-search-engine-simple.c
@@ -36,6 +36,7 @@
enum {
PROP_RECURSIVE = 1,
+ PROP_RUNNING,
NUM_PROPERTIES
};
@@ -67,9 +68,7 @@ struct NautilusSearchEngineSimpleDetails {
gboolean query_finished;
};
-static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
-
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineSimple,
nautilus_search_engine_simple,
@@ -144,6 +143,8 @@ search_thread_done_idle (gpointer user_data)
nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (engine),
NAUTILUS_SEARCH_PROVIDER_STATUS_NORMAL);
+ g_object_notify (G_OBJECT (engine), "running");
+
search_thread_data_free (data);
return FALSE;
@@ -195,6 +196,7 @@ send_batch (SearchThreadData *thread_data)
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," \
G_FILE_ATTRIBUTE_STANDARD_TYPE "," \
G_FILE_ATTRIBUTE_TIME_MODIFIED "," \
+ G_FILE_ATTRIBUTE_TIME_ACCESS "," \
G_FILE_ATTRIBUTE_ID_FILE
static void
@@ -250,6 +252,27 @@ visit_directory (GFile *dir, SearchThreadData *data)
}
}
}
+
+ if (found && nautilus_query_get_date (data->query) != NULL) {
+ NautilusQuerySearchType type;
+ GDateTime *date;
+ guint64 current_file_time, query_time;
+ const gchar *attrib;
+
+ type = nautilus_query_get_search_type (data->query);
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ date = nautilus_query_get_date (data->query);
+ query_time = g_date_time_to_unix (date);
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+
+ found = (query_time <= current_file_time);
+ }
if (found) {
NautilusSearchHit *hit;
@@ -356,6 +379,8 @@ nautilus_search_engine_simple_start (NautilusSearchProvider *provider)
thread = g_thread_new ("nautilus-search-simple", search_thread_func, data);
simple->details->active_search = data;
+ g_object_notify (G_OBJECT (provider), "running");
+
g_thread_unref (thread);
}
@@ -385,6 +410,16 @@ nautilus_search_engine_simple_set_query (NautilusSearchProvider *provider,
simple->details->query = query;
}
+static gboolean
+nautilus_search_engine_simple_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineSimple *simple;
+
+ simple = NAUTILUS_SEARCH_ENGINE_SIMPLE (provider);
+
+ return simple->details->active_search != NULL;
+}
+
static void
nautilus_search_engine_simple_set_property (GObject *object,
guint arg_id,
@@ -416,6 +451,9 @@ nautilus_search_engine_simple_get_property (GObject *object,
engine = NAUTILUS_SEARCH_ENGINE_SIMPLE (object);
switch (arg_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_simple_is_running (NAUTILUS_SEARCH_PROVIDER (engine)));
+ break;
case PROP_RECURSIVE:
g_value_set_boolean (value, engine->details->recursive);
break;
@@ -423,11 +461,12 @@ nautilus_search_engine_simple_get_property (GObject *object,
}
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_simple_set_query;
iface->start = nautilus_search_engine_simple_start;
iface->stop = nautilus_search_engine_simple_stop;
+ iface->is_running = nautilus_search_engine_simple_is_running;
}
static void
@@ -440,13 +479,26 @@ nautilus_search_engine_simple_class_init (NautilusSearchEngineSimpleClass *class
gobject_class->get_property = nautilus_search_engine_simple_get_property;
gobject_class->set_property = nautilus_search_engine_simple_set_property;
- properties[PROP_RECURSIVE] = g_param_spec_boolean ("recursive",
- "recursive",
- "recursive",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ /**
+ * NautilusSearchEngineSimple::recursive:
+ *
+ * Whether the search is recursive or not.
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_RECURSIVE,
+ g_param_spec_boolean ("recursive",
+ "recursive",
+ "recursive",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
- g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
g_type_class_add_private (class, sizeof (NautilusSearchEngineSimpleDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c
index e49a63130..ec5ebdf93 100644
--- a/libnautilus-private/nautilus-search-engine-tracker.c
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -45,7 +45,13 @@ struct NautilusSearchEngineTrackerDetails {
GCancellable *cancellable;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineTracker,
nautilus_search_engine_tracker,
@@ -111,6 +117,8 @@ search_finished (NautilusSearchEngineTracker *tracker,
tracker->details->query_pending = FALSE;
+ g_object_notify (G_OBJECT (tracker), "running");
+
if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
DEBUG ("Tracker engine error %s", error->message);
nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (tracker), error->message);
@@ -255,6 +263,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
GList *mimetypes, *l;
gint mime_count;
gboolean recursive;
+ GDateTime *dt;
tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
@@ -266,6 +275,8 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_object_ref (tracker);
tracker->details->query_pending = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (tracker->details->connection == NULL) {
g_idle_add (search_finished_idle, provider);
return;
@@ -283,10 +294,11 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
location = nautilus_query_get_location (tracker->details->query);
location_uri = location ? g_file_get_uri (location) : NULL;
mimetypes = nautilus_query_get_mime_types (tracker->details->query);
+ dt = nautilus_query_get_date (tracker->details->query);
mime_count = g_list_length (mimetypes);
- sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn) tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn)) tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) "
+ sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn) tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn)) AS ?mtime tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) AS ?atime \n"
"WHERE {"
" ?urn a nfo:FileDataObject ;"
" tracker:available true ; ");
@@ -305,6 +317,24 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)), '%s')", search_text);
+ if (dt != NULL) {
+ NautilusQuerySearchType type;
+ gchar *dt_format;
+
+ type = nautilus_query_get_search_type (tracker->details->query);
+ dt_format = g_date_time_format (dt, "%Y-%m-%dT%H:%M:%S");
+
+ g_string_append (sparql, " && ");
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ g_string_append_printf (sparql, "?atime <= \"%s\"^^xsd:dateTime", dt_format);
+ } else {
+ g_string_append_printf (sparql, "?mtime <= \"%s\"^^xsd:dateTime", dt_format);
+ }
+
+ g_free (dt_format);
+ }
+
if (mime_count > 0) {
g_string_append (sparql, " && (");
@@ -316,7 +346,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(?mime, '%s')",
(gchar *) l->data);
}
- g_string_append (sparql, ")");
+ g_string_append (sparql, ")\n");
}
g_string_append (sparql, ")} ORDER BY DESC (fts:rank(?urn))");
@@ -347,6 +377,8 @@ nautilus_search_engine_tracker_stop (NautilusSearchProvider *provider)
g_cancellable_cancel (tracker->details->cancellable);
g_clear_object (&tracker->details->cancellable);
tracker->details->query_pending = FALSE;
+
+ g_object_notify (G_OBJECT (provider), "running");
}
}
@@ -363,12 +395,41 @@ nautilus_search_engine_tracker_set_query (NautilusSearchProvider *provider,
tracker->details->query = query;
}
+static gboolean
+nautilus_search_engine_tracker_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineTracker *tracker;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
+
+ return tracker->details->query_pending;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_tracker_set_query;
iface->start = nautilus_search_engine_tracker_start;
iface->stop = nautilus_search_engine_tracker_stop;
+ iface->is_running = nautilus_search_engine_tracker_is_running;
+}
+
+static void
+nautilus_search_engine_tracker_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_tracker_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
@@ -378,6 +439,14 @@ nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *cla
gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = finalize;
+ gobject_class->get_property = nautilus_search_engine_tracker_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineTrackerDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine.c b/libnautilus-private/nautilus-search-engine.c
index 0ae369a96..1526b8636 100644
--- a/libnautilus-private/nautilus-search-engine.c
+++ b/libnautilus-private/nautilus-search-engine.c
@@ -51,7 +51,15 @@ struct NautilusSearchEngineDetails
gboolean restart;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
+
+static gboolean nautilus_search_engine_is_running (NautilusSearchProvider *provider);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngine,
nautilus_search_engine,
@@ -118,6 +126,8 @@ nautilus_search_engine_start (NautilusSearchProvider *provider)
engine->details->running = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (num_finished < engine->details->providers_running) {
engine->details->restart = TRUE;
} else {
@@ -140,6 +150,8 @@ nautilus_search_engine_stop (NautilusSearchProvider *provider)
engine->details->running = FALSE;
engine->details->restart = FALSE;
+
+ g_object_notify (G_OBJECT (provider), "running");
}
static void
@@ -199,6 +211,8 @@ check_providers_status (NautilusSearchEngine *engine)
}
engine->details->running = FALSE;
+ g_object_notify (G_OBJECT (engine), "running");
+
g_hash_table_remove_all (engine->details->uris);
if (engine->details->restart) {
@@ -247,12 +261,23 @@ connect_provider_signals (NautilusSearchEngine *engine,
engine);
}
+static gboolean
+nautilus_search_engine_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngine *engine;
+
+ engine = NAUTILUS_SEARCH_ENGINE (provider);
+
+ return engine->details->running;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_set_query;
iface->start = nautilus_search_engine_start;
iface->stop = nautilus_search_engine_stop;
+ iface->is_running = nautilus_search_engine_is_running;
}
static void
@@ -272,6 +297,24 @@ nautilus_search_engine_finalize (GObject *object)
}
static void
+nautilus_search_engine_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
{
GObjectClass *object_class;
@@ -279,6 +322,14 @@ nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
object_class = (GObjectClass *) class;
object_class->finalize = nautilus_search_engine_finalize;
+ object_class->get_property = nautilus_search_engine_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (object_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineDetails));
}
diff --git a/libnautilus-private/nautilus-search-provider.c b/libnautilus-private/nautilus-search-provider.c
index 10aca2020..67404fb07 100644
--- a/libnautilus-private/nautilus-search-provider.c
+++ b/libnautilus-private/nautilus-search-provider.c
@@ -32,50 +32,28 @@ enum {
static guint signals[LAST_SIGNAL];
-static void nautilus_search_provider_base_init (gpointer g_iface);
-
-GType
-nautilus_search_provider_get_type (void)
-{
- static GType search_provider_type = 0;
-
- if (!search_provider_type) {
- const GTypeInfo search_provider_info = {
- sizeof (NautilusSearchProviderIface), /* class_size */
- nautilus_search_provider_base_init, /* base_init */
- NULL, /* base_finalize */
- NULL,
- NULL, /* class_finalize */
- NULL, /* class_data */
- 0,
- 0, /* n_preallocs */
- NULL
- };
-
- search_provider_type = g_type_register_static (G_TYPE_INTERFACE,
- "NautilusSearchProvider",
- &search_provider_info,
- 0);
-
- g_type_interface_add_prerequisite (search_provider_type, G_TYPE_OBJECT);
- }
-
- return search_provider_type;
-}
+G_DEFINE_INTERFACE (NautilusSearchProvider, nautilus_search_provider, G_TYPE_OBJECT)
static void
-nautilus_search_provider_base_init (gpointer g_iface)
+nautilus_search_provider_default_init (NautilusSearchProviderInterface *iface)
{
- static gboolean initialized = FALSE;
- if (initialized) {
- return;
- }
+ /**
+ * NautilusSearchProvider::running:
+ *
+ * Whether the provider is running a search.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boolean ("running",
+ "Whether the provider is running",
+ "Whether the provider is running a search",
+ FALSE,
+ G_PARAM_READABLE));
signals[HITS_ADDED] = g_signal_new ("hits-added",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, hits_added),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, hits_added),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -84,7 +62,7 @@ nautilus_search_provider_base_init (gpointer g_iface)
signals[FINISHED] = g_signal_new ("finished",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, finished),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, finished),
NULL, NULL,
g_cclosure_marshal_VOID__ENUM,
G_TYPE_NONE, 1,
@@ -93,13 +71,11 @@ nautilus_search_provider_base_init (gpointer g_iface)
signals[ERROR] = g_signal_new ("error",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, error),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, error),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1,
G_TYPE_STRING);
-
- initialized = TRUE;
}
void
@@ -156,3 +132,12 @@ nautilus_search_provider_error (NautilusSearchProvider *provider, const char *er
G_OBJECT_TYPE_NAME (provider), error_message);
g_signal_emit (provider, signals[ERROR], 0, error_message);
}
+
+gboolean
+nautilus_search_provider_is_running (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_running, FALSE);
+
+ return NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_running (provider);
+}
diff --git a/libnautilus-private/nautilus-search-provider.h b/libnautilus-private/nautilus-search-provider.h
index b3be651b4..96b4cf40d 100644
--- a/libnautilus-private/nautilus-search-provider.h
+++ b/libnautilus-private/nautilus-search-provider.h
@@ -29,15 +29,12 @@ typedef enum {
NAUTILUS_SEARCH_PROVIDER_STATUS_RESTARTING
} NautilusSearchProviderStatus;
-#define NAUTILUS_TYPE_SEARCH_PROVIDER (nautilus_search_provider_get_type ())
-#define NAUTILUS_SEARCH_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER, NautilusSearchProvider))
-#define NAUTILUS_IS_SEARCH_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER))
-#define NAUTILUS_SEARCH_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER, NautilusSearchProviderIface))
-typedef struct _NautilusSearchProvider NautilusSearchProvider;
-typedef struct _NautilusSearchProviderIface NautilusSearchProviderIface;
+#define NAUTILUS_TYPE_SEARCH_PROVIDER (nautilus_search_provider_get_type ())
-struct _NautilusSearchProviderIface {
+G_DECLARE_INTERFACE (NautilusSearchProvider, nautilus_search_provider, NAUTILUS, SEARCH_PROVIDER, GObject)
+
+struct _NautilusSearchProviderInterface {
GTypeInterface g_iface;
/* VTable */
@@ -75,6 +72,7 @@ struct _NautilusSearchProviderIface {
void (*finished) (NautilusSearchProvider *provider,
NautilusSearchProviderStatus status);
void (*error) (NautilusSearchProvider *provider, const char *error_message);
+ gboolean (*is_running) (NautilusSearchProvider *provider);
};
GType nautilus_search_provider_get_type (void) G_GNUC_CONST;
@@ -92,6 +90,8 @@ void nautilus_search_provider_finished (NautilusSearchProvider
void nautilus_search_provider_error (NautilusSearchProvider *provider,
const char *error_message);
+gboolean nautilus_search_provider_is_running (NautilusSearchProvider *provider);
+
G_END_DECLS
#endif