Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-decoder.c @ 9322:ce612bdafc84 HEAD
message-decoder now supports optionally returning non-text bodyparts as-is.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 18 May 2009 13:09:25 -0400 |
parents | b9faf4db2a9f |
children | fd3c13b9837b |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7950
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "base64.h" |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
6 #include "str.h" |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
7 #include "unichar.h" |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "charset-utf8.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "quoted-printable.h" |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
10 #include "rfc822-parser.h" |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
11 #include "rfc2231-parser.h" |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "message-parser.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "message-header-decode.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "message-decoder.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 enum content_type { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 CONTENT_TYPE_UNKNOWN = 0, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 CONTENT_TYPE_BINARY, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 CONTENT_TYPE_QP, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 CONTENT_TYPE_BASE64 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
4885 | 23 /* base64 takes max 4 bytes per character, q-p takes max 3. */ |
24 #define MAX_ENCODING_BUF_SIZE 3 | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 /* UTF-8 takes max 5 bytes per character. Not sure about others, but I'd think |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 10 is more than enough for everyone.. */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 #define MAX_TRANSLATION_BUF_SIZE 10 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct message_decoder_context { |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
31 enum message_decoder_flags flags; |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
32 struct message_part *prev_part; |
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
33 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct message_header_line hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 buffer_t *buf, *buf2; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
37 char *charset_trans_charset; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct charset_translation *charset_trans; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 char translation_buf[MAX_TRANSLATION_BUF_SIZE]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 unsigned int translation_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 char encoding_buf[MAX_ENCODING_BUF_SIZE]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 unsigned int encoding_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 char *content_charset; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 enum content_type content_type; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 unsigned int charset_utf8:1; |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
49 unsigned int binary_input:1; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 }; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
52 struct message_decoder_context * |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
53 message_decoder_init(enum message_decoder_flags flags) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 struct message_decoder_context *ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 ctx = i_new(struct message_decoder_context, 1); |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
58 ctx->flags = flags; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 ctx->buf = buffer_create_dynamic(default_pool, 8192); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 ctx->buf2 = buffer_create_dynamic(default_pool, 8192); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 return ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 void message_decoder_deinit(struct message_decoder_context **_ctx) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 struct message_decoder_context *ctx = *_ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 *_ctx = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
4888 | 70 if (ctx->charset_trans != NULL) |
71 charset_to_utf8_end(&ctx->charset_trans); | |
72 | |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6133
diff
changeset
|
73 buffer_free(&ctx->buf); |
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6133
diff
changeset
|
74 buffer_free(&ctx->buf2); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
75 i_free(ctx->charset_trans_charset); |
4888 | 76 i_free(ctx->content_charset); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 i_free(ctx); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
80 static void |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
81 parse_content_transfer_encoding(struct message_decoder_context *ctx, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
82 struct message_header_line *hdr) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
84 struct rfc822_parser_context parser; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
85 string_t *value; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
87 value = t_str_new(64); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
88 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
90 (void)rfc822_skip_lwsp(&parser); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
91 (void)rfc822_parse_mime_token(&parser, value); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
92 |
7071
5de49bb0a7b3
If Content-Transfer-Encoding type is unknown, skip the body instead of
Timo Sirainen <tss@iki.fi>
parents:
6952
diff
changeset
|
93 ctx->content_type = CONTENT_TYPE_UNKNOWN; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
94 switch (str_len(value)) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 case 4: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
96 if (i_memcasecmp(str_data(value), "7bit", 4) == 0 || |
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
97 i_memcasecmp(str_data(value), "8bit", 4) == 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 ctx->content_type = CONTENT_TYPE_BINARY; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 case 6: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
101 if (i_memcasecmp(str_data(value), "base64", 6) == 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 ctx->content_type = CONTENT_TYPE_BASE64; |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
103 else if (i_memcasecmp(str_data(value), "binary", 6) == 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 ctx->content_type = CONTENT_TYPE_BINARY; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 case 16: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
107 if (i_memcasecmp(str_data(value), "quoted-printable", 16) == 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 ctx->content_type = CONTENT_TYPE_QP; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 static void |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
114 parse_content_type(struct message_decoder_context *ctx, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
115 struct message_header_line *hdr) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
117 struct rfc822_parser_context parser; |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
118 const char *const *results; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
119 string_t *str; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
120 |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
121 if (ctx->content_charset != NULL) |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
122 return; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
124 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
125 (void)rfc822_skip_lwsp(&parser); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
126 str = t_str_new(64); |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
127 if (rfc822_parse_content_type(&parser, str) <= 0) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
128 return; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
130 (void)rfc2231_parse(&parser, &results); |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
131 for (; *results != NULL; results += 2) { |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
132 if (strcasecmp(results[0], "charset") == 0) { |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
133 ctx->content_charset = i_strdup(results[1]); |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
134 ctx->charset_utf8 = charset_is_utf8(results[1]); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
135 break; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
136 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 static bool message_decode_header(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 struct message_header_line *hdr, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 { |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
144 bool dtcase = (ctx->flags & MESSAGE_DECODER_FLAG_DTCASE) != 0; |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
145 size_t value_len; |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
146 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 if (hdr->continues) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 hdr->use_full_value = TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
152 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
153 if (hdr->name_len == 12 && |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
154 strcasecmp(hdr->name, "Content-Type") == 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
155 parse_content_type(ctx, hdr); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
156 if (hdr->name_len == 25 && |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
157 strcasecmp(hdr->name, "Content-Transfer-Encoding") == 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
158 parse_content_transfer_encoding(ctx, hdr); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
159 } T_END; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 buffer_set_used_size(ctx->buf, 0); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
6117
diff
changeset
|
162 message_header_decode_utf8(hdr->full_value, hdr->full_value_len, |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
163 ctx->buf, dtcase); |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
164 value_len = ctx->buf->used; |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
165 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
166 if (dtcase) { |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
167 (void)uni_utf8_to_decomposed_titlecase(hdr->name, hdr->name_len, |
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
168 ctx->buf); |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
169 buffer_append_c(ctx->buf, '\0'); |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
170 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 ctx->hdr = *hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 ctx->hdr.full_value = ctx->buf->data; |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
174 ctx->hdr.full_value_len = value_len; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 ctx->hdr.value_len = 0; |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
176 if (dtcase) { |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
177 ctx->hdr.name = CONST_PTR_OFFSET(ctx->buf->data, |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
178 ctx->hdr.full_value_len); |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
179 ctx->hdr.name_len = ctx->buf->used - 1 - value_len; |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
180 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 output->hdr = &ctx->hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 static void translation_buf_decode(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 const unsigned char **data, size_t *size) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 unsigned char trans_buf[MAX_TRANSLATION_BUF_SIZE+1]; |
6832 | 190 unsigned int data_wanted, skip; |
191 size_t trans_size; | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 |
6832 | 193 /* @UNSAFE: move the previously untranslated bytes to trans_buf |
194 and see if we have now enough data to get the next character | |
195 translated */ | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 memcpy(trans_buf, ctx->translation_buf, ctx->translation_size); |
6832 | 197 data_wanted = sizeof(trans_buf) - ctx->translation_size; |
198 if (data_wanted > *size) | |
199 data_wanted = *size; | |
200 memcpy(trans_buf + ctx->translation_size, *data, data_wanted); | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 |
6832 | 202 trans_size = ctx->translation_size + data_wanted; |
203 (void)charset_to_utf8(ctx->charset_trans, trans_buf, | |
204 &trans_size, ctx->buf2); | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 |
6832 | 206 i_assert(trans_size > ctx->translation_size); |
207 skip = trans_size - ctx->translation_size; | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 i_assert(*size >= skip); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 *data += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 *size -= skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 ctx->translation_size = 0; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
216 static void |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
217 message_decode_body_init_charset(struct message_decoder_context *ctx, |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
218 struct message_part *part) |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
219 { |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
220 enum charset_flags flags; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
221 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
222 if (ctx->charset_utf8) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
223 return; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
224 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
225 if (ctx->charset_trans != NULL && |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
226 strcasecmp(ctx->content_charset, ctx->charset_trans_charset) == 0) { |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
227 /* already have the correct translation selected */ |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
228 return; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
229 } |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
230 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
231 if (ctx->charset_trans != NULL) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
232 charset_to_utf8_end(&ctx->charset_trans); |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
233 i_free_and_null(ctx->charset_trans_charset); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
234 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
235 ctx->binary_input = ctx->content_charset == NULL && |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
236 (ctx->flags & MESSAGE_DECODER_FLAG_RETURN_BINARY) != 0 && |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
237 (part->flags & (MESSAGE_PART_FLAG_TEXT | |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
238 MESSAGE_PART_FLAG_MESSAGE_RFC822)) == 0; |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
239 if (ctx->binary_input) |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
240 return; |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
241 |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
242 flags = (ctx->flags & MESSAGE_DECODER_FLAG_DTCASE) != 0 ? |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
243 CHARSET_FLAG_DECOMP_TITLECASE : 0; |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
244 ctx->charset_trans_charset = i_strdup(ctx->content_charset != NULL ? |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
245 ctx->content_charset : "UTF-8"); |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
246 if (charset_to_utf8_begin(ctx->charset_trans_charset, |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
247 flags, &ctx->charset_trans) < 0) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
248 ctx->charset_trans = NULL; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
249 } |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
250 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 static bool message_decode_body(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 struct message_block *input, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 unsigned char new_buf[MAX_ENCODING_BUF_SIZE+1]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 const unsigned char *data = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 size_t pos, size = 0, skip = 0; |
5510 | 258 int ret; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 /* @UNSAFE */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 memcpy(new_buf, ctx->encoding_buf, ctx->encoding_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 skip = sizeof(new_buf) - ctx->encoding_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 if (skip > input->size) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 skip = input->size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 memcpy(new_buf + ctx->encoding_size, input->data, skip); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 switch (ctx->content_type) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 case CONTENT_TYPE_UNKNOWN: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 /* just skip this body */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 case CONTENT_TYPE_BINARY: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 data = input->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 size = pos = input->size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 case CONTENT_TYPE_QP: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 buffer_set_used_size(ctx->buf, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 quoted_printable_decode(new_buf, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 ctx->encoding_size + skip, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 &pos, ctx->buf); |
5422 | 284 i_assert(pos >= ctx->encoding_size); |
4885 | 285 skip = pos - ctx->encoding_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 |
4885 | 288 quoted_printable_decode(input->data + skip, input->size - skip, |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 &pos, ctx->buf); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 pos += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 data = ctx->buf->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 size = ctx->buf->used; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 case CONTENT_TYPE_BASE64: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 buffer_set_used_size(ctx->buf, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 if (base64_decode(new_buf, ctx->encoding_size + skip, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 &pos, ctx->buf) < 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 /* corrupted base64 data, don't bother with |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 the rest of it */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 } |
5422 | 303 i_assert(pos >= ctx->encoding_size); |
4885 | 304 skip = pos - ctx->encoding_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 } |
5510 | 306 ret = base64_decode(input->data + skip, input->size - skip, |
307 &pos, ctx->buf); | |
308 if (ret < 0) { | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 /* corrupted base64 data, don't bother with |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 the rest of it */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 } |
5510 | 313 if (ret == 0) { |
4885 | 314 /* end of base64 input */ |
315 pos = input->size - skip; | |
316 } | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 pos += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 data = ctx->buf->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 size = ctx->buf->used; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 if (pos != input->size) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 /* @UNSAFE */ |
4885 | 325 i_assert(pos < input->size); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 ctx->encoding_size = input->size - pos; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 i_assert(ctx->encoding_size <= sizeof(ctx->encoding_buf)); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 memcpy(ctx->encoding_buf, input->data + pos, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 ctx->encoding_size); |
5422 | 330 } else { |
331 ctx->encoding_size = 0; | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
334 if (ctx->binary_input) { |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
335 output->data = data; |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
336 output->size = size; |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
337 } else if (ctx->charset_utf8) { |
6952
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
338 buffer_set_used_size(ctx->buf2, 0); |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
339 if ((ctx->flags & MESSAGE_DECODER_FLAG_DTCASE) != 0) { |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
340 (void)uni_utf8_to_decomposed_titlecase(data, size, |
6579 | 341 ctx->buf2); |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
342 output->data = ctx->buf2->data; |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
343 output->size = ctx->buf2->used; |
6952
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
344 } else if (uni_utf8_get_valid_data(data, size, ctx->buf2)) { |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
345 output->data = data; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
346 output->size = size; |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
347 } else { |
6952
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
348 output->data = ctx->buf2->data; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
349 output->size = ctx->buf2->used; |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
350 } |
5519
7b6511e67476
Some data still wasn't uppercased
Timo Sirainen <tss@iki.fi>
parents:
5511
diff
changeset
|
351 } else if (ctx->charset_trans == NULL) { |
6915
671c2eb25f3d
Remove illegal UTF-8 sequences from output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
352 /* unknown charset */ |
6952
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
353 buffer_set_used_size(ctx->buf2, 0); |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
354 if (uni_utf8_get_valid_data(data, size, ctx->buf2)) { |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
355 output->data = data; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
356 output->size = size; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
357 } else { |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
358 output->data = ctx->buf2->data; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
359 output->size = ctx->buf2->used; |
08e4d7efcd6a
uni_utf8_get_valid_data() API changed.
Timo Sirainen <tss@iki.fi>
parents:
6951
diff
changeset
|
360 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 } else { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 buffer_set_used_size(ctx->buf2, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 if (ctx->translation_size != 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 translation_buf_decode(ctx, &data, &size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 pos = size; |
6122
d86581f4a0c6
charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
367 (void)charset_to_utf8(ctx->charset_trans, |
d86581f4a0c6
charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
368 data, &pos, ctx->buf2); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 if (pos != size) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 ctx->translation_size = size - pos; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 i_assert(ctx->translation_size <= |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 sizeof(ctx->translation_buf)); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 memcpy(ctx->translation_buf, data + pos, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 ctx->translation_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 output->data = ctx->buf2->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 output->size = ctx->buf2->used; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 output->hdr = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 bool message_decoder_decode_next_block(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 struct message_block *input, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 { |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
388 if (input->part != ctx->prev_part) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 /* MIME part changed. */ |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
390 message_decoder_decode_reset(ctx); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 output->part = input->part; |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
394 ctx->prev_part = input->part; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 if (input->hdr != NULL) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 return message_decode_header(ctx, input->hdr, output); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
398 else if (input->size != 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 return message_decode_body(ctx, input, output); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
400 else { |
6942 | 401 output->hdr = NULL; |
402 output->size = 0; | |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
403 message_decode_body_init_charset(ctx, input->part); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
404 return TRUE; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
405 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 } |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
407 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
408 void message_decoder_decode_reset(struct message_decoder_context *ctx) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
409 { |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
410 i_free_and_null(ctx->content_charset); |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
411 ctx->content_type = CONTENT_TYPE_BINARY; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
412 ctx->charset_utf8 = TRUE; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
413 ctx->encoding_size = 0; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
414 } |