diff options
Diffstat (limited to 'camel/camel-mime-message.c')
-rw-r--r-- | camel/camel-mime-message.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c index 0d5824ce4c..88ab643720 100644 --- a/camel/camel-mime-message.c +++ b/camel/camel-mime-message.c @@ -673,17 +673,17 @@ camel_mime_message_has_8bit_parts (CamelMimeMessage *msg) static CamelMimePartEncodingType find_best_encoding (CamelMimePart *part, CamelBestencRequired required, CamelBestencEncoding enctype, char **charsetp) { - CamelMimeFilterCharset *charenc = NULL; - CamelMimePartEncodingType encoding; - CamelMimeFilterBestenc *bestenc; - unsigned int flags, callerflags; - CamelDataWrapper *content; - CamelStreamFilter *filter; - const char *charsetin; + const char *charsetin = NULL; char *charset = NULL; CamelStream *null; + CamelStreamFilter *filter; + CamelMimeFilterCharset *charenc = NULL; + CamelMimeFilterBestenc *bestenc; int idb, idc = -1; gboolean istext; + unsigned int flags, callerflags; + CamelMimePartEncodingType encoding; + CamelDataWrapper *content; /* we use all these weird stream things so we can do it with streams, and not have to read the whole lot into memory - although i have a feeling @@ -717,10 +717,12 @@ find_best_encoding (CamelMimePart *part, CamelBestencRequired required, CamelBes null = (CamelStream *)camel_stream_null_new (); filter = camel_stream_filter_new_with_stream (null); - /* if we're looking for the best charset, then we need to convert to UTF-8 */ - if (istext && (required & CAMEL_BESTENC_GET_CHARSET) != 0 - && (charsetin = header_content_type_param (content->mime_type, "charset"))) { - charenc = camel_mime_filter_charset_new_convert (charsetin, "UTF-8"); + /* if we're not looking for the best charset, then use the one we have */ + if (istext && (required & CAMEL_BESTENC_GET_CHARSET) == 0 + && (charsetin = header_content_type_param (part->content_type, "charset"))) { + /* if libunicode doesn't support it, we dont really have utf8 anyway, so + we dont need a converter */ + charenc = camel_mime_filter_charset_new_convert ("UTF-8", charsetin); if (charenc != NULL) idc = camel_stream_filter_add (filter, (CamelMimeFilter *)charenc); charsetin = NULL; @@ -733,29 +735,31 @@ find_best_encoding (CamelMimePart *part, CamelBestencRequired required, CamelBes camel_stream_filter_remove (filter, idb); if (idc != -1) { camel_stream_filter_remove (filter, idc); - camel_object_unref (charenc); + camel_object_unref ((CamelObject *)charenc); charenc = NULL; } - if (istext && (required & CAMEL_BESTENC_GET_CHARSET) != 0) { + if (istext) charsetin = camel_mime_filter_bestenc_get_best_charset (bestenc); - d(printf("best charset = %s\n", charsetin ? charsetin : "(null)")); - charset = g_strdup (charsetin); - - charsetin = header_content_type_param (content->mime_type, "charset"); - } else { - charset = NULL; - } + + d(printf("charsetin = %s\n", charsetin ? charsetin : "(null)")); /* if we have US-ASCII, or we're not doing text, we dont need to bother with the rest */ - if (istext && charsetin && charset && (required & CAMEL_BESTENC_GET_CHARSET) != 0) { + if (charsetin != NULL && (required & CAMEL_BESTENC_GET_CHARSET) != 0) { + charset = g_strdup (charsetin); + d(printf("have charset, trying conversion/etc\n")); - /* now that 'bestenc' has told us what the best encoding is, we can use that to create + /* now the 'bestenc' can has told us what the best encoding is, we can use that to create a charset conversion filter as well, and then re-add the bestenc to filter the result to find the best encoding to use as well */ - charenc = camel_mime_filter_charset_new_convert (charsetin, charset); + charenc = camel_mime_filter_charset_new_convert ("UTF-8", charset); + + /* eek, libunicode doesn't undertand this charset anyway, then the 'utf8' we + thought we had is really the native format, in which case, we just treat + it as binary data (and take the result we have so far) */ + if (charenc != NULL) { /* otherwise, try another pass, converting to the real charset */ @@ -769,15 +773,15 @@ find_best_encoding (CamelMimePart *part, CamelBestencRequired required, CamelBes /* and write it to the new stream */ camel_data_wrapper_write_to_stream (content, (CamelStream *)filter); - camel_object_unref (charenc); + camel_object_unref ((CamelObject *)charenc); } } encoding = camel_mime_filter_bestenc_get_best_encoding (bestenc, enctype); - camel_object_unref (filter); - camel_object_unref (bestenc); - camel_object_unref (null); + camel_object_unref ((CamelObject *)filter); + camel_object_unref ((CamelObject *)bestenc); + camel_object_unref ((CamelObject *)null); d(printf("done, best encoding = %d\n", encoding)); |