Make use of all signature separators defined in accounts instead
authorwwp <wwp@free.fr>
Thu, 7 Jun 2018 11:06:58 +0000 (13:06 +0200)
committerwwp <wwp@free.fr>
Thu, 7 Jun 2018 11:06:58 +0000 (13:06 +0200)
of just the hardcoded standard one we use.

src/account.c
src/account.h
src/procmime.c
src/quote_fmt_parse.y
src/textview.c

index 527b16d..b3a92da 100644 (file)
@@ -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;
+}
index 4462f66..649366b 100644 (file)
@@ -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__ */
index 080f27c..f53e530 100644 (file)
@@ -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;
        }
index dc330c1..03c872a 100644 (file)
@@ -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);
        }
 }
index e54b2e8..1ceb031 100644 (file)
@@ -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;