aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog32
-rw-r--r--mail/mail-display.c24
-rw-r--r--mail/mail-format.c118
-rw-r--r--mail/mail-format.h1
-rw-r--r--mail/mail-ops.c2
5 files changed, 109 insertions, 68 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 6a9eceffdd..31c70606f5 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,35 @@
+2003-08-05 Jeffrey Stedfast <fejj@ximian.com>
+
+ * mail-format.c (handle_multipart_encrypted): Updated for
+ CamelMimePart::content_type changes.
+
+ * mail-ops.c (save_part_save): Use
+ camel_data_wrapper_decode_to_stream() here.
+
+ * mail-display.c (drag_data_get_cb): Updated for
+ CamelMimePart::content_type changes.
+ (do_attachment_header): Same.
+
+2003-07-31 Jeffrey Stedfast <fejj@ximian.com>
+
+ * mail-format.c (mail_format_raw_message): Updated to pass FALSE
+ as the 'decode' param to
+ mail_format_data_wrapper_write_to_stream().
+ (mail_format_data_wrapper_write_to_stream): Now takes a boolean
+ arg telling whether to decode or not. Also reworked the charset
+ logic now that camel doesn't handle this for us any longer.
+ (mail_format_get_data_wrapper_text): Updated.
+ (handle_text_plain): Same.
+ (handle_text_enriched): Here too.
+
+ * mail-display.c (do_attachment_header): Call decode_to_stream
+ here instead of write_to_stream.
+ (do_external_viewer): Same.
+ (on_url_requested): Same. Also updated for
+ mail_format_data_wrapper_write_to_stream().
+ (try_part_urls): Call decode_to_stream.
+ (drag_data_get_cb): Same.
+
2003-08-05 Not Zed <NotZed@Ximian.com>
** See bug #47224. Hook onto clicked rather than button_pressed,
diff --git a/mail/mail-display.c b/mail/mail-display.c
index 9654d9b198..35ab41c273 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -1056,7 +1056,7 @@ drag_data_get_cb (GtkWidget *widget,
g_object_set_data_full ((GObject *) widget, "uri-list", uri_list, g_free);
break;
case DND_TARGET_TYPE_PART_MIME_TYPE:
- if (header_content_type_is (part->content_type, "text", "*")) {
+ if (header_content_type_is (((CamelDataWrapper *) part)->mime_type, "text", "*")) {
GByteArray *ba;
ba = mail_format_get_data_wrapper_text ((CamelDataWrapper *) part, NULL);
@@ -1067,16 +1067,16 @@ drag_data_get_cb (GtkWidget *widget,
}
} else {
CamelDataWrapper *wrapper;
- CamelStreamMem *cstream;
+ CamelStreamMem *mem;
- cstream = (CamelStreamMem *) camel_stream_mem_new ();
+ mem = (CamelStreamMem *) camel_stream_mem_new ();
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- camel_data_wrapper_write_to_stream (wrapper, (CamelStream *)cstream);
+ camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mem);
gtk_selection_data_set (selection_data, selection_data->target, 8,
- cstream->buffer->data, cstream->buffer->len);
+ mem->buffer->data, mem->buffer->len);
- camel_object_unref (cstream);
+ camel_object_unref (mem);
}
break;
default:
@@ -1120,7 +1120,7 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
content = camel_medium_get_content_object (CAMEL_MEDIUM (part));
if (!camel_data_wrapper_is_offline (content)) {
pbl->mstream = camel_stream_mem_new ();
- camel_data_wrapper_write_to_stream (content, pbl->mstream);
+ camel_data_wrapper_decode_to_stream (content, pbl->mstream);
camel_stream_reset (pbl->mstream);
}
}
@@ -1149,7 +1149,7 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
}
/* Drag & Drop */
- drag_types[DND_TARGET_TYPE_PART_MIME_TYPE].target = header_content_type_simple (part->content_type);
+ drag_types[DND_TARGET_TYPE_PART_MIME_TYPE].target = header_content_type_simple (((CamelDataWrapper *) part)->mime_type);
camel_strdown (drag_types[DND_TARGET_TYPE_PART_MIME_TYPE].target);
gtk_drag_source_set (button, GDK_BUTTON1_MASK,
@@ -1245,7 +1245,7 @@ do_external_viewer (GtkHTML *html, GtkHTMLEmbedded *eb,
/* Write the data to a CamelStreamMem... */
cstream = (CamelStreamMem *) camel_stream_mem_new ();
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- camel_data_wrapper_write_to_stream (wrapper, (CamelStream *)cstream);
+ camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *)cstream);
/* ...convert the CamelStreamMem to a BonoboStreamMem... */
bstream = bonobo_stream_mem_create (cstream->buffer->data, cstream->buffer->len, TRUE, FALSE);
@@ -1390,9 +1390,9 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
html_stream = mail_display_stream_new (html, handle);
if (header_content_type_is (content_type, "text", "*")) {
- mail_format_data_wrapper_write_to_stream (wrapper, md, html_stream);
+ mail_format_data_wrapper_write_to_stream (wrapper, TRUE, md, html_stream);
} else {
- camel_data_wrapper_write_to_stream (wrapper, html_stream);
+ camel_data_wrapper_decode_to_stream (wrapper, html_stream);
}
camel_object_unref (html_stream);
@@ -1693,7 +1693,7 @@ try_part_urls (struct _load_content_msg *m)
}
html_stream = mail_display_stream_new (m->html, m->handle);
- camel_data_wrapper_write_to_stream (data, html_stream);
+ camel_data_wrapper_decode_to_stream (data, html_stream);
camel_object_unref (html_stream);
gtk_html_end (m->html, m->handle, GTK_HTML_STREAM_OK);
diff --git a/mail/mail-format.c b/mail/mail-format.c
index 1ee1223d46..b77f9316b1 100644
--- a/mail/mail-format.c
+++ b/mail/mail-format.c
@@ -45,6 +45,7 @@
#include <camel/camel-multipart-signed.h>
#include <camel/camel-mime-filter-enriched.h>
#include <camel/camel-mime-filter-tohtml.h>
+#include <camel/camel-mime-filter-windows.h>
#include <e-util/e-trie.h>
@@ -193,7 +194,7 @@ mail_format_raw_message (CamelMimeMessage *mime_message, MailDisplay *md,
camel_stream_write_string ((CamelStream *) stream, STANDARD_ISSUE_TABLE_OPEN "<tr><td><tt>");
- mail_format_data_wrapper_write_to_stream (wrapper, md, (CamelStream *) filtered_stream);
+ mail_format_data_wrapper_write_to_stream (wrapper, FALSE, md, (CamelStream *) filtered_stream);
camel_object_unref (filtered_stream);
camel_stream_write_string ((CamelStream *) stream, "</tt></td></tr></table>");
@@ -1117,67 +1118,74 @@ mail_content_loaded (CamelDataWrapper *wrapper, MailDisplay *md, gboolean redisp
ssize_t
-mail_format_data_wrapper_write_to_stream (CamelDataWrapper *wrapper, MailDisplay *mail_display, CamelStream *stream)
+mail_format_data_wrapper_write_to_stream (CamelDataWrapper *wrapper, gboolean decode, MailDisplay *mail_display, CamelStream *stream)
{
- CamelStreamFilter *filtered_stream;
- ssize_t written;
+ CamelStreamFilter *filter_stream;
+ CamelMimeFilterCharset *filter;
+ CamelContentType *content_type;
+ GConfClient *gconf;
+ ssize_t nwritten;
+ char *charset;
- filtered_stream = camel_stream_filter_new_with_stream (stream);
+ gconf = mail_config_get_gconf_client ();
- if (wrapper->rawtext || (mail_display && mail_display->charset)) {
- CamelMimeFilterCharset *filter;
- CamelContentType *content_type;
- GConfClient *gconf;
- char *charset;
-
- gconf = mail_config_get_gconf_client ();
-
- content_type = camel_data_wrapper_get_mime_type_field (wrapper);
-
- if (!wrapper->rawtext) {
- /* data wrapper had been successfully converted to UTF-8 using the mime
- part's charset, but the user thinks he knows best so we'll let him
- shoot himself in the foot here... */
+ content_type = camel_data_wrapper_get_mime_type_field (wrapper);
+
+ /* find out the charset the user wants to override to */
+ if (mail_display && mail_display->charset) {
+ /* user override charset */
+ charset = g_strdup (mail_display->charset);
+ } else if (content_type && (charset = (char *) header_content_type_param (content_type, "charset"))) {
+ /* try to use the charset declared in the Content-Type header */
+ if (!strncasecmp (charset, "iso-8859-", 9)) {
+ /* Since a few Windows mailers like to claim they sent
+ * out iso-8859-# encoded text when they really sent
+ * out windows-cp125#, do some simple sanity checking
+ * before we move on... */
+ CamelMimeFilterWindows *windows;
+ CamelStream *null;
- /* get the original charset of the mime part */
- charset = (char *) (content_type ? header_content_type_param (content_type, "charset") : NULL);
- if (!charset)
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
- else
- charset = g_strdup (charset);
+ null = camel_stream_null_new ();
+ filter_stream = camel_stream_filter_new_with_stream (null);
+ camel_object_unref (null);
- /* since the content is already in UTF-8, we need to decode into the
- original charset before we can convert back to UTF-8 using the charset
- the user is overriding with... */
- if ((filter = camel_mime_filter_charset_new_convert ("utf-8", charset))) {
- camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (filter));
- camel_object_unref (filter);
- }
+ windows = (CamelMimeFilterWindows *) camel_mime_filter_windows_new (charset);
+ camel_stream_filter_add (filter_stream, (CamelMimeFilter *) windows);
- g_free (charset);
- }
-
- /* find out the charset the user wants to override to */
- if (mail_display && mail_display->charset)
- charset = g_strdup (mail_display->charset);
- else if (content_type && (charset = (char *) header_content_type_param (content_type, "charset")))
+ if (decode)
+ camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) filter_stream);
+ else
+ camel_data_wrapper_write_to_stream (wrapper, (CamelStream *) filter_stream);
+ camel_stream_flush ((CamelStream *) filter_stream);
+ camel_object_unref (filter_stream);
+
+ charset = g_strdup (camel_mime_filter_windows_real_charset (windows));
+ camel_object_unref (windows);
+ } else {
charset = g_strdup (charset);
- else
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
-
- if ((filter = camel_mime_filter_charset_new_convert (charset, "utf-8"))) {
- camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (filter));
- camel_object_unref (filter);
}
-
- g_free (charset);
+ } else {
+ /* default to user's locale charset? */
+ charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
}
- written = camel_data_wrapper_write_to_stream (wrapper, CAMEL_STREAM (filtered_stream));
- camel_stream_flush (CAMEL_STREAM (filtered_stream));
- camel_object_unref (filtered_stream);
+ filter_stream = camel_stream_filter_new_with_stream (stream);
+
+ if ((filter = camel_mime_filter_charset_new_convert (charset, "UTF-8"))) {
+ camel_stream_filter_add (filter_stream, (CamelMimeFilter *) filter);
+ camel_object_unref (filter);
+ }
+
+ g_free (charset);
+
+ if (decode)
+ nwritten = camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) filter_stream);
+ else
+ nwritten = camel_data_wrapper_write_to_stream (wrapper, (CamelStream *) filter_stream);
+ camel_stream_flush ((CamelStream *) filter_stream);
+ camel_object_unref (filter_stream);
- return written;
+ return nwritten;
}
/* Return the contents of a data wrapper, or %NULL if it contains only
@@ -1194,7 +1202,7 @@ mail_format_get_data_wrapper_text (CamelDataWrapper *wrapper, MailDisplay *mail_
ba = g_byte_array_new ();
camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (memstream), ba);
- mail_format_data_wrapper_write_to_stream (wrapper, mail_display, memstream);
+ mail_format_data_wrapper_write_to_stream (wrapper, TRUE, mail_display, memstream);
camel_object_unref (memstream);
for (text = ba->data, end = text + ba->len; text < end; text++) {
@@ -1269,7 +1277,7 @@ handle_text_plain (CamelMimePart *part, const char *mime_type,
camel_stream_write_string ((CamelStream *) stream, STANDARD_ISSUE_TABLE_OPEN "<tr><td><tt>\n");
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- mail_format_data_wrapper_write_to_stream (wrapper, md, (CamelStream *) filtered_stream);
+ mail_format_data_wrapper_write_to_stream (wrapper, TRUE, md, (CamelStream *) filtered_stream);
camel_stream_write_string ((CamelStream *) stream, "</tt></td></tr></table>\n");
@@ -1304,7 +1312,7 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type,
camel_stream_write_string ((CamelStream *) stream, STANDARD_ISSUE_TABLE_OPEN "<tr><td><tt>\n");
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- mail_format_data_wrapper_write_to_stream (wrapper, md, (CamelStream *) filtered_stream);
+ mail_format_data_wrapper_write_to_stream (wrapper, TRUE, md, (CamelStream *) filtered_stream);
camel_stream_write_string ((CamelStream *) stream, "</tt></td></tr></table>\n");
camel_object_unref (filtered_stream);
@@ -1400,7 +1408,7 @@ handle_multipart_encrypted (CamelMimePart *part, const char *mime_type,
gboolean handled;
/* Currently we only handle RFC2015-style PGP encryption. */
- protocol = header_content_type_param (part->content_type, "protocol");
+ protocol = header_content_type_param (((CamelDataWrapper *) part)->mime_type, "protocol");
if (!protocol || strcmp (protocol, "application/pgp-encrypted") != 0)
return handle_multipart_mixed (part, mime_type, md, stream);
diff --git a/mail/mail-format.h b/mail/mail-format.h
index 2bc9016879..e39148ca83 100644
--- a/mail/mail-format.h
+++ b/mail/mail-format.h
@@ -34,6 +34,7 @@ GByteArray *mail_format_get_data_wrapper_text (CamelDataWrapper *data,
MailDisplay *mail_display);
ssize_t mail_format_data_wrapper_write_to_stream (CamelDataWrapper *wrapper,
+ gboolean decode,
MailDisplay *mail_display,
CamelStream *stream);
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 7a40e99c83..ecd56c60ed 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -2077,7 +2077,7 @@ save_part_save (struct _mail_msg *mm)
filtered_stream = stream_fs;
}
- if (camel_data_wrapper_write_to_stream (data, filtered_stream) == -1
+ if (camel_data_wrapper_decode_to_stream (data, filtered_stream) == -1
|| camel_stream_flush (filtered_stream) == -1)
camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SYSTEM,
_("Could not write data: %s"),