annotate src/lib-imap/imap-bodystructure.c @ 7949:e787f6cae97c HEAD

Added missing Content-Language: support for BODYSTRUCTURE.
author Timo Sirainen <tss@iki.fi>
date Tue, 24 Jun 2008 13:37:55 +0300
parents 81806d402514
children 3412c43d6707
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7086
7ed926ed7aa4 Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents: 7014
diff changeset
1 /* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
4 #include "buffer.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 647
diff changeset
5 #include "istream.h"
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
6 #include "str.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "message-parser.h"
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
8 #include "rfc822-parser.h"
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
9 #include "imap-parser.h"
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
10 #include "imap-quote.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "imap-envelope.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "imap-bodystructure.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
1537
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
14 #define DEFAULT_CHARSET \
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
15 "\"charset\" \"us-ascii\""
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
16
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #define EMPTY_BODYSTRUCTURE \
1537
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
18 "(\"text\" \"plain\" ("DEFAULT_CHARSET") NIL NIL \"7bit\" 0 0)"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
20 struct message_part_body_data {
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
21 pool_t pool;
4816
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
22 const char *content_type, *content_subtype;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
23 const char *content_type_params;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
24 const char *content_transfer_encoding;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
25 const char *content_id;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
26 const char *content_description;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
27 const char *content_disposition;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
28 const char *content_disposition_params;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
29 const char *content_md5;
8ac2a2d27364 Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents: 4280
diff changeset
30 const char *content_language;
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
31 const char *content_location;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
33 struct message_part_envelope_data *envelope;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
34 };
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
36 static void parse_content_type(struct message_part_body_data *data,
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
37 struct message_header_line *hdr)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 {
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
39 struct rfc822_parser_context parser;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
40 const char *key, *value;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
41 string_t *str;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
42 unsigned int i;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
43 bool charset_found = FALSE;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
44
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
45 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: 5836
diff changeset
46 (void)rfc822_skip_lwsp(&parser);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
47
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
48 str = t_str_new(256);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
49 if (rfc822_parse_content_type(&parser, str) < 0)
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
50 return;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
52 /* Save content type and subtype */
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
53 value = str_c(str);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
54 for (i = 0; value[i] != '\0'; i++) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
55 if (value[i] == '/') {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
56 data->content_subtype =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
57 imap_quote(data->pool, str_data(str) + i + 1,
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
58 str_len(str) - (i + 1));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 break;
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
60 }
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
61 }
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
62 data->content_type =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
63 imap_quote(data->pool, str_data(str), i);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
64
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
65 /* parse parameters and save them */
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
66 str_truncate(str, 0);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
67 while (rfc822_parse_content_param(&parser, &key, &value) > 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
68 if (strcasecmp(key, "charset") == 0)
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
69 charset_found = TRUE;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
70
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
71 str_append_c(str, ' ');
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
72 imap_quote_append_string(str, key, TRUE);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
73 str_append_c(str, ' ');
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
74 imap_quote_append_string(str, value, TRUE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
77 if (!charset_found &&
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
78 strcasecmp(data->content_type, "\"text\"") == 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
79 /* set a default charset */
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
80 str_append_c(str, ' ');
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
81 str_append(str, DEFAULT_CHARSET);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
82 }
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
83 if (str_len(str) > 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
84 data->content_type_params =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
85 p_strdup(data->pool, str_c(str) + 1);
896
21ffcce83c70 Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
86 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
89 static void parse_content_transfer_encoding(struct message_part_body_data *data,
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
90 struct message_header_line *hdr)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 {
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
92 struct rfc822_parser_context parser;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
93 string_t *str;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
95 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: 5836
diff changeset
96 (void)rfc822_skip_lwsp(&parser);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
98 str = t_str_new(256);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
99 if (rfc822_parse_mime_token(&parser, str) >= 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
100 data->content_transfer_encoding =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
101 imap_quote(data->pool, str_data(str), str_len(str));
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
102 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
105 static void parse_content_disposition(struct message_part_body_data *data,
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
106 struct message_header_line *hdr)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 {
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
108 struct rfc822_parser_context parser;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
109 const char *key, *value;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
110 string_t *str;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
111
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
112 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: 5836
diff changeset
113 (void)rfc822_skip_lwsp(&parser);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
115 str = t_str_new(256);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
116 if (rfc822_parse_mime_token(&parser, str) < 0)
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
117 return;
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
118 data->content_disposition =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
119 imap_quote(data->pool, str_data(str), str_len(str));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
121 /* parse parameters and save them */
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
122 str_truncate(str, 0);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
123 while (rfc822_parse_content_param(&parser, &key, &value) > 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
124 str_append_c(str, ' ');
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
125 imap_quote_append_string(str, key, TRUE);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
126 str_append_c(str, ' ');
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
127 imap_quote_append_string(str, value, TRUE);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
128 }
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
129 if (str_len(str) > 0) {
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
130 data->content_disposition_params =
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
131 p_strdup(data->pool, str_c(str) + 1);
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
132 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 897
diff changeset
135 static void parse_content_language(const unsigned char *value, size_t value_len,
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
136 struct message_part_body_data *data)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 {
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
138 struct rfc822_parser_context parser;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
139 string_t *str;
398
e807d88e653c Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 342
diff changeset
140
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
141 /* Language-Header = "Content-Language" ":" 1#Language-tag
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
142 Language-Tag = Primary-tag *( "-" Subtag )
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
143 Primary-tag = 1*8ALPHA
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
144 Subtag = 1*8ALPHA */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
146 rfc822_parser_init(&parser, value, value_len, NULL);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
148 str = t_str_new(128);
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
149 str_append_c(str, '"');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
151 (void)rfc822_skip_lwsp(&parser);
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
152 while (rfc822_parse_atom(&parser, str) >= 0) {
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
153 str_append(str, "\" \"");
398
e807d88e653c Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 342
diff changeset
154
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
155 if (parser.data == parser.end || *parser.data != ',')
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
156 break;
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
157 parser.data++;
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
158 (void)rfc822_skip_lwsp(&parser);
398
e807d88e653c Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 342
diff changeset
159 }
e807d88e653c Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 342
diff changeset
160
3407
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
161 if (str_len(str) > 1) {
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
162 str_truncate(str, str_len(str) - 2);
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
163 data->content_language = p_strdup(data->pool, str_c(str));
f484ad51ad9f Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
164 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
167 static void parse_content_header(struct message_part_body_data *d,
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
168 struct message_header_line *hdr,
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
169 pool_t pool)
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
170 {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
171 const char *name = hdr->name + strlen("Content-");
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
172 const unsigned char *value;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
173 size_t value_len;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
174
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
175 if (hdr->continues) {
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
176 hdr->use_full_value = TRUE;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
177 return;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
178 }
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
179
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
180 value = hdr->full_value;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
181 value_len = hdr->full_value_len;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
182
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
183 switch (*name) {
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
184 case 'i':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
185 case 'I':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
186 if (strcasecmp(name, "ID") == 0 && d->content_id == NULL)
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
187 d->content_id = imap_quote(pool, value, value_len);
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
188 break;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
189
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
190 case 'm':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
191 case 'M':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
192 if (strcasecmp(name, "MD5") == 0 && d->content_md5 == NULL)
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
193 d->content_md5 = imap_quote(pool, value, value_len);
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
194 break;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
195
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
196 case 't':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
197 case 'T':
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
198 if (strcasecmp(name, "Type") == 0 && d->content_type == NULL)
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
199 parse_content_type(d, hdr);
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
200 else if (strcasecmp(name, "Transfer-Encoding") == 0 &&
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
201 d->content_transfer_encoding == NULL)
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
202 parse_content_transfer_encoding(d, hdr);
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
203 break;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
204
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
205 case 'l':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
206 case 'L':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
207 if (strcasecmp(name, "Language") == 0 &&
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
208 d->content_language == NULL)
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
209 parse_content_language(value, value_len, d);
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
210 else if (strcasecmp(name, "Location") == 0 &&
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
211 d->content_location == NULL) {
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
212 d->content_location =
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
213 imap_quote(pool, value, value_len);
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
214 }
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
215 break;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
216
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
217 case 'd':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
218 case 'D':
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
219 if (strcasecmp(name, "Description") == 0 &&
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
220 d->content_description == NULL) {
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
221 d->content_description =
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
222 imap_quote(pool, value, value_len);
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
223 } else if (strcasecmp(name, "Disposition") == 0 &&
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
224 d->content_disposition_params == NULL) {
6117
9214044ce1f1 Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
225 parse_content_disposition(d, hdr);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
226 }
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
227 break;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
228 }
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
229 }
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
230
1689
c07b98265577 If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents: 1665
diff changeset
231 void imap_bodystructure_parse_header(pool_t pool, struct message_part *part,
c07b98265577 If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents: 1665
diff changeset
232 struct message_header_line *hdr)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
234 struct message_part_body_data *part_data;
1619
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
235 struct message_part_envelope_data *envelope;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
236 bool parent_rfc822;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
1619
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
238 if (hdr == NULL) {
7014
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
239 if (part->context == NULL) {
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
240 /* no Content-* headers. add an empty context
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
241 structure anyway. */
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
242 part->context = part_data =
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
243 p_new(pool, struct message_part_body_data, 1);
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
244 part_data->pool = pool;
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
245 } else if ((part->flags & MESSAGE_PART_FLAG_IS_MIME) == 0) {
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
246 /* If there was no Mime-Version, forget all
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
247 the Content-stuff */
1619
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
248 part_data = part->context;
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
249 envelope = part_data->envelope;
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
250
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
251 memset(part_data, 0, sizeof(*part_data));
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
252 part_data->pool = pool;
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
253 part_data->envelope = envelope;
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
254 }
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
255 return;
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
256 }
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
257
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
258 if (hdr->eoh)
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
259 return;
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
260
106
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
261 parent_rfc822 = part->parent != NULL &&
1619
5bdda4147b36 Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents: 1618
diff changeset
262 (part->parent->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) != 0;
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
263 if (!parent_rfc822 && strncasecmp(hdr->name, "Content-", 8) != 0)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
10
82b7de533f98 s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
266 if (part->context == NULL) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 /* initialize message part data */
10
82b7de533f98 s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
268 part->context = part_data =
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
269 p_new(pool, struct message_part_body_data, 1);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 part_data->pool = pool;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 }
10
82b7de533f98 s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
272 part_data = part->context;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
274 if (strncasecmp(hdr->name, "Content-", 8) == 0) {
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
275 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
276 parse_content_header(part_data, hdr, pool);
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
277 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
278 }
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 897
diff changeset
279
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 897
diff changeset
280 if (parent_rfc822) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 /* message/rfc822, we need the envelope */
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1257
diff changeset
282 imap_envelope_parse_header(pool, &part_data->envelope, hdr);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285
5334
8d9234a26a3f Make imap_bodystructure_write() parameter constant. Patch by Max Kellermann
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
286 static void part_write_body_multipart(const struct message_part *part,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
287 string_t *str, bool extended)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
289 struct message_part_body_data *data = part->context;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 if (part->children != NULL)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
292 imap_bodystructure_write(part->children, str, extended);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 /* no parts in multipart message,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 that's not allowed. write a single
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 0-length text/plain structure */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
297 str_append(str, EMPTY_BODYSTRUCTURE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
300 str_append_c(str, ' ');
647
1acbf6c8758c handle broken multipart messages without crashing
Timo Sirainen <tss@iki.fi>
parents: 593
diff changeset
301 if (data->content_subtype != NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
302 str_append(str, data->content_subtype);
647
1acbf6c8758c handle broken multipart messages without crashing
Timo Sirainen <tss@iki.fi>
parents: 593
diff changeset
303 else
896
21ffcce83c70 Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
304 str_append(str, "\"x-unknown\"");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 if (!extended)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 /* BODYSTRUCTURE data */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
310 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 if (data->content_type_params == NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
312 str_append(str, "NIL");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
314 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
315 str_append(str, data->content_type_params);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
316 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
319 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 if (data->content_disposition == NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
321 str_append(str, "NIL");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
323 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
324 str_append(str, data->content_disposition);
862
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
325 str_append_c(str, ' ');
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
326
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
327 if (data->content_disposition_params == NULL)
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
328 str_append(str, "NIL");
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
329 else {
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
330 str_append_c(str, '(');
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
331 str_append(str, data->content_disposition_params);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
332 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 }
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
334 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
337 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 if (data->content_language == NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
339 str_append(str, "NIL");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
341 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
342 str_append(str, data->content_language);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
343 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 }
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
345
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
346 str_append_c(str, ' ');
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
347 if (data->content_location == NULL)
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
348 str_append(str, "NIL");
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
349 else
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
350 str_append(str, data->content_location);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352
5334
8d9234a26a3f Make imap_bodystructure_write() parameter constant. Patch by Max Kellermann
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
353 static void part_write_body(const struct message_part *part,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
354 string_t *str, bool extended)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
356 struct message_part_body_data *data = part->context;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
357 bool text;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
359 if (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) {
1665
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
360 str_append(str, "\"message\" \"rfc822\"");
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
361 text = FALSE;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
362 } else {
1665
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
363 /* "content type" "subtype" */
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
364 text = data->content_type == NULL ||
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
365 strcasecmp(data->content_type, "\"text\"") == 0;
1665
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
366 str_append(str, NVL(data->content_type, "\"text\""));
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
367 str_append_c(str, ' ');
1255
58041ce0a24c Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents: 1107
diff changeset
368
1665
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
369 if (data->content_subtype != NULL)
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
370 str_append(str, data->content_subtype);
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
371 else {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
372 if (text)
1665
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
373 str_append(str, "\"plain\"");
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
374 else
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
375 str_append(str, "\"unknown\"");
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
376
e50e21588020 Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents: 1664
diff changeset
377 }
1255
58041ce0a24c Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents: 1107
diff changeset
378 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 /* ("content type param key" "value" ...) */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
381 str_append_c(str, ' ');
1537
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
382 if (data->content_type_params == NULL) {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
383 if (!text)
1537
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
384 str_append(str, "NIL");
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
385 else
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
386 str_append(str, "("DEFAULT_CHARSET")");
d4563a5ba30b Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents: 1327
diff changeset
387 } else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
388 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
389 str_append(str, data->content_type_params);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
390 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
393 str_printfa(str, " %s %s %s %"PRIuUOFF_T,
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
394 NVL(data->content_id, "NIL"),
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
395 NVL(data->content_description, "NIL"),
1255
58041ce0a24c Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents: 1107
diff changeset
396 NVL(data->content_transfer_encoding, "\"7bit\""),
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
397 part->body_size.virtual_size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
399 if (text) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 /* text/.. contains line count */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
401 str_printfa(str, " %u", part->body_size.lines);
106
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
402 } else if (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 /* message/rfc822 contains envelope + body + line count */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
404 struct message_part_body_data *child_data;
1663
4aca99baa9a4 Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
405 struct message_part_envelope_data *env_data;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 i_assert(part->children != NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 i_assert(part->children->next == NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409
10
82b7de533f98 s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
410 child_data = part->children->context;
7014
6835ac721609 Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
411 env_data = child_data->envelope;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412
1664
Timo Sirainen <tss@iki.fi>
parents: 1663
diff changeset
413 str_append(str, " (");
1663
4aca99baa9a4 Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
414 imap_envelope_write_part_data(env_data, str);
4aca99baa9a4 Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
415 str_append(str, ") ");
4aca99baa9a4 Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
416
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
417 imap_bodystructure_write(part->children, str, extended);
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
418 str_printfa(str, " %u", part->body_size.lines);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 if (!extended)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 /* BODYSTRUCTURE data */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 /* "md5" ("content disposition" ("disposition" "params"))
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
427 ("body" "language" "params") "location" */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
428 str_append_c(str, ' ');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
429 str_append(str, NVL(data->content_md5, "NIL"));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
431 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 if (data->content_disposition == NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
433 str_append(str, "NIL");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
435 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
436 str_append(str, data->content_disposition);
862
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
437 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
862
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
439 if (data->content_disposition_params == NULL)
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
440 str_append(str, "NIL");
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
441 else {
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
442 str_append_c(str, '(');
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
443 str_append(str, data->content_disposition_params);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
444 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
862
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
446
375923d2f910 BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents: 833
diff changeset
447 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
450 str_append_c(str, ' ');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 if (data->content_language == NULL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
452 str_append(str, "NIL");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 else {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
454 str_append_c(str, '(');
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
455 str_append(str, data->content_language);
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
456 str_append_c(str, ')');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 }
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
458
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
459 str_append_c(str, ' ');
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
460 if (data->content_location == NULL)
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
461 str_append(str, "NIL");
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
462 else
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
463 str_append(str, data->content_location);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
466 bool imap_bodystructure_is_plain_7bit(const struct message_part *part)
3460
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
467 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
468 const struct message_part_body_data *data = part->context;
3460
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
469
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
470 i_assert(part->parent == NULL);
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
471
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
472 /* if content-type is text/xxx we don't have to check any
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
473 multipart stuff */
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
474 if ((part->flags & MESSAGE_PART_FLAG_TEXT) == 0)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
475 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
476 if (part->next != NULL || part->children != NULL)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
477 return FALSE; /* shouldn't happen normally.. */
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
478
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
479 /* must be text/plain */
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
480 if (data->content_subtype != NULL &&
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
481 strcasecmp(data->content_subtype, "\"plain\"") != 0)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
482 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
483
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
484 /* only allowed parameter is charset=us-ascii, which is also default */
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
485 if (data->content_type_params != NULL &&
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
486 strcasecmp(data->content_type_params, DEFAULT_CHARSET) != 0)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
487 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
488
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
489 if (data->content_id != NULL ||
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
490 data->content_description != NULL)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
491 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
492
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
493 if (data->content_transfer_encoding != NULL &&
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
494 strcasecmp(data->content_transfer_encoding, "\"7bit\"") != 0)
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
495 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
496
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
497 /* BODYSTRUCTURE checks: */
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
498 if (data->content_md5 != NULL ||
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
499 data->content_disposition != NULL ||
7949
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
500 data->content_language != NULL ||
e787f6cae97c Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
501 data->content_location != NULL)
3460
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
502 return FALSE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
503
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
504 return TRUE;
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
505 }
e8cbf3ae00db Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents: 3407
diff changeset
506
5334
8d9234a26a3f Make imap_bodystructure_write() parameter constant. Patch by Max Kellermann
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
507 void imap_bodystructure_write(const struct message_part *part,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
508 string_t *dest, bool extended)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 {
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
510 i_assert(part->parent != NULL || part->next == NULL);
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
511
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 while (part != NULL) {
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
513 if (part->parent != NULL)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
514 str_append_c(dest, '(');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
515
106
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
516 if (part->flags & MESSAGE_PART_FLAG_MULTIPART)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
517 part_write_body_multipart(part, dest, extended);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 else
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
519 part_write_body(part, dest, extended);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
521 if (part->parent != NULL)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
522 str_append_c(dest, ')');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
523
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 part = part->next;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
528 static bool str_append_imap_arg(string_t *str, const struct imap_arg *arg)
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
529 {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
530 switch (arg->type) {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
531 case IMAP_ARG_NIL:
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
532 str_append(str, "NIL");
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
533 break;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
534 case IMAP_ARG_ATOM:
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
535 str_append(str, IMAP_ARG_STR(arg));
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
536 break;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
537 case IMAP_ARG_STRING:
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
538 str_append_c(str, '"');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
539 str_append(str, IMAP_ARG_STR(arg));
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
540 str_append_c(str, '"');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
541 break;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
542 case IMAP_ARG_LITERAL: {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
543 const char *argstr = IMAP_ARG_STR(arg);
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
544
4280
92bf418b8a60 BODYSTRUCTURE -> BODY translation was missing CRLF after literal.
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
545 str_printfa(str, "{%"PRIuSIZE_T"}\r\n", strlen(argstr));
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
546 str_append(str, argstr);
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
547 break;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
548 }
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
549 default:
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
550 return FALSE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
551 }
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
552
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
553 return TRUE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
554 }
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
555
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
556 static bool imap_write_list(const struct imap_arg *args, string_t *str)
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
557 {
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
558 /* don't do any typechecking, just write it out */
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
559 str_append_c(str, '(');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
560 while (args->type != IMAP_ARG_EOL) {
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
561 if (!str_append_imap_arg(str, args)) {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
562 if (args->type != IMAP_ARG_LIST)
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
563 return FALSE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
564
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
565 if (!imap_write_list(IMAP_ARG_LIST_ARGS(args), str))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
566 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
567 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
568 args++;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
569
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
570 if (args->type != IMAP_ARG_EOL)
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
571 str_append_c(str, ' ');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
572 }
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
573 str_append_c(str, ')');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
574 return TRUE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
575 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
576
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
577 static bool imap_parse_bodystructure_args(const struct imap_arg *args,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
578 string_t *str)
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
579 {
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5334
diff changeset
580 const struct imap_arg *subargs;
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
581 const struct imap_arg *list_args;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
582 bool multipart, text, message_rfc822;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
583 int i;
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
584
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
585 multipart = FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
586 while (args->type == IMAP_ARG_LIST) {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
587 str_append_c(str, '(');
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
588 list_args = IMAP_ARG_LIST_ARGS(args);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
589 if (!imap_parse_bodystructure_args(list_args, str))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
590 return FALSE;
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
591 str_append_c(str, ')');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
592
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
593 multipart = TRUE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
594 args++;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
595 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
596
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
597 if (multipart) {
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
598 /* next is subtype of Content-Type. rest is skipped. */
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
599 str_append_c(str, ' ');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
600 return str_append_imap_arg(str, args);
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
601 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
602
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
603 /* "content type" "subtype" */
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
604 if (args[0].type == IMAP_ARG_NIL || args[1].type == IMAP_ARG_NIL)
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
605 return FALSE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
606
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
607 if (!str_append_imap_arg(str, &args[0]))
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
608 return FALSE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
609 str_append_c(str, ' ');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
610 if (!str_append_imap_arg(str, &args[1]))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
611 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
612
3571
b871cd1dc60c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 3570
diff changeset
613 text = strcasecmp(IMAP_ARG_STR_NONULL(&args[0]), "text") == 0;
b871cd1dc60c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 3570
diff changeset
614 message_rfc822 =
b871cd1dc60c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 3570
diff changeset
615 strcasecmp(IMAP_ARG_STR_NONULL(&args[0]), "message") == 0 &&
b871cd1dc60c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 3570
diff changeset
616 strcasecmp(IMAP_ARG_STR_NONULL(&args[1]), "rfc822") == 0;
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
617
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
618 args += 2;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
619
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
620 /* ("content type param key" "value" ...) | NIL */
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
621 if (args->type == IMAP_ARG_LIST) {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
622 str_append(str, " (");
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
623 subargs = IMAP_ARG_LIST_ARGS(args);
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
624 for (; subargs->type != IMAP_ARG_EOL; ) {
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
625 if (!str_append_imap_arg(str, &subargs[0]))
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
626 return FALSE;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
627 str_append_c(str, ' ');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
628 if (!str_append_imap_arg(str, &subargs[1]))
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
629 return FALSE;
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
630
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
631 subargs += 2;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
632 if (subargs->type == IMAP_ARG_EOL)
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
633 break;
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
634 str_append_c(str, ' ');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
635 }
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
636 str_append(str, ")");
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
637 } else if (args->type == IMAP_ARG_NIL) {
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
638 str_append(str, " NIL");
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
639 } else {
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
640 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
641 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
642 args++;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
643
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
644 /* "content id" "content description" "transfer encoding" size */
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
645 for (i = 0; i < 4; i++, args++) {
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
646 str_append_c(str, ' ');
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
647
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 913
diff changeset
648 if (!str_append_imap_arg(str, args))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
649 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
650 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
651
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
652 if (text) {
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
653 /* text/xxx - text lines */
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
654 if (args->type != IMAP_ARG_ATOM)
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
655 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
656
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
657 str_append_c(str, ' ');
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 862
diff changeset
658 str_append(str, IMAP_ARG_STR(args));
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
659 } else if (message_rfc822) {
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
660 /* message/rfc822 - envelope + bodystructure + text lines */
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
661 if (args[0].type != IMAP_ARG_LIST ||
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
662 args[1].type != IMAP_ARG_LIST ||
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
663 args[2].type != IMAP_ARG_ATOM)
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
664 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
665
833
41ec8cadd238 Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents: 768
diff changeset
666 str_append_c(str, ' ');
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
667
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
668 list_args = IMAP_ARG_LIST_ARGS(&args[0]);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
669 if (!imap_write_list(list_args, str))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
670 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
671
4027
0e7a9b0aa8c3 BODYSTRUCTURE -> BODY conversion was broken with mails containing
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
672 str_append(str, " (");
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
673
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
674 list_args = IMAP_ARG_LIST_ARGS(&args[1]);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
675 if (!imap_parse_bodystructure_args(list_args, str))
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
676 return FALSE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
677
4027
0e7a9b0aa8c3 BODYSTRUCTURE -> BODY conversion was broken with mails containing
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
678 str_append(str, ") ");
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 862
diff changeset
679 str_append(str, IMAP_ARG_STR(&args[2]));
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
680 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
681
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
682 return TRUE;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
683 }
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
684
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
685 bool imap_body_parse_from_bodystructure(const char *bodystructure,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3571
diff changeset
686 string_t *dest)
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
687 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
688 struct istream *input;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
689 struct imap_parser *parser;
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5334
diff changeset
690 const struct imap_arg *args;
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
691 int ret;
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
692
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 6117
diff changeset
693 input = i_stream_create_from_data(bodystructure, strlen(bodystructure));
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 647
diff changeset
694 (void)i_stream_read(input);
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
695
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1568
diff changeset
696 parser = imap_parser_create(input, NULL, (size_t)-1);
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1619
diff changeset
697 ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE |
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1619
diff changeset
698 IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
699 ret = ret > 0 && imap_parse_bodystructure_args(args, dest);
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
700
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
701 if (!ret)
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
702 i_error("Error parsing IMAP bodystructure: %s", bodystructure);
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
703
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
704 imap_parser_destroy(&parser);
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4027
diff changeset
705 i_stream_destroy(&input);
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
706 return ret;
445
8179ef2a2c62 If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
707 }