aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-autofilter.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-autofilter.c')
-rw-r--r--mail/mail-autofilter.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c
index 9e98758700..dbf2002a3d 100644
--- a/mail/mail-autofilter.c
+++ b/mail/mail-autofilter.c
@@ -222,6 +222,25 @@ rule_match_mlist(RuleContext *context, FilterRule *rule, const char *mlist)
}
static void
+rule_match_thread (RuleContext *context, FilterRule *rule, const char *msgid)
+{
+ FilterElement *element;
+ FilterPart *part;
+
+ if (msgid[0] == 0)
+ return;
+
+ part = rule_context_create_part (context, "header");
+ filter_rule_add_part (rule, part);
+
+ element = filter_part_find_element (part, "header-type");
+ filter_option_set_current ((FilterOption *) element, "contains");
+
+ element = filter_part_find_element (part, "header");
+ filter_input_set_value ((FilterInput *) element, msgid);
+}
+
+static void
rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg, int flags)
{
CamelInternetAddress *addr;
@@ -273,6 +292,30 @@ rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg
}
g_free(mlist);
}
+ if (flags & AUTO_THREAD) {
+ char *name, *msgid = nULL;
+ const char *refs = NULL;
+
+ if (!(refs = camel_medium_get_header ((CamelMedium *) msg, "References"))) {
+ if (!(refs = camel_medium_get_header ((CamelMedium *) msg, "In-Reply-To")))
+ msgid = camel_message_get_message_id (msg);
+ }
+
+ if (refs || msgid) {
+ struct _camel_header_references *r = NULL;
+
+ if (refs) {
+ r = camel_header_references_decode (refs);
+ msgid = r->id;
+ }
+
+ rule_match_thread (context, rule, msgid);
+ name = g_strdup_printf (_("Replies to %s"), msgid);
+
+ if (r)
+ camel_header_references_list_clear (&r);
+ }
+ }
}
FilterRule *