diff options
-rw-r--r-- | camel/ChangeLog | 18 | ||||
-rw-r--r-- | camel/camel-mime-part-utils.c | 29 |
2 files changed, 39 insertions, 8 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 3f03dd6ff6..db9c0d67e4 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,23 @@ 2003-03-21 Jeffrey Stedfast <fejj@ximian.com> + Camel part of the fix for Lewing's bug #39204. Second half of the + patch should also fix it so that text/plain parts that are + detected as being text/html are rendered as html (not that I agree + with this mind you, but corporate customers want this "feature"). + + * camel-mime-part-utils.c + (simple_data_wrapper_construct_from_parser): If the part is + text/html and doesn't have a charset and we are able to find a + charset in the meta tags of the html content, set the charset + param on the content-type. + (camel_mime_part_construct_content_from_parser): After setting the + content object on the mime part, re-set the content-type of the + content object back to the one from the parser (as it may contain + changes from the original - see changes made to the ct in + simple_data_wrapper_construct_from_parser for details). + +2003-03-21 Jeffrey Stedfast <fejj@ximian.com> + * camel-tcp-stream-ssl.c (camel_certdb_nss_cert_get): continue reading the cert file until we've read it all or get a non-EINTR errno. diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c index 32f4397d64..d71108afa5 100644 --- a/camel/camel-mime-part-utils.c +++ b/camel/camel-mime-part-utils.c @@ -352,8 +352,10 @@ simple_data_wrapper_construct_from_parser (CamelDataWrapper *dw, CamelMimeParser } /* Possible Lame Mailer Alert... check the META tags for a charset */ - if (!charset && header_content_type_is (ct, "text", "html")) - charset = check_html_charset (buffer->data, buffer->len); + if (!charset && header_content_type_is (ct, "text", "html")) { + if ((charset = check_html_charset (buffer->data, buffer->len))) + header_content_type_set_param (ct, "charset", charset); + } /* if we need to do charset conversion, see if we can/it works/etc */ if (charset && !(strcasecmp (charset, "us-ascii") == 0 @@ -416,12 +418,15 @@ void camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParser *mp) { CamelDataWrapper *content = NULL; + CamelContentType *ct; + + ct = camel_mime_parser_content_type (mp); switch (camel_mime_parser_state (mp)) { case HSCAN_HEADER: d(printf("Creating body part\n")); /* multipart/signed is some fucked up type that we must treat as binary data, fun huh, idiots. */ - if (header_content_type_is (camel_mime_parser_content_type (mp), "multipart", "signed")) { + if (header_content_type_is (ct, "multipart", "signed")) { content = (CamelDataWrapper *) camel_multipart_signed_new (); camel_multipart_construct_from_parser ((CamelMultipart *) content, mp); } else { @@ -436,9 +441,9 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse break; case HSCAN_MULTIPART: d(printf("Creating multi-part\n")); - if (header_content_type_is (camel_mime_parser_content_type (mp), "multipart", "encrypted")) + if (header_content_type_is (ct, "multipart", "encrypted")) content = (CamelDataWrapper *) camel_multipart_encrypted_new (); - else if (header_content_type_is (camel_mime_parser_content_type (mp), "multipart", "signed")) + else if (header_content_type_is (ct, "multipart", "signed")) content = (CamelDataWrapper *) camel_multipart_signed_new (); else content = (CamelDataWrapper *) camel_multipart_new (); @@ -451,9 +456,17 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse } if (content) { /* would you believe you have to set this BEFORE you set the content object??? oh my god !!!! */ - camel_data_wrapper_set_mime_type_field (content, - camel_mime_part_get_content_type ((CamelMimePart *)dw)); + camel_data_wrapper_set_mime_type_field (content, camel_mime_part_get_content_type (dw)); camel_medium_set_content_object ((CamelMedium *)dw, content); - camel_object_unref ((CamelObject *)content); + + /* Note: we don't set ct as the content-object's mime-type above because + * camel_medium_set_content_object() may re-write the Content-Type header + * (see CamelMimePart::set_content_object) if we did that (which is a Bad Thing). + * However, if we set it *afterward*, we can still use any special auto-detections + * that we found in simple_data_wrapper_construct_from_parser(). This is important + * later when we go to render the MIME parts in mail-format.c */ + camel_data_wrapper_set_mime_type_field (content, ct); + + camel_object_unref (content); } } |