talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 4ce9b9a45da2885ee3d6884fec408de45720b0a4
parent 1a7555f59e6207f6f81dee03f69954ecfce93708
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 24 Aug 2018 09:58:09 +0200

Filtering: add date_before and date_after

Diffstat:
Msrc/advsearch.c | 2++
Msrc/gtk/quicksearch.c | 4++++
Msrc/matcher.c | 48++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/matcher.h | 1+
Msrc/matcher_parser_parse.y | 24++++++++++++++++++++++++
5 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/src/advsearch.c b/src/advsearch.c @@ -157,6 +157,8 @@ gchar *advsearch_expand_search_string(const gchar *search_string) { "c", "cc", 1, TRUE, TRUE }, { "C", "to_or_cc", 1, TRUE, TRUE }, { "D", "deleted", 0, FALSE, FALSE }, + { "da", "date_after", 1, FALSE, TRUE }, + { "db", "date_before", 1, FALSE, TRUE }, { "e", "header \"Sender\"", 1, TRUE, TRUE }, { "E", "execute", 1, FALSE, TRUE }, { "f", "from", 1, TRUE, TRUE }, diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c @@ -485,6 +485,10 @@ static gchar *search_descr_strings[] = { "c S", N_("messages carbon-copied to S"), "C S", N_("message is either To: or Cc: to S"), "D", N_("deleted messages"), /** how I can filter deleted messages **/ + "da \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is after requested date " + "(time is optional)"), + "db \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is before requested date " + "(time is optional)"), "e S", N_("messages which contain S in the Sender field"), "E S", N_("true if execute \"S\" succeeds"), "f S", N_("messages originating from user S"), diff --git a/src/matcher.c b/src/matcher.c @@ -112,6 +112,8 @@ static const MatchParser matchparser_tab[] = { {MATCHCRITERIA_AGE_LOWER, "age_lower"}, {MATCHCRITERIA_AGE_GREATER_HOURS, "age_greater_hours"}, {MATCHCRITERIA_AGE_LOWER_HOURS, "age_lower_hours"}, + {MATCHCRITERIA_DATE_AFTER, "date_after"}, + {MATCHCRITERIA_DATE_BEFORE, "date_before"}, {MATCHCRITERIA_NEWSGROUPS, "newsgroups"}, {MATCHCRITERIA_NOT_NEWSGROUPS, "~newsgroups"}, {MATCHCRITERIA_MESSAGEID, "messageid"}, @@ -932,6 +934,27 @@ static gboolean matcherprop_match(MatcherProp *prop, } return ret; } + case MATCHCRITERIA_DATE_AFTER: + { + gboolean ret; + + ret = prop->value < info->date_t; + + /* debug output */ + if (debug_filtering_session + && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) { + if (ret) { + log_print(LOG_DEBUG_FILTERING, + "message date [ %ld ] is after [ %d ]\n", + info->date_t, prop->value); + } else { + log_print(LOG_DEBUG_FILTERING, + "message date [ %ld ] is not after [ %d ]\n", + info->date_t, prop->value); + } + } + return ret; + } case MATCHCRITERIA_AGE_LOWER: age_mult_hours = 24; /* Fallthrough intended */ @@ -959,6 +982,27 @@ static gboolean matcherprop_match(MatcherProp *prop, } return ret; } + case MATCHCRITERIA_DATE_BEFORE: + { + gboolean ret; + + ret = prop->value > info->date_t; + + /* debug output */ + if (debug_filtering_session + && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) { + if (ret) { + log_print(LOG_DEBUG_FILTERING, + "message date [ %ld ] is before [ %d ]\n", + info->date_t, prop->value); + } else { + log_print(LOG_DEBUG_FILTERING, + "message date [ %ld ] is not before [ %d ]\n", + info->date_t, prop->value); + } + } + return ret; + } case MATCHCRITERIA_SCORE_GREATER: { gboolean ret = (info->score > prop->value); @@ -1912,6 +1956,8 @@ gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info) case MATCHCRITERIA_AGE_LOWER: case MATCHCRITERIA_AGE_GREATER_HOURS: case MATCHCRITERIA_AGE_LOWER_HOURS: + case MATCHCRITERIA_DATE_AFTER: + case MATCHCRITERIA_DATE_BEFORE: case MATCHCRITERIA_NEWSGROUPS: case MATCHCRITERIA_NOT_NEWSGROUPS: case MATCHCRITERIA_MESSAGEID: @@ -2104,6 +2150,8 @@ gchar *matcherprop_to_string(MatcherProp *matcher) return g_strdup(criteria_str); case MATCHCRITERIA_TEST: case MATCHCRITERIA_NOT_TEST: + case MATCHCRITERIA_DATE_AFTER: + case MATCHCRITERIA_DATE_BEFORE: quoted_expr = matcher_quote_str(matcher->expr); matcher_str = g_strdup_printf("%s \"%s\"", criteria_str, quoted_expr); diff --git a/src/matcher.h b/src/matcher.h @@ -88,6 +88,7 @@ enum { MC_(TO_OR_CC), MC_(NOT_TO_AND_NOT_CC), MC_(AGE_GREATER), MC_(AGE_LOWER), MC_(AGE_GREATER_HOURS), MC_(AGE_LOWER_HOURS), + MC_(DATE_AFTER), MC_(DATE_BEFORE), MC_(NEWSGROUPS), MC_(NOT_NEWSGROUPS), MC_(MESSAGEID), MC_(NOT_MESSAGEID), MC_(INREPLYTO), MC_(NOT_INREPLYTO), diff --git a/src/matcher_parser_parse.y b/src/matcher_parser_parse.y @@ -25,6 +25,7 @@ #include "utils.h" #include "filtering.h" +#include "procheader.h" #include "matcher.h" #include "matcher_parser.h" #include "matcher_parser_lex.h" @@ -326,6 +327,7 @@ int matcher_parserwrap(void) %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS %token MATCHER_AGE_GREATER_HOURS MATCHER_AGE_LOWER_HOURS +%token MATCHER_DATE_AFTER MATCHER_DATE_BEFORE %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO %token MATCHER_MESSAGEID MATCHER_NOT_MESSAGEID %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER @@ -989,6 +991,28 @@ MATCHER_ALL value = strtol($2, NULL, 0); prop = matcherprop_new(criteria, NULL, 0, NULL, value); } +| MATCHER_DATE_AFTER MATCHER_STRING +{ + gint criteria = 0; + gchar *expr = NULL; + time_t value; + + criteria = MATCHCRITERIA_DATE_AFTER; + expr = $2; + value = procheader_date_parse(NULL, expr, 0); + prop = matcherprop_new(criteria, NULL, 0, expr, value); +} +| MATCHER_DATE_BEFORE MATCHER_STRING +{ + gint criteria = 0; + gchar *expr = NULL; + time_t value; + + criteria = MATCHCRITERIA_DATE_BEFORE; + expr = $2; + value = procheader_date_parse(NULL, expr, 0); + prop = matcherprop_new(criteria, NULL, 0, expr, value); +} | MATCHER_NEWSGROUPS match_type MATCHER_STRING { gint criteria = 0;