talons

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

commit 0c28ce4c371ae2132cc5b83e418ff36541f3b5ec
parent 494fd9e4405ad4779719618a9e224ea65c0c02b8
Author: wwp <wwp@free.fr>
Date:   Thu,  7 Jun 2018 13:06:58 +0200

Make use of all signature separators defined in accounts instead
of just the hardcoded standard one we use.

Diffstat:
Msrc/account.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/account.h | 5+++++
Msrc/procmime.c | 7++++++-
Msrc/quote_fmt_parse.y | 6++++--
Msrc/textview.c | 23+++++++++++++++++++++--
5 files changed, 108 insertions(+), 5 deletions(-)

diff --git a/src/account.c b/src/account.c @@ -1925,3 +1925,75 @@ gboolean password_get(const gchar *user, } return FALSE; } + +static GSList *account_signatures_list = NULL; + +/* create a list of unique signatures from accounts list */ +void account_signatures_matchlist_create(void) +{ + GList *cur_ac = NULL; + PrefsAccount *ac_prefs = NULL; + + if (account_signatures_list) + return; + + account_signatures_list = g_slist_prepend(account_signatures_list, g_strdup("-- ")); + for (cur_ac = account_get_list(); + cur_ac != NULL; + cur_ac = g_list_next(cur_ac)) { + ac_prefs = (PrefsAccount *)cur_ac->data; + + if (ac_prefs->sig_sep && *ac_prefs->sig_sep != '\0') { + if (!g_slist_find_custom(account_signatures_list, ac_prefs->sig_sep, + (GCompareFunc)strcmp2)) { + account_signatures_list = g_slist_prepend(account_signatures_list, + g_strdup(ac_prefs->sig_sep)); + } + } + } +} + +/* delete the list of signatures created by account_signatures_matchlist_create() */ +void account_signatures_matchlist_delete(void) +{ + if (account_signatures_list) { + slist_free_strings_full(account_signatures_list); + account_signatures_list = NULL; + } +} + +/* match a string against all signatures in list, using the specified format */ +gboolean account_signatures_matchlist_str_found(const gchar *str, const gchar *format) +{ + gchar *tmp = NULL; + gboolean found = FALSE; + GSList *item; + + for (item = account_signatures_list; + item != NULL && !found; + item = g_slist_next(item)) { + tmp = g_strdup_printf(format, (gchar *)item->data); + found = (strcmp(tmp, str) == 0); + g_free(tmp); + } + return found; +} + +/* match M first char of a string against all signatures in list, using the specified format */ +gboolean account_signatures_matchlist_nchar_found(const gchar *str, const gchar *format) +{ + gchar *tmp = NULL; + gboolean found = FALSE; + GSList *item; + gint len; + + for (item = account_signatures_list; + item != NULL && !found; + item = g_slist_next(item)) { + tmp = g_strdup_printf(format, (gchar *)item->data); + len = strlen(tmp); + found = (strncmp(tmp, str, len) == 0); + g_free(tmp); + } + return found; +} diff --git a/src/account.h b/src/account.h @@ -80,4 +80,9 @@ gboolean password_get(const gchar *user, guint16 port, gchar **password); +void account_signatures_matchlist_create (void); +void account_signatures_matchlist_delete (void); +gboolean account_signatures_matchlist_str_found (const gchar *str, const gchar *format); +gboolean account_signatures_matchlist_nchar_found (const gchar *str, const gchar *format); + #endif /* __ACCOUNT_H__ */ diff --git a/src/procmime.c b/src/procmime.c @@ -52,6 +52,7 @@ #include "alertpanel.h" #include "timing.h" #include "privacy.h" +#include "account.h" static GHashTable *procmime_get_mime_type_table (void); static MimeInfo *procmime_scan_file_short(const gchar *filename); @@ -293,7 +294,7 @@ static int procmime_fclose(FILE *fp) gint llen = 0; \ strretchomp(lastline); \ llen = strlen(lastline); \ - if (lastline[llen-1] == ' ' && strcmp(lastline,"-- ") && \ + if (lastline[llen-1] == ' ' && !account_signatures_matchlist_str_found(lastline, "%s") && \ !(llen == 2 && lastline[1] == ' ' && strchr(prefs_common.quote_chars, lastline[0]))) { \ /* this is flowed */ \ if (delsp) \ @@ -381,6 +382,8 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo) tmp_file = TRUE; readend = mimeinfo->offset + mimeinfo->length; + account_signatures_matchlist_create(); /* FLUSH_LASTLINE will use it */ + *buf = '\0'; if (encoding == ENC_QUOTED_PRINTABLE) { while ((ftell(infp) < readend) && (SC_FGETS(buf, sizeof(buf), infp) != NULL)) { @@ -502,6 +505,8 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo) procmime_fclose(outfp); procmime_fclose(infp); + account_signatures_matchlist_delete(); + if (err == TRUE) { return FALSE; } diff --git a/src/quote_fmt_parse.y b/src/quote_fmt_parse.y @@ -487,10 +487,11 @@ static void quote_fmt_show_msg(MsgInfo *msginfo, const gchar *body, if (fp == NULL) g_warning("Can't get text part"); else { + account_signatures_matchlist_create(); while (fgets(buf, sizeof(buf), fp) != NULL) { strcrchomp(buf); - - if (!signature && strncmp(buf, "-- \n", 4) == 0) + + if (!signature && account_signatures_matchlist_nchar_found(buf, "%\n")) break; if (quoted && quote_str) @@ -498,6 +499,7 @@ static void quote_fmt_show_msg(MsgInfo *msginfo, const gchar *body, INSERT(buf); } + account_signatures_matchlist_delete(); fclose(fp); } } diff --git a/src/textview.c b/src/textview.c @@ -1081,6 +1081,8 @@ static void textview_write_body(TextView *textview, MimeInfo *mimeinfo) procmime_decode_content(mimeinfo); + account_signatures_matchlist_create(); + if (!g_ascii_strcasecmp(mimeinfo->subtype, "html") && prefs_common.render_html) { gchar *filename; @@ -1162,6 +1164,7 @@ static void textview_write_body(TextView *textview, MimeInfo *mimeinfo) fclose(tmpfp); waitpid(pid, pfd, 0); g_unlink(fname); + account_signatures_matchlist_delete(); return; } } @@ -1191,11 +1194,13 @@ textview_default: tmpfp = g_fopen(mimeinfo->data.filename, "rb"); if (!tmpfp) { FILE_OP_ERROR(mimeinfo->data.filename, "fopen"); + account_signatures_matchlist_delete(); return; } if (fseek(tmpfp, mimeinfo->offset, SEEK_SET) < 0) { FILE_OP_ERROR(mimeinfo->data.filename, "fseek"); fclose(tmpfp); + account_signatures_matchlist_delete(); return; } debug_print("Viewing text content of type: %s (length: %d)\n", mimeinfo->subtype, mimeinfo->length); @@ -1205,6 +1210,7 @@ textview_default: textview_write_line(textview, buf, conv, TRUE); if (textview->stop_loading) { fclose(tmpfp); + account_signatures_matchlist_delete(); return; } wrote += ftell(tmpfp)-i; @@ -1217,6 +1223,8 @@ textview_default: fclose(tmpfp); } + account_signatures_matchlist_delete(); + conv_code_converter_destroy(conv); procmime_force_encoding(0); @@ -1253,6 +1261,8 @@ static void textview_show_html(TextView *textview, FILE *fp, parser = sc_html_parser_new(fp, conv); cm_return_if_fail(parser != NULL); + account_signatures_matchlist_create(); + while ((str = sc_html_parse(parser)) != NULL) { if (parser->state == SC_HTML_HREF) { /* first time : get and copy the URL */ @@ -1277,10 +1287,14 @@ static void textview_show_html(TextView *textview, FILE *fp, if (lines % 500 == 0) GTK_EVENTS_FLUSH(); if (textview->stop_loading) { + account_signatures_matchlist_delete(); return; } } textview_write_line(textview, "\n", NULL, FALSE); + + account_signatures_matchlist_delete(); + sc_html_parser_destroy(parser); } @@ -1294,16 +1308,21 @@ static void textview_show_ertf(TextView *textview, FILE *fp, parser = ertf_parser_new(fp, conv); cm_return_if_fail(parser != NULL); + account_signatures_matchlist_create(); + while ((str = ertf_parse(parser)) != NULL) { textview_write_line(textview, str, NULL, FALSE); lines++; if (lines % 500 == 0) GTK_EVENTS_FLUSH(); if (textview->stop_loading) { + account_signatures_matchlist_delete(); return; } } + account_signatures_matchlist_delete(); + ertf_parser_destroy(parser); } @@ -1644,8 +1663,8 @@ static void textview_write_line(TextView *textview, const gchar *str, else if (strncmp(buf, "@@ ", 3) == 0 && strcmp(buf+strlen(buf)-4, " @@\n") == 0) fg_color = "diff-hunk"; - } else if (strcmp(buf,"-- \n") == 0 - || strcmp(buf, "- -- \n") == 0 + } else if (account_signatures_matchlist_str_found(buf,"%s\n") + || account_signatures_matchlist_str_found(buf, "- %s\n") || textview->is_in_signature) { fg_color = "signature"; textview->is_in_signature = TRUE;