aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-mime-part.c
diff options
context:
space:
mode:
author4 <NotZed@Ximian.com>2001-09-25 03:31:07 +0800
committerMichael Zucci <zucchi@src.gnome.org>2001-09-25 03:31:07 +0800
commit450e955e76ca9174658c0bb94e99e4174df2fe48 (patch)
tree6d708cc2b707fc24618cdcf6fdd9ed2539a2189e /camel/camel-mime-part.c
parent8ac999f87feb11e3e33f0a5ab33d92f15e57c613 (diff)
downloadgsoc2013-evolution-450e955e76ca9174658c0bb94e99e4174df2fe48.tar.gz
gsoc2013-evolution-450e955e76ca9174658c0bb94e99e4174df2fe48.tar.zst
gsoc2013-evolution-450e955e76ca9174658c0bb94e99e4174df2fe48.zip
If the type is encoded, get the fallback charset from the message
2001-09-24 <NotZed@Ximian.com> * camel-filter-search.c (check_header): If the type is encoded, get the fallback charset from the message content-type. * camel-mime-part-utils.c (check_html_charset): Dont check for charset==null before calling charset_to_iconv. (simple_data_wrapper_construct_from_parser): " * camel-mime-message.c (process_header): Try use content-type charset param as the fallback charset. * camel-charset-map.c (camel_charset_to_iconv): Handle name == NULL, return NULL. * camel-folder-summary.c (camel_folder_summary_format_address): (camel_folder_summary_format_string): Made private again, removed #warning about it. Renamed to s/camel_folder//. (summary_format_string): Take default charset param. (camel_message_info_new_from_header, message_info_new): Decode content-type field to get the charset parameter to use as the default charset for decoding strings. * camel-search-private.c (camel_search_header_match): Pass NULL as the charset, the locale charset is always tried. (camel_search_header_match): Supply a default_charset parameter to be used with TYPE_ENCODED params. * camel-mime-utils.c (header_param): get rid of the g_strcasecmp crap. (header_set_param): Same here. (header_decode_param_list): And here. (header_decode_text): Totally rewritten. 30% of its size. If the word is not rfc2047 encoded, always try default_charset if supplied, if that fails, try locale charset if it exists, if that fails then assume latin1/7 bit ascii. (append_8bit): Changed to return FALSE if we can't convert for whatever reason, and dont append anything. * camel-mime-part.h (struct _CamelMimePart): Move content_type and headers out of the 'private' section. * camel-mime-part.c (get_headers): Dont do any conversion on the header. (process_header): Get the content-type charset as the fallback charset for decode_string. (construct_from_parser): IF we have a content-type header, process it before doing anything else, so we have access to a fallback charset for invalid headers. svn path=/trunk/; revision=13096
Diffstat (limited to 'camel/camel-mime-part.c')
-rw-r--r--camel/camel-mime-part.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
index a4d9a2eb0d..5e6d6b3b09 100644
--- a/camel/camel-mime-part.c
+++ b/camel/camel-mime-part.c
@@ -212,7 +212,10 @@ process_header(CamelMedium *medium, const char *header_name, const char *header_
switch (header_type) {
case HEADER_DESCRIPTION: /* raw header->utf8 conversion */
g_free (mime_part->description);
- charset = camel_charset_locale_name ();
+ if (mime_part->content_type)
+ charset = camel_charset_to_iconv(header_content_type_param(mime_part->content_type, "charset"));
+ else
+ charset = NULL;
mime_part->description = g_strstrip (header_decode_string (header_value, charset));
break;
case HEADER_DISPOSITION:
@@ -299,7 +302,7 @@ get_headers (CamelMedium *medium)
headers = g_array_new (FALSE, FALSE, sizeof (CamelMediumHeader));
for (h = part->headers; h; h = h->next) {
header.name = h->name;
- header.value = header_decode_string (h->value, NULL);
+ header.value = h->value;
g_array_append_val (headers, header);
}
@@ -660,6 +663,7 @@ static int
construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp)
{
struct _header_raw *headers;
+ const char *content;
char *buf;
int len;
@@ -675,6 +679,12 @@ construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp)
case HSCAN_MULTIPART:
/* we have the headers, build them into 'us' */
headers = camel_mime_parser_headers_raw(mp);
+
+ /* if content-type exists, process it first, set for fallback charset in headers */
+ content = header_raw_find(&headers, "content-type", NULL);
+ if (content)
+ process_header((CamelMedium *)dw, "content-type", content);
+
while (headers) {
camel_medium_add_header((CamelMedium *)dw, headers->name, headers->value);
headers = headers->next;