aboutsummaryrefslogtreecommitdiffstats
path: root/mail/message-list.c
diff options
context:
space:
mode:
authorRadek Doulik <rodo@src.gnome.org>2003-11-13 05:13:05 +0800
committerRadek Doulik <rodo@src.gnome.org>2003-11-13 05:13:05 +0800
commit8e1251fa17b522d0539a8fcfb7463ba8cef1b31a (patch)
tree9be2f3a8a184446361a8c72879947f7a6e7d8d75 /mail/message-list.c
parent8187001a14295b4b64cc3e973fb1ab1e551133f2 (diff)
downloadgsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar.gz
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar.bz2
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar.lz
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar.xz
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.tar.zst
gsoc2013-evolution-8e1251fa17b522d0539a8fcfb7463ba8cef1b31a.zip
merged spam filtering branch
svn path=/trunk/; revision=23302
Diffstat (limited to 'mail/message-list.c')
-rw-r--r--mail/message-list.c112
1 files changed, 72 insertions, 40 deletions
diff --git a/mail/message-list.c b/mail/message-list.c
index a16c40f265..430d2f4896 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -188,6 +188,9 @@ static struct {
{ NULL, NULL }
};
+/* FIXME: junk prefs */
+static gboolean junk_folder = TRUE;
+
#ifdef SMART_ADDRESS_COMPARE
static EMailAddress *
e_mail_address_new (const char *address)
@@ -2377,11 +2380,44 @@ build_flat_diff(MessageList *ml, CamelFolderChangeInfo *changes)
static void
+mail_folder_hide_by_flag (CamelFolder *folder, MessageList *ml, CamelFolderChangeInfo **changes, int flag)
+{
+ CamelFolderChangeInfo *newchanges, *oldchanges = *changes;
+ CamelMessageInfo *info;
+ int i;
+
+ newchanges = camel_folder_change_info_new ();
+
+ for (i = 0; i < oldchanges->uid_changed->len; i++) {
+ ETreePath node = g_hash_table_lookup (ml->uid_nodemap, oldchanges->uid_changed->pdata[i]);
+
+ info = camel_folder_get_message_info (folder, oldchanges->uid_changed->pdata[i]);
+ if (node != NULL && info != NULL && (info->flags & flag) != 0)
+ camel_folder_change_info_remove_uid (newchanges, oldchanges->uid_changed->pdata[i]);
+ else if (node == NULL && info != NULL && (info->flags & flag) == 0)
+ camel_folder_change_info_add_uid (newchanges, oldchanges->uid_changed->pdata[i]);
+ else
+ camel_folder_change_info_change_uid (newchanges, oldchanges->uid_changed->pdata[i]);
+ camel_folder_free_message_info (folder, info);
+ }
+
+ if (newchanges->uid_added->len > 0 || newchanges->uid_removed->len > 0) {
+ for (i = 0; i < oldchanges->uid_added->len; i++)
+ camel_folder_change_info_add_uid (newchanges, oldchanges->uid_added->pdata[i]);
+ for (i = 0; i < oldchanges->uid_removed->len; i++)
+ camel_folder_change_info_remove_uid (newchanges, oldchanges->uid_removed->pdata[i]);
+ camel_folder_change_info_free (oldchanges);
+ *changes = newchanges;
+ } else {
+ camel_folder_change_info_free (newchanges);
+ }
+}
+
+static void
main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
{
MessageList *ml = MESSAGE_LIST (user_data);
- CamelFolderChangeInfo *changes = (CamelFolderChangeInfo *)event_data, *newchanges;
- CamelMessageInfo *info;
+ CamelFolderChangeInfo *changes = (CamelFolderChangeInfo *)event_data;
CamelFolder *folder = (CamelFolder *)o;
int i;
@@ -2402,35 +2438,9 @@ main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
}
/* check if the hidden state has changed, if so modify accordingly, then regenerate */
- if (ml->hidedeleted) {
- newchanges = camel_folder_change_info_new ();
-
- for (i = 0; i < changes->uid_changed->len; i++) {
- ETreePath node = g_hash_table_lookup (ml->uid_nodemap, changes->uid_changed->pdata[i]);
-
- info = camel_folder_get_message_info (folder, changes->uid_changed->pdata[i]);
- if (node != NULL && info != NULL && (info->flags & CAMEL_MESSAGE_DELETED) != 0) {
- camel_folder_change_info_remove_uid (newchanges, changes->uid_changed->pdata[i]);
- } else if (node == NULL && info != NULL && (info->flags & CAMEL_MESSAGE_DELETED) == 0) {
- camel_folder_change_info_add_uid (newchanges, changes->uid_changed->pdata[i]);
- } else {
- camel_folder_change_info_change_uid (newchanges, changes->uid_changed->pdata[i]);
- }
- camel_folder_free_message_info (folder, info);
- }
-
- if (newchanges->uid_added->len > 0 || newchanges->uid_removed->len > 0) {
- for (i = 0; i < changes->uid_added->len; i++)
- camel_folder_change_info_add_uid (newchanges, changes->uid_added->pdata[i]);
- for (i = 0; i < changes->uid_removed->len; i++)
- camel_folder_change_info_remove_uid (newchanges, changes->uid_removed->pdata[i]);
- camel_folder_change_info_free (changes);
- changes = newchanges;
- } else {
- camel_folder_change_info_free (newchanges);
- }
- }
-
+ if (ml->hidejunk || ml->hidedeleted)
+ mail_folder_hide_by_flag (folder, ml, &changes, (ml->hidejunk ? CAMEL_MESSAGE_JUNK : 0) | (ml->hidedeleted ? CAMEL_MESSAGE_DELETED : 0));
+
if (changes->uid_added->len == 0 && changes->uid_removed->len == 0 && changes->uid_changed->len < 100) {
for (i = 0; i < changes->uid_changed->len; i++) {
ETreePath node = g_hash_table_lookup (ml->uid_nodemap, changes->uid_changed->pdata[i]);
@@ -2579,6 +2589,7 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const c
gconf = mail_config_get_gconf_client ();
hide_deleted = !gconf_client_get_bool (gconf, "/apps/evolution/mail/display/show_deleted", NULL);
message_list->hidedeleted = hide_deleted && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
+ message_list->hidejunk = junk_folder && !(folder->folder_flags & CAMEL_FOLDER_IS_JUNK) && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
hide_load_state (message_list);
mail_regen_list (message_list, message_list->search, NULL, NULL);
@@ -3038,6 +3049,7 @@ struct _regen_list_msg {
CamelFolderChangeInfo *changes;
gboolean dotree; /* we are building a tree */
gboolean hidedel; /* we want to/dont want to show deleted messages */
+ gboolean hidejunk; /* we want to/dont want to show junk messages */
gboolean thread_subject;
CamelFolderThread *tree;
@@ -3076,17 +3088,36 @@ regen_list_regen (struct _mail_msg *mm)
} else if (m->hidedel) {
char *expr;
- if (m->search) {
- expr = alloca(strlen(m->search) + 64);
- sprintf(expr, "(and (match-all (not (system-flag \"deleted\")))\n %s)", m->search);
- } else
- expr = "(match-all (not (system-flag \"deleted\")))";
+ if (m->hidejunk) {
+ if (m->search) {
+ expr = alloca(strlen(m->search) + 92);
+ sprintf(expr, "(and (match-all (and (not (system-flag \"deleted\")) (not (system-flag \"junk\"))))\n %s)", m->search);
+ } else
+ expr = "(match-all (and (not (system-flag \"deleted\")) (not (system-flag \"junk\"))))";
+ } else {
+ if (m->search) {
+ expr = alloca(strlen(m->search) + 64);
+ sprintf(expr, "(and (match-all (not (system-flag \"deleted\")))\n %s)", m->search);
+ } else
+ expr = "(match-all (not (system-flag \"deleted\")))";
+ }
searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &mm->ex);
} else {
- if (m->search)
- searchuids = uids = camel_folder_search_by_expression (m->folder, m->search, &mm->ex);
- else
- uids = camel_folder_get_uids (m->folder);
+ char *expr;
+
+ if (m->hidejunk) {
+ if (m->search) {
+ expr = alloca(strlen(m->search) + 64);
+ sprintf(expr, "(and (match-all (not (system-flag \"junk\")))\n %s)", m->search);
+ } else
+ expr = "(match-all (not (system-flag \"junk\")))";
+ searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &mm->ex);
+ } else {
+ if (m->search)
+ searchuids = uids = camel_folder_search_by_expression (m->folder, m->search, &mm->ex);
+ else
+ uids = camel_folder_get_uids (m->folder);
+ }
}
if (camel_exception_is_set (&mm->ex))
@@ -3318,6 +3349,7 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came
m->changes = changes;
m->dotree = ml->threaded;
m->hidedel = ml->hidedeleted;
+ m->hidejunk = ml->hidejunk;
m->thread_subject = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/thread_subject", NULL);
g_object_ref(ml);
m->folder = ml->folder;