diff options
Diffstat (limited to 'composer')
-rw-r--r-- | composer/ChangeLog | 7 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 109 |
2 files changed, 112 insertions, 4 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog index dc3f9798f0..c9b084d7f3 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,10 @@ +2002-07-29 Radek Doulik <rodo@ximian.com> + + * e-msg-composer.c (encode_signature_name): new helper function + (decode_signature_name): new helper function + (get_signature_html): use encode_signature_name + (set_signature_gui): use decode_signature_name + 2002-07-26 Radek Doulik <rodo@ximian.com> * e-msg-composer.c (do_exit): don't assert on default, when ESC is diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index b9effd4899..76981765a8 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -897,6 +897,98 @@ prepare_engine (EMsgComposer *composer) } static gchar * +encode_signature_name (const gchar *name) +{ + const gchar *s; + gchar *ename, *e; + gint len = 0; + + s = name; + while (*s) { + len ++; + if (*s == '"' || *s == '.' || *s == '=') + len ++; + s ++; + } + + ename = g_new (gchar, len + 1); + + s = name; + e = ename; + while (*s) { + if (*s == '"') { + *e = '.'; + e ++; + *e = '1'; + e ++; + } else if (*s == '=') { + *e = '.'; + e ++; + *e = '2'; + e ++; + } else { + *e = *s; + e ++; + } + if (*s == '.') { + *e = '.'; + e ++; + } + s ++; + } + *e = 0; + + printf ("name: '%s'\nencoded name: '%s'\n", name, ename); + + return ename; +} + +static gchar * +decode_signature_name (const gchar *name) +{ + const gchar *s; + gchar *dname, *d; + gint len = 0; + + s = name; + while (*s) { + len ++; + if (*s == '.') { + s ++; + if (!*s || !(*s == '.' || *s == '1' || *s == '2')) + return NULL; + } + s ++; + } + + dname = g_new (gchar, len + 1); + + s = name; + d = dname; + while (*s) { + if (*s == '.') { + s ++; + if (!*s || !(*s == '.' || *s == '1' || *s == '2')) { + g_free (dname); + return NULL; + } + if (*s == '1') + *d = '"'; + else if (*s == '2') + *d = '='; + else + *d = '.'; + } else + *d = *s; + d ++; + s ++; + } + *d = 0; + + return dname; +} + +static gchar * get_signature_html (EMsgComposer *composer) { gboolean format_html = FALSE; @@ -945,6 +1037,11 @@ get_signature_html (EMsgComposer *composer) /* printf ("text: %s\n", text); */ if (text) { + gchar *encoded_name = NULL; + + if (composer->signature) + encoded_name = encode_signature_name (composer->signature->name); + /* The signature dash convention ("-- \n") is specified in the * "Son of RFC 1036": http://www.chemie.fu-berlin.de/outerspace/netnews/son-of-1036.html, * section 4.3.2. @@ -955,12 +1052,13 @@ get_signature_html (EMsgComposer *composer) "%s%s%s%s" "</TD></TR></TABLE>", composer->signature ? "name:" : "auto", - composer->signature ? composer->signature->name : "", + composer->signature ? encoded_name : "", format_html ? "" : "<PRE>\n", format_html || (!strncmp ("-- \n", text, 4) || strstr(text, "\n-- \n")) ? "" : "-- \n", text, format_html ? "" : "</PRE>\n"); g_free (text); + g_free (encoded_name); text = html; } @@ -3226,17 +3324,20 @@ set_signature_gui (EMsgComposer *composer) if (ev._major == CORBA_NO_EXCEPTION && str) { if (!strncmp (str, "name:", 5)) { GList *list = NULL; + gchar *decoded_signature_name = decode_signature_name (str + 5); list = mail_config_get_signature_list (); - if (list) + if (list && decoded_signature_name) for (; list; list = list->next) { - if (!strcmp (str + 5, ((MailConfigSignature *) list->data)->name)) + if (!strcmp (decoded_signature_name, + ((MailConfigSignature *) list->data)->name)) break; } - if (list) + if (list && decoded_signature_name) composer->signature = (MailConfigSignature *) list->data; else composer->auto_signature = TRUE; + g_free (decoded_signature_name); } else if (!strcmp (str, "auto")) { composer->auto_signature = TRUE; } |