diff options
Diffstat (limited to 'mail/mail-autofilter.c')
-rw-r--r-- | mail/mail-autofilter.c | 43 |
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 * |