Updated to convert to/from the correct charset (since content is no longer

2003-07-17  Jeffrey Stedfast  <fejj@ximian.com>

	* camel-mime-message.c (find_best_encoding): Updated to convert
	to/from the correct charset (since content is no longer
	necessarily in UTF-8).
	(best_encoding): Free the charset string when we're done with it.

svn path=/trunk/; revision=21863
This commit is contained in:
Jeffrey Stedfast
2003-07-17 20:12:12 +00:00
committed by Jeffrey Stedfast
parent 76c23a45f1
commit 451cc1a07a
2 changed files with 33 additions and 30 deletions

View File

@ -1,5 +1,10 @@
2003-07-17 Jeffrey Stedfast <fejj@ximian.com>
* camel-mime-message.c (find_best_encoding): Updated to convert
to/from the correct charset (since content is no longer
necessarily in UTF-8).
(best_encoding): Free the charset string when we're done with it.
* camel-stream-fs.c (stream_read): Increment the seekable stream
position by the number of bytes read. Oops.
(stream_write): Same here.

View File

@ -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)
{
const char *charsetin = NULL;
CamelMimeFilterCharset *charenc = NULL;
CamelMimePartEncodingType encoding;
CamelMimeFilterBestenc *bestenc;
unsigned int flags, callerflags;
CamelDataWrapper *content;
CamelStreamFilter *filter;
const char *charsetin;
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,12 +717,10 @@ 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 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 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 (charenc != NULL)
idc = camel_stream_filter_add (filter, (CamelMimeFilter *)charenc);
charsetin = NULL;
@ -735,31 +733,29 @@ 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 ((CamelObject *)charenc);
camel_object_unref (charenc);
charenc = NULL;
}
if (istext)
if (istext && (required & CAMEL_BESTENC_GET_CHARSET) != 0) {
charsetin = camel_mime_filter_bestenc_get_best_charset (bestenc);
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 (charsetin != NULL && (required & CAMEL_BESTENC_GET_CHARSET) != 0) {
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;
}
/* 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) {
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
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 ("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) */
charenc = camel_mime_filter_charset_new_convert (charsetin, charset);
if (charenc != NULL) {
/* otherwise, try another pass, converting to the real charset */
@ -773,15 +769,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 ((CamelObject *)charenc);
camel_object_unref (charenc);
}
}
encoding = camel_mime_filter_bestenc_get_best_encoding (bestenc, enctype);
camel_object_unref ((CamelObject *)filter);
camel_object_unref ((CamelObject *)bestenc);
camel_object_unref ((CamelObject *)null);
camel_object_unref (filter);
camel_object_unref (bestenc);
camel_object_unref (null);
d(printf("done, best encoding = %d\n", encoding));
@ -833,6 +829,8 @@ best_encoding (CamelMimeMessage *msg, CamelMimePart *part, void *datap)
}
}
}
g_free (charset);
}
return TRUE;