Commit a7ef0f15 authored by Georges Basile Stavracas Neto's avatar Georges Basile Stavracas Neto Committed by Carlos Soriano Sánchez

search-engines: adapt to the new search model

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.
parent 30181fc1
......@@ -65,6 +65,8 @@ struct NautilusSearchDirectoryDetails {
GList *callback_list;
GList *pending_callback_list;
GBinding *binding;
NautilusDirectory *base_model;
};
......@@ -939,18 +941,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));
......
......@@ -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));
}
......
......@@ -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));
}
......
......@@ -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));
}
......
......@@ -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
......@@ -271,6 +296,24 @@ nautilus_search_engine_finalize (GObject *object)
G_OBJECT_CLASS (nautilus_search_engine_parent_class)->finalize (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)
{
......@@ -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));
}
......
......@@ -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);
}
......@@ -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);