diff options
Diffstat (limited to 'mail/mail-format.c')
-rw-r--r-- | mail/mail-format.c | 263 |
1 files changed, 146 insertions, 117 deletions
diff --git a/mail/mail-format.c b/mail/mail-format.c index acf2753009..391548601a 100644 --- a/mail/mail-format.c +++ b/mail/mail-format.c @@ -592,7 +592,8 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) { const char *info; char *htmlinfo; - + char *fmt; + /* Start the table, create the pop-up object. */ mail_html_write (md->html, md->stream, "<table cellspacing=0 cellpadding=0>" @@ -601,13 +602,15 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) "<td><table width=3 cellspacing=0 cellpadding=0><tr><td></td></tr></table></td>" "<td><font size=-1>", get_cid (part, md), mime_type); - + /* Write the MIME type */ info = gnome_vfs_mime_get_value (mime_type, "description"); htmlinfo = e_text_to_html (info ? info : mime_type, 0); - mail_html_write (md->html, md->stream, _("%s attachment"), htmlinfo); + fmt = e_utf8_from_locale_string (_("%s attachment")); + mail_html_write (md->html, md->stream, fmt, htmlinfo); + g_free (fmt); g_free (htmlinfo); - + /* Write the name, if we have it. */ info = camel_mime_part_get_filename (part); if (info) { @@ -615,7 +618,7 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) mail_html_write (md->html, md->stream, " (%s)", htmlinfo); g_free (htmlinfo); } - + /* Write a description, if we have one. */ info = camel_mime_part_get_description (part); if (info) { @@ -623,7 +626,7 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) mail_html_write (md->html, md->stream, ", \"%s\"", htmlinfo); g_free (htmlinfo); } - + #if 0 /* Describe the click action, if any. */ if (action) { @@ -631,7 +634,7 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) "<br>Click on the icon to %s.", action); } #endif - + mail_html_write (md->html, md->stream, "</font></td></tr><tr><td height=10><table height=10 cellspacing=0 cellpadding=0>" "<tr><td></td></tr></table></td></tr></table>\n"); @@ -654,24 +657,28 @@ format_mime_part (CamelMimePart *part, MailDisplay *md) if (CAMEL_IS_MULTIPART (wrapper) && camel_multipart_get_number (CAMEL_MULTIPART (wrapper)) == 0) { - mail_error_write (md->html, md->stream, _("Could not parse MIME message. Displaying as source.")); + char *mesg; + + mesg = e_utf8_from_locale_string (_("Could not parse MIME message. Displaying as source.")); + mail_error_write (md->html, md->stream, "%s", mesg); + g_free (mesg); if (mail_content_loaded (wrapper, md)) handle_text_plain (part, "text/plain", md); return TRUE; } - + mime_type = camel_data_wrapper_get_mime_type (wrapper); g_strdown (mime_type); - + handler = mail_lookup_handler (mime_type); if (!handler) { char *id_type; - + /* Special case MIME types that we know that we can't * display but are some kind of plain text to prevent * evil infinite recursion. */ - + if (!strcmp (mime_type, "application/mac-binhex40")) { handler = NULL; } else { @@ -683,19 +690,19 @@ format_mime_part (CamelMimePart *part, MailDisplay *md) } } } - + inline_flags = get_inline_flags (part, md); - + /* No header for anonymous inline parts. */ if (!((inline_flags & I_ACTUALLY) && is_anonymous (part, mime_type))) attachment_header (part, mime_type, md); - + if (handler && handler->builtin && inline_flags & I_DISPLAYED && mail_content_loaded (wrapper, md)) output = (*handler->builtin) (part, mime_type, md); else output = TRUE; - + g_free (mime_type); return output; } @@ -712,9 +719,9 @@ write_field_row_begin (const char *name, gint flags, GtkHTML *html, GtkHTMLStrea char *encoded_name; gboolean bold = (flags & WRITE_BOLD); gboolean nocolumns = (flags & WRITE_NOCOLUMNS); - + encoded_name = e_utf8_from_gtk_string (GTK_WIDGET (html), name); - + if (nocolumns) { mail_html_write (html, stream, "<tr><td>%s%s:%s ", bold ? "<b>" : "", encoded_name, @@ -725,7 +732,7 @@ write_field_row_begin (const char *name, gint flags, GtkHTML *html, GtkHTMLStrea "<b> </%s><td>", bold ? "th" : "td", encoded_name, bold ? "th" : "td"); } - + g_free (encoded_name); } @@ -750,16 +757,16 @@ static void write_text_header (const char *name, const char *value, int flags, GtkHTML *html, GtkHTMLStream *stream) { char *encoded; - + if (value && *value) encoded = e_text_to_html (value, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS); else encoded = ""; - + write_field_row_begin (name, flags, html, stream); - + mail_html_write (html, stream, "%s</td> </tr>", encoded); - + if (value && *value) g_free (encoded); } @@ -781,16 +788,16 @@ elide_quotes (const gchar *str) } static void -write_address(MailDisplay *md, const CamelInternetAddress *addr, const char *field_name, int flags) +write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *field_name, int flags) { const char *name, *email; gint i; - + if (addr == NULL || !camel_internet_address_get (addr, 0, NULL, NULL)) return; - + write_field_row_begin (field_name, flags, md->html, md->stream); - + i = 0; while (camel_internet_address_get (addr, i, &name, &email)) { gboolean have_name = name && *name; @@ -799,22 +806,21 @@ write_address(MailDisplay *md, const CamelInternetAddress *addr, const char *fie gchar *email_arg = NULL; gchar *name_disp = NULL; gchar *email_disp = NULL; - + if (have_name) { name_arg = elide_quotes (name); name_disp = e_text_to_html (name, 0); } - + if (have_email) { email_arg = elide_quotes (email); email_disp = e_text_to_html (email, 0); } - + if (i) mail_html_write (md->html, md->stream, ", "); if (have_email || have_name) { - if (!have_email) { email_arg = g_strdup ("???"); email_disp = g_strdup ("???"); @@ -829,18 +835,21 @@ write_address(MailDisplay *md, const CamelInternetAddress *addr, const char *fie "<a href=\"mailto:%s\">%s</a>", email_arg, email_disp); } - + } else { - - mail_html_write (md->html, md->stream, "<i>Bad Address</i>"); + char *str; + + str = e_utf8_from_locale_string (_("Bad Address")); + mail_html_write (md->html, md->stream, "<i>%s</i>", str); + g_free (str); } - + g_free (name_arg); g_free (email_arg); g_free (name_disp); g_free (email_disp); - - ++i; + + i++; } mail_html_write (md->html, md->stream, "</td></tr>"); } @@ -863,7 +872,8 @@ write_header (CamelMimeMessage *message, MailDisplay *md, write_address (md, camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC), _("Cc"), flags | WRITE_BOLD); } else if (!g_strcasecmp (name, "Subject")) { - write_text_header (_("Subject"), camel_mime_message_get_subject (message), flags | WRITE_BOLD, md->html, md->stream); + write_text_header (_("Subject"), camel_mime_message_get_subject (message), + flags | WRITE_BOLD, md->html, md->stream); } else if (!g_strcasecmp (name, "Date")) { write_date (message, flags | WRITE_BOLD, md->html, md->stream); } else @@ -924,15 +934,11 @@ write_headers (CamelMimeMessage *message, MailDisplay *md) "<tr><td colspan=3 height=10><table height=10 cellpadding=0 cellspacing=0>" "<tr><td></td></tr></table></td></tr>" "<tr><td><table width=10 cellpadding=0 cellspacing=0><tr><td></td></tr></table></td>" - "<td width=\"100%%\"><font color=\"#"); - mail_html_write (md->html, md->stream, fontcolor); - mail_html_write (md->html, md->stream, "\">" + "<td width=\"100%%\"><font color=\"#%s\">" "<table bgcolor=\"#000000\" width=\"100%%\" " "cellspacing=0 cellpadding=1><tr><td>" - "<table bgcolor=\"#"); - mail_html_write (md->html, md->stream, bgcolor); - mail_html_write (md->html, md->stream, "\" width=\"100%%\" cellpadding=0 cellspacing=0>" - "<tr><td><table>\n"); + "<table bgcolor=\"#%s\" width=\"100%%\" cellpadding=0 cellspacing=0>" + "<tr><td><table>\n", fontcolor, bgcolor); if (full) { gheaders = camel_medium_get_headers (CAMEL_MEDIUM (message)); @@ -963,7 +969,7 @@ load_offline_content (MailDisplay *md, gpointer data) { CamelDataWrapper *wrapper = data; CamelStream *stream; - + stream = camel_stream_null_new (); camel_data_wrapper_write_to_stream (wrapper, stream); camel_object_unref (CAMEL_OBJECT (stream)); @@ -975,9 +981,10 @@ mail_content_loaded (CamelDataWrapper *wrapper, MailDisplay *md) { if (!camel_data_wrapper_is_offline (wrapper)) return TRUE; - + camel_object_ref (CAMEL_OBJECT (wrapper)); mail_display_redisplay_when_loaded (md, wrapper, load_offline_content, wrapper); + return FALSE; } @@ -990,26 +997,27 @@ get_data_wrapper_text (CamelDataWrapper *wrapper) CamelStream *memstream; GByteArray *ba; char *text, *end; - + memstream = camel_stream_mem_new (); ba = g_byte_array_new (); camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (memstream), ba); camel_data_wrapper_write_to_stream (wrapper, memstream); camel_object_unref (CAMEL_OBJECT (memstream)); - + for (text = ba->data, end = text + ba->len; text < end; text++) { if (!isspace ((unsigned char)*text)) break; } - + if (text >= end) { g_byte_array_free (ba, TRUE); return NULL; } - + g_byte_array_append (ba, "", 1); text = ba->data; g_byte_array_free (ba, FALSE); + return text; } @@ -1294,15 +1302,25 @@ decode_pgp (CamelStream *ciphertext, CamelStream *plaintext, MailDisplay *md) get_url_for_icon ("gnome-lockscreen.png", md)); if (camel_exception_is_set (&ex)) { - mail_html_write (md->html, md->stream, "%s<br><br>\n", - _("Encrypted message not displayed")); - mail_error_write (md->html, md->stream, - camel_exception_get_description (&ex)); + char *str; + + str = e_utf8_from_locale_string (_("Encrypted message not displayed")); + mail_html_write (md->html, md->stream, "%s<br><br>\n", str); + g_free (str); + + str = e_utf8_from_locale_string (camel_exception_get_description (&ex)); + mail_error_write (md->html, md->stream, "%s", str); camel_exception_clear (&ex); + g_free (str); } else { + char *str1, *str2; + + str1 = e_utf8_from_locale_string (_("Encrypted message")); + str2 = e_utf8_from_locale_string (_("Click icon to decrypt.")); mail_html_write (md->html, md->stream, "%s<br><br>\n%s", - _("Encrypted message"), - _("Click icon to decrypt.")); + str1, str2); + g_free (str1); + g_free (str2); } mail_html_write (md->html, md->stream, "</td></tr></table>"); @@ -1351,23 +1369,31 @@ try_inline_pgp (char *start, MailDisplay *md) static void mail_write_authenticity (MailDisplay *md, CamelCipherValidity *valid) { + char *str; + /* Now display the "seal-of-authenticity" or something... */ if (valid && camel_cipher_validity_get_valid (valid)) { + str = e_utf8_from_locale_string ( + _("This message is digitally signed and " + "has been found to be authentic.")); mail_html_write (md->html, md->stream, "<hr>\n<table><tr valign=top>" "<td><img src=\"%s\"></td>" "<td><font size=-1>%s<br><br>", get_url_for_icon ("wax-seal2.png", md), - _("This message is digitally signed and " - "has been found to be authentic.")); + str); + g_free (str); } else { + str = e_utf8_from_locale_string ( + _("This message is digitally signed but can " + "not be proven to be authentic.")); mail_html_write (md->html, md->stream, "<hr>\n<table><tr valign=top>" "<td><img src=\"%s\"></td>" "<td><font size=-1>%s<br><br>", get_url_for_icon ("wax-seal-broken.png", md), - _("This message is digitally signed but can " - "not be proven to be authentic.")); + str); + g_free (str); } if (valid && camel_cipher_validity_get_description (valid)) { @@ -1464,21 +1490,21 @@ try_uudecoding (char *start, MailDisplay *md) estart = strchr (start, '\n'); if (!estart) return start; - + while (isspace ((unsigned char)*p)) p++; filename = g_strndup (p, estart++ - p); - + /* Make sure there's an end line. */ p = strstr (p, "\nend\n"); if (!p) { g_free (filename); return start; } - + out = g_malloc (p - estart); len = uudecode_step (estart, p - estart, out, &state, &save, &uulen); - + part = fake_mime_part_from_data (out, len, "application/octet-stream"); g_free (out); camel_mime_part_set_filename (part, filename); @@ -1488,7 +1514,7 @@ try_uudecoding (char *start, MailDisplay *md) mail_html_write (md->html, md->stream, "<hr>"); format_mime_part (part, md); - + return p + 4; } @@ -1497,26 +1523,26 @@ try_inline_binhex (char *start, MailDisplay *md) { char *p; CamelMimePart *part; - + /* Find data start. */ p = strstr (start, "\n:"); if (!p) return start; - + /* And data end. */ p = strchr (p + 2, ':'); if (!p || (*(p + 1) != '\n' && *(p + 1) != '\0')) return start; p += 2; - + part = fake_mime_part_from_data (start, p - start, "application/mac-binhex40"); camel_object_hook_event (CAMEL_OBJECT (md->current_message), "finalize", destroy_part, part); - + mail_html_write (md->html, md->stream, "<hr>"); format_mime_part (part, md); - + return p; } @@ -1533,7 +1559,7 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, char *text, *p, *xed; int len, nofill = 0; gboolean enriched; - + if (!translations) { translations = g_hash_table_new (g_strcase_hash, g_strcase_equal); @@ -1566,11 +1592,11 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, g_hash_table_insert (translations, "/param", " -->"); g_hash_table_insert (translations, "np", "<hr>"); } - + text = get_data_wrapper_text (wrapper); if (!text) return FALSE; - + if (!g_strcasecmp (mime_type, "text/richtext")) { enriched = FALSE; mail_html_write (md->html, md->stream, @@ -1580,22 +1606,22 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, mail_html_write (md->html, md->stream, "\n<!-- text/enriched -->\n"); } - + /* This is not great code, but I don't feel like fixing it right * now. I mean, it's just text/enriched... */ p = text; string = g_string_sized_new (2 * strlen (p)); - + while (p) { len = strcspn (p, " <>&\n"); if (len) g_string_sprintfa (string, "%.*s", len, p); - + p += len; if (!*p) break; - + switch (*p++) { case ' ': while (*p == ' ') { @@ -1604,7 +1630,6 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, } g_string_append (string, " "); break; - case '\n': g_string_append (string, " "); if (enriched && nofill <= 0) { @@ -1614,15 +1639,12 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, } } break; - case '>': g_string_append (string, ">"); break; - case '&': g_string_append (string, "&"); break; - case '<': if (enriched) { if (*p == '<') { @@ -1641,7 +1663,7 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, break; } } - + if (strncmp (p, "nofill>", 7) == 0) { nofill++; g_string_append (string, "<pre>"); @@ -1650,7 +1672,7 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, g_string_append (string, "</pre>"); } else { char *copy, *match; - + len = strcspn (p, ">"); copy = g_strndup (p, len); match = g_hash_table_lookup (translations, @@ -1659,25 +1681,25 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, if (match) g_string_append (string, match); } - + p = strchr (p, '>'); if (p) p++; } } g_free (text); - + ba = g_byte_array_new (); g_byte_array_append (ba, (const guint8 *)string->str, strlen (string->str)); g_string_free (string, TRUE); - + xed = g_strdup_printf ("x-evolution-data:%p", part); mail_html_write (md->html, md->stream, "<iframe src=\"%s\" frameborder=0 scrolling=no>" "</iframe>", xed); add_url ("data_urls", xed, ba, md); - + return TRUE; } @@ -1978,28 +2000,29 @@ handle_message_external_body (CamelMimePart *part, const char *mime_type, CamelContentType *type; const char *access_type; char *url = NULL, *desc = NULL; - + char *fmt; + type = camel_mime_part_get_content_type (part); access_type = header_content_type_param (type, "access-type"); if (!access_type) goto fallback; - + if (!g_strcasecmp (access_type, "ftp") || !g_strcasecmp (access_type, "anon-ftp")) { const char *name, *site, *dir, *mode, *ftype; char *path; - + name = header_content_type_param (type, "name"); site = header_content_type_param (type, "site"); if (name == NULL || site == NULL) goto fallback; dir = header_content_type_param (type, "directory"); mode = header_content_type_param (type, "mode"); - + /* Generate the path. */ if (dir) { const char *p = dir + strlen (dir); - + path = g_strdup_printf ("%s%s%s%s", *dir == '/' ? "" : "/", dir, @@ -2010,45 +2033,49 @@ handle_message_external_body (CamelMimePart *part, const char *mime_type, *name == '/' ? "" : "/", name); } - + if (mode && *mode == 'A') ftype = ";type=A"; else if (mode && *mode == 'I') ftype = ";type=I"; else ftype = ""; - + url = g_strdup_printf ("ftp://%s%s%s", site, path, ftype); g_free (path); - desc = g_strdup_printf (_("Pointer to FTP site (%s)"), url); + fmt = e_utf8_from_locale_string (_("Pointer to FTP site (%s)")); + desc = g_strdup_printf (fmt, url); + g_free (fmt); } else if (!g_strcasecmp (access_type, "local-file")) { const char *name, *site; - + name = header_content_type_param (type, "name"); if (name == NULL) goto fallback; site = header_content_type_param (type, "site"); - + url = g_strdup_printf ("file://%s%s", *name == '/' ? "" : "/", name); if (site) { - desc = g_strdup_printf (_("Pointer to local file (%s) " - "valid at site \"%s\""), - name, site); + fmt = e_utf8_from_locale_string (_("Pointer to local file (%s) " + "valid at site \"%s\"")); + desc = g_strdup_printf (fmt, name, site); + g_free (fmt); } else { - desc = g_strdup_printf (_("Pointer to local file (%s)"), - name); + fmt = e_utf8_from_locale_string (_("Pointer to local file (%s)")); + desc = g_strdup_printf (fmt, name); + g_free (fmt); } } else if (!g_strcasecmp (access_type, "URL")) { const char *urlparam; char *s, *d; - + /* RFC 2017 */ - + urlparam = header_content_type_param (type, "url"); if (urlparam == NULL) goto fallback; - + /* For obscure MIMEy reasons, the URL may be split into * multiple words, and needs to be rejoined. (The URL * must have any real whitespace %-encoded, so we just @@ -2056,33 +2083,35 @@ handle_message_external_body (CamelMimePart *part, const char *mime_type, */ url = g_strdup (urlparam); s = d = url; - + while (*s) { if (!isspace ((unsigned char)*s)) *d++ = *s; s++; } *d = *s; - - desc = g_strdup_printf ("Pointer to remote data (%s)", url); + + fmt = e_utf8_from_locale_string (_("Pointer to remote data (%s)")); + desc = g_strdup_printf (fmt, url); + g_free (fmt); } - + fallback: if (!desc) { if (access_type) { - desc = g_strdup_printf (_("Pointer to unknown " - "external data " - "(\"%s\" type)"), - access_type); + fmt = e_utf8_from_locale_string (_("Pointer to unknown external data " + "(\"%s\" type)")); + desc = g_strdup_printf (fmt, access_type); + g_free (fmt); } else - desc = g_strdup (_("Malformed external-body part.")); + desc = e_utf8_from_locale_string (_("Malformed external-body part.")); } - + #if 0 /* FIXME */ handle_mystery (part, md, url, "gnome-globe.png", desc, url ? "open it in a browser" : NULL); #endif - + g_free (desc); g_free (url); return TRUE; |