Add new quicksearch for header's content only
authorRicardo Mones <ricardo@mones.org>
Wed, 10 Sep 2014 21:37:11 +0000 (23:37 +0200)
committerRicardo Mones <ricardo@mones.org>
Thu, 11 Sep 2014 10:24:02 +0000 (12:24 +0200)
• 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 <h.m.brand@xs4all.nl>, 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

15 files changed:
README
src/advsearch.c
src/gtk/quicksearch.c
src/imap.c
src/matcher.c
src/matcher.h
src/matcher_parser_parse.y
src/plugins/perl/cm_perl.pod
src/plugins/perl/perl_plugin.c
src/plugins/perl/tools/matcherrc2perlfilter.pl
src/prefs_matcher.c
src/procheader.c
src/procheader.h
src/textview.c
tools/filter_conv_new.pl

diff --git a/README b/README
index af49120..8d23cfe 100644 (file)
--- 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 #
index 26a4e34..7439bb5 100644 (file)
@@ -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  },
index 54b6b92..c7c705e 100644 (file)
@@ -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 #"),
index 5608dc8..0ec8131 100644 (file)
@@ -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)
index 4382c59..1f191d9 100644 (file)
@@ -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;
 
index 62d5352..b8e637d 100644 (file)
@@ -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),
index 2947544..906a623 100644 (file)
@@ -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);
index 7515fe3..bb190a3 100644 (file)
@@ -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
index fd69a32..767e848 100644 (file)
@@ -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"
index 5372372..8b0dad9 100755 (executable)
@@ -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;
index 1f2d30f..bb9c723 100644 (file)
@@ -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:
index 330a310..bfa31f1 100644 (file)
@@ -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;
+}
index b8e48fc..e4cb92d 100644 (file)
@@ -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__ */
index ae6de82..b2a0985 100644 (file)
@@ -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);
index adc6278..4bae1bc 100755 (executable)
@@ -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") {