From: Ricardo Mones Date: Wed, 10 Sep 2014 21:37:11 +0000 (+0200) Subject: Add new quicksearch for header's content only X-Git-Tag: 3.11.0~22 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=b29a924ece7da846e2871bea8bbddde98edcb5cf Add new quicksearch for header's content only • The new “H S” filter searches for mail that contains string S in the content of any non-internal header. Based on patches¹² by H.Merijn Brand , with some reversion, refactoring, minor improvements and fixed typos. ¹ http://lists.claws-mail.org/pipermail/devel/2014-August/001257.html ² http://lists.claws-mail.org/pipermail/devel/2014-August/001258.html --- diff --git a/README b/README index af49120fa..8d23cfed3 100644 --- a/README +++ b/README @@ -393,7 +393,8 @@ http://www.claws-mail.org/plugins.php E S true if execute "S" succeeds f S messages originating from user S F forwarded messages - h S messages which contain header S + h S messages which contain S in any header name or value + H S messages which contain S in the value of any header i S messages which contain S in Message-Id header I S messages which contain S in inreplyto header k # messages which are marked with color # diff --git a/src/advsearch.c b/src/advsearch.c index 26a4e3424..7439bb59a 100644 --- a/src/advsearch.c +++ b/src/advsearch.c @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 2012 the Claws Mail team + * Copyright (C) 2012-2014 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 @@ -162,6 +162,7 @@ gchar *advsearch_expand_search_string(const gchar *search_string) { "f", "from", 1, TRUE, TRUE }, { "F", "forwarded", 0, FALSE, FALSE }, { "h", "headers_part", 1, TRUE, TRUE }, + { "H", "headers_cont", 1, TRUE, TRUE }, { "ha", "has_attachments", 0, FALSE, FALSE }, { "i", "header \"Message-ID\"", 1, TRUE, TRUE }, { "I", "inreplyto", 1, TRUE, TRUE }, diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c index 54b6b9265..c7c705e34 100644 --- a/src/gtk/quicksearch.c +++ b/src/gtk/quicksearch.c @@ -463,7 +463,8 @@ static gchar *search_descr_strings[] = { "f S", N_("messages originating from user S"), "F", N_("forwarded messages"), "ha", N_("messages which have attachments"), - "h S", N_("messages which contain header S"), + "h S", N_("messages which contain S in any header name or value"), + "H S", N_("messages which contain S in the value of any header"), "i S", N_("messages which contain S in Message-ID header"), "I S", N_("messages which contain S in In-Reply-To header"), "k #", N_("messages which are marked with color #"), diff --git a/src/imap.c b/src/imap.c index 5608dc885..0ec8131a0 100644 --- a/src/imap.c +++ b/src/imap.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team + * Copyright (C) 1999-2014 Hiroyuki Yamamoto and 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 @@ -2098,6 +2098,7 @@ static IMAPSearchKey* search_make_key(MatcherProp* match, gboolean* is_all) case MATCHCRITERIA_NOT_HEADER: invert = TRUE; matchertype = MATCHCRITERIA_HEADER; break; case MATCHCRITERIA_NOT_TAG: invert = TRUE; matchertype = MATCHCRITERIA_TAG; break; case MATCHCRITERIA_NOT_HEADERS_PART: invert = TRUE; matchertype = MATCHCRITERIA_HEADERS_PART; break; + case MATCHCRITERIA_NOT_HEADERS_CONT: invert = TRUE; matchertype = MATCHCRITERIA_HEADERS_CONT; break; case MATCHCRITERIA_NOT_MESSAGE: invert = TRUE; matchertype = MATCHCRITERIA_MESSAGE; break; case MATCHCRITERIA_NOT_BODY_PART: invert = TRUE; matchertype = MATCHCRITERIA_BODY_PART; break; case MATCHCRITERIA_NOT_TO_AND_NOT_CC: invert = TRUE; matchertype = MATCHCRITERIA_TO_OR_CC; break; @@ -2143,6 +2144,7 @@ static IMAPSearchKey* search_make_key(MatcherProp* match, gboolean* is_all) break; case MATCHCRITERIA_HEADERS_PART: + case MATCHCRITERIA_HEADERS_CONT: result = imap_search_and( imap_search_not(imap_search_new(IMAP_SEARCH_CRITERIA_BODY, NULL, match->expr, 0)), imap_search_new(IMAP_SEARCH_CRITERIA_MESSAGE, NULL, match->expr, 0) diff --git a/src/matcher.c b/src/matcher.c index 4382c5996..1f191d973 100644 --- a/src/matcher.c +++ b/src/matcher.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 2002-2012 by the Claws Mail Team and Hiroyuki Yamamoto + * Copyright (C) 2002-2014 by the Claws Mail Team and Hiroyuki Yamamoto * * 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 @@ -135,6 +135,8 @@ static const MatchParser matchparser_tab[] = { {MATCHCRITERIA_NOT_HEADER, "~header"}, {MATCHCRITERIA_HEADERS_PART, "headers_part"}, {MATCHCRITERIA_NOT_HEADERS_PART, "~headers_part"}, + {MATCHCRITERIA_HEADERS_CONT, "headers_cont"}, + {MATCHCRITERIA_NOT_HEADERS_CONT, "~headers_cont"}, {MATCHCRITERIA_MESSAGE, "message"}, {MATCHCRITERIA_NOT_MESSAGE, "~message"}, {MATCHCRITERIA_BODY_PART, "body_part"}, @@ -620,18 +622,32 @@ const gchar *debug_context) } static gboolean matcherprop_header_line_match(MatcherProp *prop, const gchar *hdr, - const gchar *str, const gchar *debug_context) + const gchar *str, const gboolean both, + const gchar *debug_context) { - gchar *line = NULL; gboolean res = FALSE; if (hdr == NULL || str == NULL) return FALSE; - line = g_strdup_printf("%s %s", hdr, str); - res = matcherprop_string_match(prop, line, debug_context); - g_free(line); - + if (both) { + /* Search in all header names and content. + */ + gchar *line = g_strdup_printf("%s %s", hdr, str); + res = matcherprop_string_match(prop, line, debug_context); + g_free(line); + } else { + /* Search only in content and exclude private headers. + * E.g.: searching for "H foo" in folder x/foo would return + * *all* mail as SCF and RMID will match. + * Searching for "H sent" would return all resent messages + * as "Resent-From: whatever" will match. + */ + if (procheader_header_is_internal(hdr)) + return FALSE; + res = matcherprop_string_match(prop, str, debug_context); + } + return res; } @@ -1305,21 +1321,27 @@ static gboolean matcherprop_match_one_header(MatcherProp *matcher, } break; case MATCHCRITERIA_HEADERS_PART: + case MATCHCRITERIA_HEADERS_CONT: case MATCHCRITERIA_MESSAGE: header = procheader_parse_header(buf); if (!header) return FALSE; result = matcherprop_header_line_match(matcher, - header->name, header->body, context_str[CONTEXT_HEADER_LINE]); + header->name, header->body, + (matcher->criteria == MATCHCRITERIA_HEADERS_PART), + context_str[CONTEXT_HEADER_LINE]); procheader_header_free(header); return result; + case MATCHCRITERIA_NOT_HEADERS_CONT: case MATCHCRITERIA_NOT_HEADERS_PART: case MATCHCRITERIA_NOT_MESSAGE: header = procheader_parse_header(buf); if (!header) return FALSE; result = !matcherprop_header_line_match(matcher, - header->name, header->body, context_str[CONTEXT_HEADER_LINE]); + header->name, header->body, + (matcher->criteria == MATCHCRITERIA_NOT_HEADERS_PART), + context_str[CONTEXT_HEADER_LINE]); procheader_header_free(header); return result; case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: @@ -1391,7 +1413,9 @@ static gboolean matcherprop_criteria_headers(const MatcherProp *matcher) case MATCHCRITERIA_HEADER: case MATCHCRITERIA_NOT_HEADER: case MATCHCRITERIA_HEADERS_PART: + case MATCHCRITERIA_HEADERS_CONT: case MATCHCRITERIA_NOT_HEADERS_PART: + case MATCHCRITERIA_NOT_HEADERS_CONT: case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: return TRUE; @@ -1446,6 +1470,7 @@ static gboolean matcherlist_match_headers(MatcherList *matchers, FILE *fp) /* determine the match range (all, any are our concern here) */ if (matcher->criteria == MATCHCRITERIA_NOT_HEADERS_PART || + matcher->criteria == MATCHCRITERIA_NOT_HEADERS_CONT || matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) { match = MATCH_ALL; diff --git a/src/matcher.h b/src/matcher.h index 62d5352e8..b8e637da9 100644 --- a/src/matcher.h +++ b/src/matcher.h @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 2002-2012 by the Claws Mail Team and Hiroyuki Yamamoto + * Copyright (C) 2002-2014 by the Claws Mail Team and Hiroyuki Yamamoto * * 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 @@ -96,6 +96,7 @@ enum { MC_(SCORE_GREATER), MC_(SCORE_LOWER), MC_(HEADER), MC_(NOT_HEADER), MC_(HEADERS_PART), MC_(NOT_HEADERS_PART), + MC_(HEADERS_CONT), MC_(NOT_HEADERS_CONT), MC_(MESSAGE), MC_(NOT_MESSAGE), MC_(BODY_PART), MC_(NOT_BODY_PART), MC_(TEST), MC_(NOT_TEST), diff --git a/src/matcher_parser_parse.y b/src/matcher_parser_parse.y index 2947544c6..906a623eb 100644 --- a/src/matcher_parser_parse.y +++ b/src/matcher_parser_parse.y @@ -1,7 +1,7 @@ %{ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (c) 2001-2007 by Hiroyuki Yamamoto & The Claws Mail Team + * Copyright (c) 2001-2014 by 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 @@ -324,6 +324,7 @@ int matcher_parserwrap(void) %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE +%token MATCHER_HEADERS_CONT MATCHER_NOT_HEADERS_CONT %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART %token MATCHER_TEST MATCHER_NOT_TEST MATCHER_MATCHCASE MATCHER_MATCH %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE @@ -1121,6 +1122,24 @@ MATCHER_ALL expr = $3; prop = matcherprop_new(criteria, NULL, match_type, expr, 0); } +| MATCHER_HEADERS_CONT match_type MATCHER_STRING +{ + gint criteria = 0; + gchar *expr = NULL; + matcher_is_fast = FALSE; + criteria = MATCHCRITERIA_HEADERS_CONT; + expr = $3; + prop = matcherprop_new(criteria, NULL, match_type, expr, 0); +} +| MATCHER_NOT_HEADERS_CONT match_type MATCHER_STRING +{ + gint criteria = 0; + gchar *expr = NULL; + matcher_is_fast = FALSE; + criteria = MATCHCRITERIA_NOT_HEADERS_CONT; + expr = $3; + prop = matcherprop_new(criteria, NULL, match_type, expr, 0); +} | MATCHER_FOUND_IN_ADDRESSBOOK MATCHER_STRING { header = g_strdup($2); diff --git a/src/plugins/perl/cm_perl.pod b/src/plugins/perl/cm_perl.pod index 7515fe390..bb190a338 100644 --- a/src/plugins/perl/cm_perl.pod +++ b/src/plugins/perl/cm_perl.pod @@ -244,11 +244,12 @@ Filename -- should not be modified =item regexpcase WHERE WHAT The matching functions have a special syntax. The first argument -is either any of to_or_cc, body_part, headers_part, message, to, -from, subject, cc, newsgroups, inreplyto, references, or tag (those -strings may or may not be quoted), the patter matching works on -that area. If it is any other string (which must then be quoted), -this string is taken to be the name of a header field. +is either any of to_or_cc, body_part, headers_part, headers_cont, +message, to, from, subject, cc, newsgroups, inreplyto, +references, or tag (those strings may or may not be quoted), the +pattern matching works on that area. If it is any other string +(which must then be quoted), this string is taken to be the name +of a header field. The second argument is the string to look for. For match, matchcase, regexp and regexpcase we have case sensitive normal diff --git a/src/plugins/perl/perl_plugin.c b/src/plugins/perl/perl_plugin.c index fd69a32d5..767e84838 100644 --- a/src/plugins/perl/perl_plugin.c +++ b/src/plugins/perl/perl_plugin.c @@ -1708,7 +1708,7 @@ static int perl_init(void) " qw(forwarded locked colorlabel match matchcase),\n" " qw(regexp regexpcase test),\n" " qw(to cc subject from to_or_cc newsgroups inreplyto),\n" -" qw(references body_part headers_part message),\n" +" qw(references body_part headers_part headers_cont message),\n" " qw(size_greater size_smaller size_equal),\n" " qw(score_greater score_lower score_equal),\n" " qw(age_greater age_lower partial tagged $permanent));\n" @@ -1737,6 +1737,7 @@ static int perl_init(void) "sub references { return \"references\"; }\n" "sub body_part { return \"body_part\"; }\n" "sub headers_part { return \"headers_part\"; }\n" +"sub headers_cont { return \"headers_cont\"; }\n" "sub message { return \"message\"; }\n" "# access the mail directly\n" "sub header {\n" @@ -1994,6 +1995,16 @@ static int perl_init(void) " return ($myheader =~ m/$what/) unless $nocase;\n" " return ($myheader =~ m/$what/i);\n" " }\n" +" } elsif($where eq \"headers_cont\") {\n" +" (my $myheader = header_as_string_()) =~ s{^\\S+:\\s*}{};\n" +" if(not $regexp) {\n" +" $myheader =~ s/\\s+/ /g;\n" +" return (index($myheader,$what) != -1) unless $nocase;\n" +" return (index(lc2_($myheader),lc2_($what)) != -1);\n" +" } else {\n" +" return ($myheader =~ m/$what/) unless $nocase;\n" +" return ($myheader =~ m/$what/i);\n" +" }\n" " } elsif($where eq \"message\") {\n" " my $message = header_as_string_();\n" " $message .= \"\\n\".body();\n" diff --git a/src/plugins/perl/tools/matcherrc2perlfilter.pl b/src/plugins/perl/tools/matcherrc2perlfilter.pl index 537237206..8b0dad93e 100755 --- a/src/plugins/perl/tools/matcherrc2perlfilter.pl +++ b/src/plugins/perl/tools/matcherrc2perlfilter.pl @@ -7,7 +7,7 @@ # intended to get you started. If you choose to use the Perl plugin, # consider rewriting your rules. # -# Copyright (C) 2004 Holger Berndt +# Copyright (C) 2004-2014 Holger Berndt # # # This file is free software; you can redistribute it and/or modify it @@ -128,6 +128,7 @@ sub convert { $token eq "inreplyto" or $token eq "references" or $token eq "headers_part" or + $token eq "headers_cont" or $token eq "body_part" or $token eq "message") { my $match = shift; diff --git a/src/prefs_matcher.c b/src/prefs_matcher.c index 1f2d30fc7..bb9c72334 100644 --- a/src/prefs_matcher.c +++ b/src/prefs_matcher.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team + * Copyright (C) 1999-2014 Hiroyuki Yamamoto and 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 @@ -186,7 +186,9 @@ enum { CRITERIA_SIGNED = 38, CRITERIA_AGE_GREATER_HOURS = 39, - CRITERIA_AGE_LOWER_HOURS = 40 + CRITERIA_AGE_LOWER_HOURS = 40, + + CRITERIA_HEADERS_CONT = 41 }; enum { @@ -379,6 +381,7 @@ static void prefs_matcher_models_create(void) store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); COMBOBOX_ADD(store, _("headers part"), CRITERIA_HEADERS_PART); + COMBOBOX_ADD(store, _("headers values"), CRITERIA_HEADERS_CONT); COMBOBOX_ADD(store, _("body part"), CRITERIA_BODY_PART); COMBOBOX_ADD(store, _("whole message"), CRITERIA_MESSAGE); matcher.model_phrase = GTK_TREE_MODEL(store); @@ -1148,6 +1151,9 @@ static gint prefs_matcher_get_criteria_from_matching(gint matching_id) case MATCHCRITERIA_NOT_HEADERS_PART: case MATCHCRITERIA_HEADERS_PART: return CRITERIA_HEADERS_PART; + case MATCHCRITERIA_NOT_HEADERS_CONT: + case MATCHCRITERIA_HEADERS_CONT: + return CRITERIA_HEADERS_CONT; case MATCHCRITERIA_NOT_HEADER: case MATCHCRITERIA_HEADER: return CRITERIA_HEADER; @@ -1263,6 +1269,8 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id) return MATCHCRITERIA_HEADER; case CRITERIA_HEADERS_PART: return MATCHCRITERIA_HEADERS_PART; + case CRITERIA_HEADERS_CONT: + return MATCHCRITERIA_HEADERS_CONT; case CRITERIA_BODY_PART: return MATCHCRITERIA_BODY_PART; case CRITERIA_MESSAGE: @@ -1347,6 +1355,8 @@ static gint prefs_matcher_not_criteria(gint matcher_criteria) return MATCHCRITERIA_NOT_HEADER; case MATCHCRITERIA_HEADERS_PART: return MATCHCRITERIA_NOT_HEADERS_PART; + case MATCHCRITERIA_HEADERS_CONT: + return MATCHCRITERIA_NOT_HEADERS_CONT; case MATCHCRITERIA_MESSAGE: return MATCHCRITERIA_NOT_MESSAGE; case MATCHCRITERIA_TEST: @@ -1411,6 +1421,7 @@ static gint prefs_matcher_get_pred(const gint criteria) case CRITERIA_REFERENCES: case CRITERIA_HEADER: case CRITERIA_HEADERS_PART: + case CRITERIA_HEADERS_CONT: case CRITERIA_BODY_PART: case CRITERIA_MESSAGE: case CRITERIA_TAG: @@ -1514,6 +1525,7 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void) case CRITERIA_INREPLYTO: case CRITERIA_REFERENCES: case CRITERIA_HEADERS_PART: + case CRITERIA_HEADERS_CONT: case CRITERIA_BODY_PART: case CRITERIA_MESSAGE: expr = gtk_entry_get_text(GTK_ENTRY(matcher.string_entry)); @@ -1829,6 +1841,10 @@ static void prefs_matcher_second_criteria_sel(GtkWidget *widget, gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Headers part")); break; + case CRITERIA_HEADERS_CONT: + gtk_label_set_text(GTK_LABEL(matcher.match_label), + _("Headers values")); + break; case CRITERIA_BODY_PART: gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Body part")); @@ -2317,6 +2333,7 @@ static void prefs_matcher_set_criteria(const gint criteria) match_criteria = MATCH_HEADER; break; case CRITERIA_HEADERS_PART: + case CRITERIA_HEADERS_CONT: case CRITERIA_BODY_PART: case CRITERIA_MESSAGE: match_criteria = MATCH_PHRASE; @@ -2448,6 +2465,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector, case MATCHCRITERIA_NOT_REFERENCES: case MATCHCRITERIA_NOT_HEADER: case MATCHCRITERIA_NOT_HEADERS_PART: + case MATCHCRITERIA_NOT_HEADERS_CONT: case MATCHCRITERIA_NOT_MESSAGE: case MATCHCRITERIA_NOT_BODY_PART: case MATCHCRITERIA_NOT_TEST: @@ -2470,6 +2488,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector, case MATCHCRITERIA_NOT_INREPLYTO: case MATCHCRITERIA_NOT_REFERENCES: case MATCHCRITERIA_NOT_HEADERS_PART: + case MATCHCRITERIA_NOT_HEADERS_CONT: case MATCHCRITERIA_NOT_BODY_PART: case MATCHCRITERIA_NOT_MESSAGE: case MATCHCRITERIA_NOT_TEST: @@ -2483,6 +2502,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector, case MATCHCRITERIA_INREPLYTO: case MATCHCRITERIA_REFERENCES: case MATCHCRITERIA_HEADERS_PART: + case MATCHCRITERIA_HEADERS_CONT: case MATCHCRITERIA_BODY_PART: case MATCHCRITERIA_MESSAGE: case MATCHCRITERIA_TEST: @@ -2593,6 +2613,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector, case CRITERIA_REFERENCES: case CRITERIA_HEADER: case CRITERIA_HEADERS_PART: + case CRITERIA_HEADERS_CONT: case CRITERIA_BODY_PART: case CRITERIA_MESSAGE: case CRITERIA_TAG: diff --git a/src/procheader.c b/src/procheader.c index 330a3107a..bfa31f106 100644 --- a/src/procheader.c +++ b/src/procheader.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team + * Copyright (C) 1999-2014 Hiroyuki Yamamoto and 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 @@ -1091,3 +1091,31 @@ void procheader_entries_free (HeaderEntry *entries) } } +gboolean procheader_header_is_internal(const gchar *hdr_name) +{ + const gchar *internal_hdrs[] = { + "AF:", "NF:", "PS:", "SRH:", "SFN:", "DSR:", "MID:", "CFG:", + "PT:", "S:", "RQ:", "SSV:", "NSV:", "SSH:", "R:", "MAID:", + "SCF:", "RMID:", "FMID:", "NAID:", + "X-Claws-Account-Id:", + "X-Claws-Sign:", + "X-Claws-Encrypt:", + "X-Claws-Privacy-System:", + "X-Claws-Auto-Wrapping:", + "X-Claws-Auto-Indent:", + "X-Claws-End-Special-Headers:", + "X-Sylpheed-Account-Id:", + "X-Sylpheed-Sign:", + "X-Sylpheed-Encrypt:", + "X-Sylpheed-Privacy-System:", + "X-Sylpheed-End-Special-Headers:", + NULL + }; + int i; + + for (i = 0; internal_hdrs[i]; i++) { + if (!strcmp(hdr_name, internal_hdrs[i])) + return TRUE; + } + return FALSE; +} diff --git a/src/procheader.h b/src/procheader.h index b8e48fc3e..e4cb92d7f 100644 --- a/src/procheader.h +++ b/src/procheader.h @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team + * Copyright (C) 1999-2014 Hiroyuki Yamamoto and 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 @@ -95,4 +95,5 @@ gint procheader_get_header_from_msginfo (MsgInfo *msginfo, HeaderEntry *procheader_entries_from_str(const gchar *str); void procheader_entries_free (HeaderEntry *entries); +gboolean procheader_header_is_internal (const gchar *hdr_name); #endif /* __PROCHEADER_H__ */ diff --git a/src/textview.c b/src/textview.c index ae6de8244..b2a0985a8 100644 --- a/src/textview.c +++ b/src/textview.c @@ -1874,27 +1874,6 @@ void textview_set_position(TextView *textview, gint pos) gtkut_text_view_set_position(text, pos); } -static gboolean header_is_internal(Header *header) -{ - const gchar *internal_hdrs[] = - {"AF:", "NF:", "PS:", "SRH:", "SFN:", "DSR:", "MID:", - "CFG:", "PT:", "S:", "RQ:", "SSV:", "NSV:", "SSH:", - "R:", "MAID:", "SCF:", "RMID:", "FMID:", "NAID:", - "X-Claws-Account-Id:", "X-Claws-Sign:", "X-Claws-Encrypt:", - "X-Claws-Privacy-System:", "X-Claws-End-Special-Headers:", - "X-Sylpheed-Account-Id:", "X-Sylpheed-Sign:", "X-Sylpheed-Encrypt:", - "X-Claws-Auto-Wrapping:", "X-Claws-Auto-Indent:", - "X-Sylpheed-Privacy-System:", "X-Sylpheed-End-Special-Headers:", - NULL}; - int i; - - for (i = 0; internal_hdrs[i]; i++) { - if (!strcmp(header->name, internal_hdrs[i])) - return TRUE; - } - return FALSE; -} - static GPtrArray *textview_scan_header(TextView *textview, FILE *fp) { gchar buf[BUFFSIZE]; @@ -1910,7 +1889,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp) sorted_headers = g_ptr_array_new(); for (i = 0; i < headers->len; i++) { header = g_ptr_array_index(headers, i); - if (!header_is_internal(header)) + if (!procheader_header_is_internal(header->name)) g_ptr_array_add(sorted_headers, header); else procheader_header_free(header); @@ -1953,7 +1932,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp) if (prefs_common.show_other_header) { for (i = 0; i < headers->len; i++) { header = g_ptr_array_index(headers, i); - if (!header_is_internal(header)) { + if (!procheader_header_is_internal(header->name)) { g_ptr_array_add(sorted_headers, header); } else { procheader_header_free(header); diff --git a/tools/filter_conv_new.pl b/tools/filter_conv_new.pl index adc627833..4bae1bc03 100755 --- a/tools/filter_conv_new.pl +++ b/tools/filter_conv_new.pl @@ -179,6 +179,8 @@ foreach my $element ($xmlobj->child("filter")->children("rule")) { } if ($condition eq "match-any-header") { $new_filter .= "headers_part "; + } elsif ($condition eq "match-header-content") { + $new_filter .= "headers_cont "; } elsif ($condition eq "match-to-or-cc") { $new_filter .= "to_or_cc "; } elsif ($condition eq "match-body-text") {