2001-09-13 Jeffrey Stedfast <fejj@ximian.com>
+ * camel-filter-driver.c (camel_filter_driver_filter_folder): Don't
+ reuse the exception if it has already been set.
+ (camel_filter_driver_filter_message): Same here. Also use the new
+ return value from camel_filter_search_match().
+
+ * camel-filter-search.c (camel_filter_search_match): Return an
+ integer (matched, no-match, or error).
+
* providers/local/camel-mbox-folder.c (mbox_append_message): Do
error-checking based on function return values rather than
exceptions as it's possible for them to be NULL.
if (p->defaultfolder) {
report_status (driver, CAMEL_FILTER_STATUS_PROGRESS, 100, _("Syncing folder"));
- camel_folder_sync (p->defaultfolder, FALSE, ex);
+ camel_folder_sync (p->defaultfolder, FALSE, camel_exception_is_set (ex) ? NULL : ex);
}
if (i == uids->len)
CamelException *ex)
{
struct _CamelFilterDriverPrivate *p = _PRIVATE (driver);
- ESExpResult *r;
struct _filter_rule *node;
gboolean freeinfo = FALSE;
gboolean filtered = FALSE;
+ ESExpResult *r;
+ int result;
if (info == NULL) {
struct _header_raw *h = CAMEL_MIME_PART (message)->headers;
camel_mime_message_set_source (message, original_source_url);
node = (struct _filter_rule *)p->rules.head;
- while (node->next) {
+ result = CAMEL_SEARCH_NOMATCH;
+ while (node->next && result != CAMEL_SEARCH_ERROR) {
d(fprintf (stderr, "applying rule %s\naction %s\n", node->match, node->action));
- if (camel_filter_search_match (p->message, p->info,
- original_source_url ? original_source_url : source_url,
- node->match, p->ex)) {
+ result = camel_filter_search_match (p->message, p->info,
+ original_source_url ? original_source_url : source_url,
+ node->match, p->ex);
+
+ if (result == CAMEL_SEARCH_MATCHED) {
filtered = TRUE;
camel_filter_driver_log (driver, FILTER_LOG_START, node->name);
uids = g_ptr_array_new ();
g_ptr_array_add (uids, (char *) p->uid);
- camel_folder_copy_messages_to (p->source, uids, p->defaultfolder, p->ex);
+ camel_folder_copy_messages_to (p->source, uids, p->defaultfolder,
+ result == CAMEL_SEARCH_ERROR ? NULL : p->ex);
g_ptr_array_free (uids, TRUE);
- } else
- camel_folder_append_message (p->defaultfolder, p->message, p->info, p->ex);
+ } else {
+ camel_folder_append_message (p->defaultfolder, p->message, p->info,
+ result == CAMEL_SEARCH_ERROR ? NULL : p->ex);
+ }
}
if (freeinfo)
return r;
}
-gboolean
+
+/**
+ * camel_filter_search_match:
+ * @message:
+ * @info:
+ * @source:
+ * @expression:
+ * @ex:
+ *
+ * Returns one of CAMEL_SEARCH_MATCHED, CAMEL_SEARCH_NOMATCH, or CAMEL_SEARCH_ERROR.
+ **/
+int
camel_filter_search_match (CamelMimeMessage *message, CamelMessageInfo *info,
const char *source, const char *expression, CamelException *ex)
{
}
if (result->type == ESEXP_RES_BOOL)
- retval = result->value.bool;
+ retval = result->value.bool ? CAMEL_SEARCH_MATCHED : CAMEL_SEARCH_NOMATCH;
else
- retval = FALSE;
+ retval = CAMEL_SEARCH_NOMATCH;
e_sexp_result_free (sexp, result);
e_sexp_unref (sexp);
error:
e_sexp_unref (sexp);
- return FALSE;
+ return CAMEL_SEARCH_ERROR;
}
#include <camel/camel-mime-message.h>
#include <camel/camel-folder-summary.h>
-gboolean camel_filter_search_match(CamelMimeMessage *message, CamelMessageInfo *info,
- const char *source, const char *expression, CamelException *ex);
+enum {
+ CAMEL_SEARCH_ERROR = -1,
+ CAMEL_SEARCH_NOMATCH = 0,
+ CAMEL_SEARCH_MATCHED = 1,
+};
+
+int camel_filter_search_match (CamelMimeMessage *message, CamelMessageInfo *info,
+ const char *source, const char *expression, CamelException *ex);
#ifdef __cplusplus
}