diff options
author | Milan Crha <mcrha@redhat.com> | 2015-07-15 10:45:28 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2015-07-15 10:45:28 +0200 |
commit | 6c9482c4b2b3cb3b4763a58a467190d547245826 (patch) | |
tree | c034ac6c1009fd450143f6dcdce2cf2d773c7876 /camel | |
parent | 4d4a97508e92b73cc46796b20acf112d95a8a934 (diff) | |
download | evolution-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.c | 8 | ||||
-rw-r--r-- | camel/camel-filter-search.c | 17 | ||||
-rw-r--r-- | camel/camel-filter-search.h | 13 |
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 |