summaryrefslogtreecommitdiff
path: root/camel
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2015-07-15 10:45:28 +0200
committerMilan Crha <mcrha@redhat.com>2015-07-15 10:45:28 +0200
commit6c9482c4b2b3cb3b4763a58a467190d547245826 (patch)
treec034ac6c1009fd450143f6dcdce2cf2d773c7876 /camel
parent4d4a97508e92b73cc46796b20acf112d95a8a934 (diff)
downloadevolution-data-server-6c9482c4b2b3cb3b4763a58a467190d547245826.tar.gz
Add GCancellable parameter to camel_filter_search_match()
This way the junk filtering can be cancelled. This also changes camel_filter_driver_filter_message(), to check the cancellable and stop processing filter rules early on cancellation.
Diffstat (limited to 'camel')
-rw-r--r--camel/camel-filter-driver.c8
-rw-r--r--camel/camel-filter-search.c17
-rw-r--r--camel/camel-filter-search.h13
3 files changed, 27 insertions, 11 deletions
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index ce98f64ad..79b1137ef 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -1602,6 +1602,7 @@ struct _get_message {
static CamelMimeMessage *
get_message_cb (gpointer data,
+ GCancellable *cancellable,
GError **error)
{
struct _get_message *msgdata = data;
@@ -1619,7 +1620,7 @@ get_message_cb (gpointer data,
/* FIXME Pass a GCancellable */
message = camel_folder_get_message_sync (
- msgdata->priv->source, uid, NULL, error);
+ msgdata->priv->source, uid, cancellable, error);
}
if (message != NULL && camel_mime_message_get_source (message) == NULL)
@@ -1727,6 +1728,9 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
if (driver->priv->terminated)
break;
+ if (g_cancellable_set_error_if_cancelled (cancellable, &driver->priv->error))
+ goto error;
+
d (printf ("applying rule %s\naction %s\n", rule->match, rule->action));
data.priv = p;
@@ -1737,7 +1741,7 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
result = camel_filter_search_match (
driver->priv->session, get_message_cb, &data, driver->priv->info,
- original_store_uid, source, rule->match, &driver->priv->error);
+ original_store_uid, source, rule->match, cancellable, &driver->priv->error);
switch (result) {
case CAMEL_SEARCH_ERROR:
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 1f5c79f31..9df10c97f 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -63,6 +63,7 @@ typedef struct {
CamelMessageInfo *info;
CamelFolder *folder;
const gchar *source;
+ GCancellable *cancellable;
GError **error;
} FilterMessageSearch;
@@ -132,7 +133,7 @@ camel_filter_search_get_message (FilterMessageSearch *fms,
if (fms->message)
return fms->message;
- fms->message = fms->get_message (fms->get_message_data, fms->error);
+ fms->message = fms->get_message (fms->get_message_data, fms->cancellable, fms->error);
if (fms->message == NULL)
camel_sexp_fatal_error (sexp, _("Failed to retrieve message"));
@@ -806,8 +807,8 @@ run_command (struct _CamelSExp *f,
stream = camel_stream_fs_new_with_fd (pipe_to_child);
camel_data_wrapper_write_to_stream_sync (
- CAMEL_DATA_WRAPPER (message), stream, NULL, NULL);
- camel_stream_flush (stream, NULL, NULL);
+ CAMEL_DATA_WRAPPER (message), stream, fms->cancellable, NULL);
+ camel_stream_flush (stream, fms->cancellable, NULL);
g_object_unref (stream);
context = g_main_context_new ();
@@ -973,7 +974,7 @@ junk_test (struct _CamelSExp *f,
goto done;
status = camel_junk_filter_classify (
- junk_filter, message, NULL, &error);
+ junk_filter, message, fms->cancellable, &error);
if (error == NULL) {
const gchar *status_desc;
@@ -1004,7 +1005,10 @@ junk_test (struct _CamelSExp *f,
status_desc);
} else {
g_warn_if_fail (status == CAMEL_JUNK_STATUS_ERROR);
- g_warning ("%s: %s", G_STRFUNC, error->message);
+ if (camel_debug ("junk"))
+ printf ("Junk classify failed with error: %s\n", error->message);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("%s: %s", G_STRFUNC, error->message);
g_error_free (error);
message_is_junk = FALSE;
}
@@ -1092,6 +1096,7 @@ message_location (struct _CamelSExp *f,
* @source:
* @folder: in which folder the message is stored
* @expression:
+ * @cancellable: (allow-none): a #GCancellable, or %NULL
* @error: return location for a #GError, or %NULL
*
* Returns: one of CAMEL_SEARCH_MATCHED, CAMEL_SEARCH_NOMATCH, or
@@ -1105,6 +1110,7 @@ camel_filter_search_match (CamelSession *session,
const gchar *source,
CamelFolder *folder,
const gchar *expression,
+ GCancellable *cancellable,
GError **error)
{
FilterMessageSearch fms;
@@ -1121,6 +1127,7 @@ camel_filter_search_match (CamelSession *session,
fms.info = info;
fms.source = source;
fms.folder = folder;
+ fms.cancellable = cancellable;
fms.error = &local_error;
sexp = camel_sexp_new ();
diff --git a/camel/camel-filter-search.h b/camel/camel-filter-search.h
index 0b680867e..d88ec01d3 100644
--- a/camel/camel-filter-search.h
+++ b/camel/camel-filter-search.h
@@ -38,12 +38,17 @@ enum {
CAMEL_SEARCH_MATCHED = 1
};
-typedef CamelMimeMessage * (*CamelFilterSearchGetMessageFunc) (gpointer data, GError **error);
+typedef CamelMimeMessage * (*CamelFilterSearchGetMessageFunc) (gpointer data, GCancellable *cancellable, GError **error);
gint camel_filter_search_match (struct _CamelSession *session,
- CamelFilterSearchGetMessageFunc get_message, gpointer data,
- CamelMessageInfo *info, const gchar *source, struct _CamelFolder *folder,
- const gchar *expression, GError **error);
+ CamelFilterSearchGetMessageFunc get_message,
+ gpointer data,
+ CamelMessageInfo *info,
+ const gchar *source,
+ struct _CamelFolder *folder,
+ const gchar *expression,
+ GCancellable *cancellable,
+ GError **error);
G_END_DECLS