/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto & The Sylpheed Claws Team
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto & The Claws Mail Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "filtering.h"
#include "prefs_gtk.h"
#include "compose.h"
+#include "prefs_common.h"
#define PREFSBUFSIZE 1024
FilteringProp * filteringprop_new(gboolean enabled,
const gchar *name,
+ gint account_id,
MatcherList * matchers,
GSList * action_list)
{
filtering = g_new0(FilteringProp, 1);
filtering->enabled = enabled;
filtering->name = name ? g_strdup(name): NULL;
+ filtering->account_id = account_id;
filtering->matchers = matchers;
filtering->action_list = action_list;
GSList *messages = g_slist_copy(msgs);
FolderItem *last_item = NULL;
gboolean is_copy = FALSE, is_move = FALSE;
-
+ debug_print("checking %d messages\n", g_slist_length(msgs));
while (messages) {
GSList *batch = NULL, *cur;
gint found = 0;
if (found == 0) {
debug_print("no more messages to move/copy\n");
break;
+ } else {
+ debug_print("%d messages to %s in %s\n", found,
+ is_copy ? "copy":"move", last_item->name ? last_item->name:"(noname)");
}
for (cur = batch; cur; cur = cur->next) {
MsgInfo *info = (MsgInfo *)cur->data;
procmsg_msginfo_set_flags(info, MSG_UNREAD | MSG_NEW, 0);
return TRUE;
+ case MATCHACTION_MARK_AS_SPAM:
+ procmsg_spam_learner_learn(info, NULL, TRUE);
+ procmsg_msginfo_change_flags(info, MSG_SPAM, 0, MSG_NEW|MSG_UNREAD, 0);
+ if (procmsg_spam_get_folder(info)) {
+ info->is_move = TRUE;
+ info->to_filter_folder = procmsg_spam_get_folder(info);
+ }
+ return TRUE;
+
+ case MATCHACTION_MARK_AS_HAM:
+ procmsg_spam_learner_learn(info, NULL, FALSE);
+ procmsg_msginfo_unset_flags(info, MSG_SPAM, 0);
+ return TRUE;
+
case MATCHACTION_COLOR:
procmsg_msginfo_unset_flags(info, MSG_CLABEL_FLAG_MASK, 0);
procmsg_msginfo_set_flags(info, MSG_COLORLABEL_TO_FLAGS(action->labelcolor), 0);
return TRUE;
}
-static gboolean filtering_match_condition(FilteringProp *filtering, MsgInfo *info)
+static gboolean filtering_match_condition(FilteringProp *filtering, MsgInfo *info,
+ PrefsAccount *ac_prefs)
{
- return matcherlist_match(filtering->matchers, info);
+ gboolean matches = FALSE;
+
+ if (ac_prefs != NULL) {
+ matches = ((filtering->account_id == 0)
+ || (filtering->account_id == ac_prefs->account_id));
+ } else {
+ switch (prefs_common.apply_per_account_filtering_rules) {
+ case FILTERING_ACCOUNT_RULES_FORCE:
+ /* apply filtering rules regardless to the account info */
+ matches = TRUE;
+ break;
+ case FILTERING_ACCOUNT_RULES_SKIP:
+ /* don't apply filtering rules that belong to an account */
+ matches = (filtering->account_id == 0);
+ break;
+ case FILTERING_ACCOUNT_RULES_USE_CURRENT:
+ matches = ((filtering->account_id == 0)
+ || (filtering->account_id == cur_account->account_id));
+ break;
+ }
+ }
+
+ return matches && matcherlist_match(filtering->matchers, info);
}
/*!
gboolean * final)
{
gboolean result = TRUE;
- gchar buf[50];
+ gchar buf[256];
GSList * tmp;
* final = FALSE;
case MATCHACTION_MOVE:
case MATCHACTION_DELETE:
case MATCHACTION_STOP:
+ case MATCHACTION_MARK_AS_SPAM:
return TRUE; /* MsgInfo invalid for message */
default:
return FALSE;
}
}
-static gboolean filter_msginfo(GSList * filtering_list, MsgInfo * info)
+static gboolean filter_msginfo(GSList * filtering_list, MsgInfo * info, PrefsAccount* ac_prefs)
{
GSList *l;
gboolean final;
for (l = filtering_list, final = FALSE, apply_next = FALSE; l != NULL; l = g_slist_next(l)) {
FilteringProp * filtering = (FilteringProp *) l->data;
- if (filtering->enabled && filtering_match_condition(filtering, info)) {
+ if (filtering->enabled && filtering_match_condition(filtering, info, ac_prefs)) {
apply_next = filtering_apply_rule(filtering, info, &final);
if (final)
break;
* processing. E.g. \ref inc.c::inc_start moves the
* message to the inbox.
*/
-gboolean filter_message_by_msginfo(GSList *flist, MsgInfo *info)
+gboolean filter_message_by_msginfo(GSList *flist, MsgInfo *info, PrefsAccount* ac_prefs)
{
- return filter_msginfo(flist, info);
+ return filter_msginfo(flist, info, ac_prefs);
}
gchar *filteringaction_to_string(gchar *dest, gint destlen, FilteringAction *action)
case MATCHACTION_UNLOCK:
case MATCHACTION_MARK_AS_READ:
case MATCHACTION_MARK_AS_UNREAD:
+ case MATCHACTION_MARK_AS_SPAM:
+ case MATCHACTION_MARK_AS_HAM:
case MATCHACTION_STOP:
case MATCHACTION_HIDE:
case MATCHACTION_IGNORE:
/* FIXME: Note folder settings were changed, where the updates? */
}
+gboolean filtering_peek_per_account_rules(GSList *filtering_list)
+/* return TRUE if there's at least one per-account filtering rule */
+{
+ GSList *l;
+
+ for (l = filtering_list; l != NULL; l = g_slist_next(l)) {
+ FilteringProp * filtering = (FilteringProp *) l->data;
+
+ if (filtering->enabled && (filtering->account_id != 0)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}