annotate src/imap/imap-fetch-body.c @ 14889:00be97a2139a

imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes. This is in preparation for NOTIFY extension.
author Timo Sirainen <tss@iki.fi>
date Mon, 13 Aug 2012 02:51:09 +0300
parents cf79ab812651
children 0e4be366edb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 14074
diff changeset
1 /* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents: 9015
diff changeset
3 #include "imap-common.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
6 #include "strescape.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "ostream.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "istream-header-filter.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "message-parser.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "message-send.h"
11428
e5b491043b5e If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents: 11241
diff changeset
12 #include "mail-storage-private.h"
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
13 #include "imap-quote.h"
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
14 #include "imap-parser.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents: 14228
diff changeset
15 #include "imap-msgpart.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "imap-fetch.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <stdlib.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include <ctype.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <unistd.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct imap_fetch_body_data {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
23 const char *section; /* NOTE: always uppercased */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
24 struct imap_msgpart *msgpart;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
26 unsigned int partial:1;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
27 unsigned int binary:1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
28 unsigned int binary_size:1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 };
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8011
diff changeset
31 static void fetch_read_error(struct imap_fetch_context *ctx)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 {
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
33 struct imap_fetch_state *state = &ctx->state;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
34
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
35 errno = state->cur_input->stream_errno;
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
36 mail_storage_set_critical(state->cur_mail->box->storage,
11428
e5b491043b5e If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents: 11241
diff changeset
37 "read(%s) failed: %m (FETCH for mailbox %s UID %u)",
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
38 i_stream_get_name(state->cur_input),
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
39 mailbox_get_vname(state->cur_mail->box), state->cur_mail->uid);
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8011
diff changeset
40 }
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
4973
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
42 static const char *get_body_name(const struct imap_fetch_body_data *body)
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
43 {
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
44 string_t *str;
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
45
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
46 str = t_str_new(128);
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
47 if (body->binary_size)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
48 str_append(str, "BINARY.SIZE");
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
49 else if (body->binary)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
50 str_append(str, "BINARY");
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
51 else
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
52 str_append(str, "BODY");
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
53 str_printfa(str, "[%s]", body->section);
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
54 if (body->partial) {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
55 str_printfa(str, "<%"PRIuUOFF_T">",
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
56 imap_msgpart_get_partial_offset(body->msgpart));
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
57 }
4973
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
58 return str_c(str);
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
59 }
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
60
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
61 static string_t *get_prefix(struct imap_fetch_state *state,
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 const struct imap_fetch_body_data *body,
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
63 uoff_t size, bool has_nuls)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 string_t *str;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 str = t_str_new(128);
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
68 if (state->cur_first)
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
69 state->cur_first = FALSE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 else
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 str_append_c(str, ' ');
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
4973
ec41129cd0ef When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
73 str_append(str, get_body_name(body));
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
75 if (size == (uoff_t)-1)
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
76 str_append(str, " NIL");
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
77 else if (has_nuls && body->binary)
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
78 str_printfa(str, " ~{%"PRIuUOFF_T"}\r\n", size);
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
79 else
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 str_printfa(str, " {%"PRIuUOFF_T"}\r\n", size);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 return str;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
84 static int fetch_stream_continue(struct imap_fetch_context *ctx)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 {
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
86 struct imap_fetch_state *state = &ctx->state;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 off_t ret;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 o_stream_set_max_buffer_size(ctx->client->output, 0);
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
90 ret = o_stream_send_istream(ctx->client->output, state->cur_input);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 o_stream_set_max_buffer_size(ctx->client->output, (size_t)-1);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
93 if (ret > 0)
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
94 state->cur_offset += ret;
2448
f1e4c99cbb2b Added netscape-eoh workaround.
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
95
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
96 if (state->cur_offset != state->cur_size) {
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
97 /* unfinished */
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
98 if (state->cur_input->stream_errno != 0) {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
99 fetch_read_error(ctx);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
100 client_disconnect(ctx->client, "FETCH failed");
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
101 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
102 }
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
103 if (!i_stream_have_bytes_left(state->cur_input)) {
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
104 /* Input stream gave less data than expected */
8812
69a5c4798421 imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
105 i_error("FETCH %s for mailbox %s UID %u "
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
106 "got too little data: "
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
107 "%"PRIuUOFF_T" vs %"PRIuUOFF_T,
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
108 state->cur_human_name,
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
109 mailbox_get_vname(state->cur_mail->box),
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
110 state->cur_mail->uid,
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
111 state->cur_offset, state->cur_size);
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
112 mail_set_cache_corrupted(state->cur_mail,
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
113 state->cur_size_field);
9327
a9ffb4614b5e If FETCH gets too little message data, use "FETCH failed" disconnection reason.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
114 client_disconnect(ctx->client, "FETCH failed");
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
115 return -1;
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
116 }
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
117 if (ret < 0) {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
118 /* client probably disconnected */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
119 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
120 }
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
121
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
122 o_stream_set_flush_pending(ctx->client->output, TRUE);
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
123 return 0;
2635
e69519ea4682 Make sure we disconnect if mail input is finished unexpectedly.
Timo Sirainen <tss@iki.fi>
parents: 2557
diff changeset
124 }
5276
56535cb50a09 If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents: 5079
diff changeset
125 return 1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
128 static int fetch_body_msgpart(struct imap_fetch_context *ctx, struct mail *mail,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
129 const struct imap_fetch_body_data *body)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
131 struct imap_msgpart_open_result result;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
132 string_t *str;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
134 if (imap_msgpart_open(mail, body->msgpart, &result) < 0)
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
135 return -1;
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
136 ctx->state.cur_input = result.input;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
137 ctx->state.cur_size = result.size;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
138 ctx->state.cur_size_field = result.size_field;
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
139 ctx->state.cur_human_name = body->section;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
141 str = get_prefix(&ctx->state, body, ctx->state.cur_size,
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
142 result.binary_decoded_input_has_nuls);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
143 o_stream_nsend(ctx->client->output, str_data(str), str_len(str));
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
145 ctx->state.cont_handler = fetch_stream_continue;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
146 return ctx->state.cont_handler(ctx);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
149 static int fetch_binary_size(struct imap_fetch_context *ctx, struct mail *mail,
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
150 const struct imap_fetch_body_data *body)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
151 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
152 string_t *str;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
153 size_t size;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
154
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
155 if (imap_msgpart_size(mail, body->msgpart, &size) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
156 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
157
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
158 str = t_str_new(128);
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
159 if (ctx->state.cur_first)
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
160 ctx->state.cur_first = FALSE;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
161 else
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
162 str_append_c(str, ' ');
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
163 str_printfa(str, "%s %"PRIuUOFF_T, get_body_name(body), size);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
164
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
165 if (o_stream_send(ctx->client->output, str_data(str), str_len(str)) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
166 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
167 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
168 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
169
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
170 /* Parse next digits in string into integer. Returns -1 if the integer
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 becomes too big and wraps. */
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
172 static int read_uoff_t(const char **p, uoff_t *value)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 uoff_t prev;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 *value = 0;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 while (**p >= '0' && **p <= '9') {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 prev = *value;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 *value = *value * 10 + (**p - '0');
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 if (*value < prev)
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
182 return -1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 (*p)++;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
186 return 0;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
189 static int
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
190 body_header_fields_parse(struct imap_fetch_init_context *ctx,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
191 struct imap_fetch_body_data *body, const char *prefix,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
192 const struct imap_arg *args, unsigned int args_count)
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
193 {
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
194 string_t *str;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
195 const char *value;
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
196 size_t i;
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
197
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
198 str = str_new(ctx->pool, 128);
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
199 str_append(str, prefix);
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
200 str_append(str, " (");
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
201
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
202 for (i = 0; i < args_count; i++) {
11063
dbc864c0cff7 lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents: 11000
diff changeset
203 if (!imap_arg_get_astring(&args[i], &value)) {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
204 ctx->error = "Invalid BODY[..] parameter: "
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
205 "Header list contains non-strings";
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
206 return -1;
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
207 }
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
208 value = t_str_ucase(value);
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
209
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
210 if (i != 0)
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
211 str_append_c(str, ' ');
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
212
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
213 if (args[i].type == IMAP_ARG_ATOM)
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
214 str_append(str, value);
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
215 else {
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
216 str_append_c(str, '"');
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
217 imap_dquote_append(str, value);
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
218 str_append_c(str, '"');
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
219 }
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
220 }
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
221 str_append_c(str, ')');
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
222 body->section = str_c(str);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
223 return 0;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
224 }
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
225
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
226 static int body_parse_partial(struct imap_fetch_body_data *body,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
227 const char *p, const char **error_r)
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
228 {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
229 uoff_t offset, size = (uoff_t)-1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
230
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
231 if (*p == '\0')
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
232 return 0;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
233 /* <start.end> */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
234 if (*p != '<') {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
235 *error_r = "Unexpected data after ']'";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
236 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
237 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
238
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
239 p++;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
240 body->partial = TRUE;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
241
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
242 if (read_uoff_t(&p, &offset) < 0 || offset > OFF_T_MAX) {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
243 /* wrapped */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
244 *error_r = "Too big partial start";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
245 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
246 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
247
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
248 if (*p == '.') {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
249 p++;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
250 if (read_uoff_t(&p, &size) < 0 || size > OFF_T_MAX) {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
251 /* wrapped */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
252 *error_r = "Too big partial end";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
253 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
254 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
255 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
256
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
257 if (*p != '>') {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
258 *error_r = "Missing '>' in partial";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
259 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
260 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
261 if (p[1] != '\0') {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
262 *error_r = "Unexpected data after '>'";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
263 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
264 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
265 imap_msgpart_set_partial(body->msgpart, offset, size);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
266 return 0;
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
267 }
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
268
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
269 bool imap_fetch_body_section_init(struct imap_fetch_init_context *ctx)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 struct imap_fetch_body_data *body;
11063
dbc864c0cff7 lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents: 11000
diff changeset
272 const struct imap_arg *list_args;
dbc864c0cff7 lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents: 11000
diff changeset
273 unsigned int list_count;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
274 const char *str, *p, *error;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
276 i_assert(strncmp(ctx->name, "BODY", 4) == 0);
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
277 p = ctx->name + 4;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
278
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
279 body = p_new(ctx->pool, struct imap_fetch_body_data, 1);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
14624
3a8ada7302a3 imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents: 14623
diff changeset
281 if (strncmp(p, ".PEEK", 5) == 0)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 p += 5;
14624
3a8ada7302a3 imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents: 14623
diff changeset
283 else
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
284 ctx->fetch_ctx->flags_update_seen = TRUE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 if (*p != '[') {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
286 ctx->error = "Invalid BODY[..] parameter: Missing '['";
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 return FALSE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
290 if (imap_arg_get_list_full(&ctx->args[0], &list_args, &list_count)) {
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
291 /* BODY[HEADER.FIELDS.. (headers list)] */
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
292 if (!imap_arg_get_atom(&ctx->args[1], &str) ||
11063
dbc864c0cff7 lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents: 11000
diff changeset
293 str[0] != ']') {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
294 ctx->error = "Invalid BODY[..] parameter: Missing ']'";
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
295 return FALSE;
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
296 }
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
297 if (body_header_fields_parse(ctx, body, p+1,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
298 list_args, list_count) < 0)
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
299 return FALSE;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
300 p = str+1;
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
301 ctx->args += 2;
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
302 } else {
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
303 /* no headers list */
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
304 body->section = p+1;
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
305 p = strchr(body->section, ']');
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
306 if (p == NULL) {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
307 ctx->error = "Invalid BODY[..] parameter: Missing ']'";
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
308 return FALSE;
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
309 }
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
310 body->section = p_strdup_until(ctx->pool, body->section, p);
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
311 p++;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
312 }
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14887
diff changeset
313 if (imap_msgpart_parse(body->section, &body->msgpart) < 0) {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
314 ctx->error = "Invalid BODY[..] section";
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
315 return -1;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
316 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
317 ctx->fetch_ctx->fetch_data |=
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
318 imap_msgpart_get_fetch_data(body->msgpart);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
319
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
320 if (body_parse_partial(body, p, &error) < 0) {
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
321 ctx->error = p_strdup_printf(ctx->pool,
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
322 "Invalid BODY[..] parameter: %s", error);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
323 return FALSE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
326 /* update the section name for the imap_fetch_add_handler() */
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
327 ctx->name = p_strdup(ctx->pool, get_body_name(body));
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
328 imap_fetch_add_handler(ctx, 0, "NIL", fetch_body_msgpart, body);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
329 return TRUE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
332 bool imap_fetch_binary_init(struct imap_fetch_init_context *ctx)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
333 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
334 struct imap_fetch_body_data *body;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
335 const struct imap_arg *list_args;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
336 unsigned int list_count;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
337 const char *str, *p, *error;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
338
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
339 i_assert(strncmp(ctx->name, "BINARY", 6) == 0);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
340 p = ctx->name + 6;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
341
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
342 body = p_new(ctx->pool, struct imap_fetch_body_data, 1);
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
343 body->binary = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
344
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
345 if (strncmp(p, ".SIZE", 5) == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
346 /* fetch decoded size of the section */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
347 p += 5;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
348 body->binary_size = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
349 } else if (strncmp(p, ".PEEK", 5) == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
350 p += 5;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
351 } else {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
352 ctx->fetch_ctx->flags_update_seen = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
353 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
354 if (*p != '[') {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
355 ctx->error = "Invalid BINARY[..] parameter: Missing '['";
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
356 return FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
357 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
358
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
359 if (imap_arg_get_list_full(&ctx->args[0], &list_args, &list_count)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
360 /* BINARY[HEADER.FIELDS.. (headers list)] */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
361 if (!imap_arg_get_atom(&ctx->args[1], &str) ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
362 str[0] != ']') {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
363 ctx->error = "Invalid BINARY[..] parameter: Missing ']'";
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
364 return FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
365 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
366 if (body_header_fields_parse(ctx, body, p+1,
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
367 list_args, list_count) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
368 return FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
369 p = str+1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
370 ctx->args += 2;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
371 } else {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
372 /* no headers list */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
373 body->section = p+1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
374 p = strchr(body->section, ']');
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
375 if (p == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
376 ctx->error = "Invalid BINARY[..] parameter: Missing ']'";
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
377 return FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
378 }
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
379 body->section = p_strdup_until(ctx->pool, body->section, p);
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
380 p++;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
381 }
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14887
diff changeset
382 if (imap_msgpart_parse(body->section, &body->msgpart) < 0) {
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
383 ctx->error = "Invalid BINARY[..] section";
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
384 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
385 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
386 imap_msgpart_set_decode_to_binary(body->msgpart);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
387 ctx->fetch_ctx->fetch_data |=
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
388 imap_msgpart_get_fetch_data(body->msgpart);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
389
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
390 if (!body->binary_size) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
391 if (body_parse_partial(body, p, &error) < 0) {
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
392 ctx->error = p_strdup_printf(ctx->pool,
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
393 "Invalid BINARY[..] parameter: %s", error);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
394 return FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
395 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
396 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
397
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
398 /* update the section name for the imap_fetch_add_handler() */
14889
00be97a2139a imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
399 ctx->name = p_strdup(ctx->pool, get_body_name(body));
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
400 if (body->binary_size)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
401 imap_fetch_add_handler(ctx, 0, "NIL", fetch_binary_size, body);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
402 else
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
403 imap_fetch_add_handler(ctx, 0, "NIL", fetch_body_msgpart, body);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
404 return TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
405 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
406
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
407 static int ATTR_NULL(3)
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
408 fetch_rfc822_size(struct imap_fetch_context *ctx, struct mail *mail,
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
409 void *context ATTR_UNUSED)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 uoff_t size;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
413 if (mail_get_virtual_size(mail, &size) < 0)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 return -1;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
416 str_printfa(ctx->state.cur_str, "RFC822.SIZE %"PRIuUOFF_T" ", size);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 return 1;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
420 static int
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
421 fetch_and_free_msgpart(struct imap_fetch_context *ctx,
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
422 struct mail *mail, struct imap_msgpart **_msgpart)
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
423 {
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
424 struct imap_msgpart_open_result result;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
425 int ret;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
426
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
427 ret = imap_msgpart_open(mail, *_msgpart, &result);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
428 imap_msgpart_free(_msgpart);
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
429 if (ret < 0)
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
430 return -1;
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
431 ctx->state.cur_input = result.input;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
432 ctx->state.cur_size = result.size;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
433 ctx->state.cur_size_field = result.size_field;
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
434 ctx->state.cont_handler = fetch_stream_continue;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
435 return 0;
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
436 }
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
437
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
438 static int ATTR_NULL(3)
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
439 fetch_rfc822(struct imap_fetch_context *ctx, struct mail *mail,
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
440 void *context ATTR_UNUSED)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
442 struct imap_msgpart *msgpart;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 const char *str;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
444
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
445 msgpart = imap_msgpart_full();
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
446 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0)
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
447 return -1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
449 str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n",
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
450 ctx->state.cur_size);
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
451 if (ctx->state.cur_first) {
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
452 str++; ctx->state.cur_first = FALSE;
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
453 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
454 o_stream_nsend_str(ctx->client->output, str);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
456 ctx->state.cur_human_name = "RFC822";
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
457 return ctx->state.cont_handler(ctx);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
460 static int ATTR_NULL(3)
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
461 fetch_rfc822_header(struct imap_fetch_context *ctx,
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
462 struct mail *mail, void *context ATTR_UNUSED)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
464 struct imap_msgpart *msgpart;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 const char *str;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
467 msgpart = imap_msgpart_header();
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
468 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0)
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
469 return -1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n",
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
472 ctx->state.cur_size);
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
473 if (ctx->state.cur_first) {
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
474 str++; ctx->state.cur_first = FALSE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
476 o_stream_nsend_str(ctx->client->output, str);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
478 ctx->state.cur_human_name = "RFC822.HEADER";
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
479 return ctx->state.cont_handler(ctx);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
482 static int ATTR_NULL(3)
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
483 fetch_rfc822_text(struct imap_fetch_context *ctx, struct mail *mail,
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14624
diff changeset
484 void *context ATTR_UNUSED)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
486 struct imap_msgpart *msgpart;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 const char *str;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
489 msgpart = imap_msgpart_body();
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
490 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0)
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
491 return -1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n",
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
494 ctx->state.cur_size);
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
495 if (ctx->state.cur_first) {
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
496 str++; ctx->state.cur_first = FALSE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
498 o_stream_nsend_str(ctx->client->output, str);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499
14887
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
500 ctx->state.cur_human_name = "RFC822.TEXT";
0c73a42c194e imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
501 return ctx->state.cont_handler(ctx);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
504 bool imap_fetch_rfc822_init(struct imap_fetch_init_context *ctx)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
506 const char *name = ctx->name;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
507
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
508 if (name[6] == '\0') {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
509 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_HEADER |
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 MAIL_FETCH_STREAM_BODY;
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
511 ctx->fetch_ctx->flags_update_seen = TRUE;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
512 imap_fetch_add_handler(ctx, 0, "NIL", fetch_rfc822, NULL);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 return TRUE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
516 if (strcmp(name+6, ".SIZE") == 0) {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
517 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_VIRTUAL_SIZE;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
518 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_BUFFERED,
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
519 "0", fetch_rfc822_size, NULL);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 return TRUE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 }
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
522 if (strcmp(name+6, ".HEADER") == 0) {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
523 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_HEADER;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
524 imap_fetch_add_handler(ctx, 0, "NIL",
4073
cd701884900c Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
525 fetch_rfc822_header, NULL);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 return TRUE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 }
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
528 if (strcmp(name+6, ".TEXT") == 0) {
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
529 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_BODY;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
530 ctx->fetch_ctx->flags_update_seen = TRUE;
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
531 imap_fetch_add_handler(ctx, 0, "NIL", fetch_rfc822_text, NULL);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 return TRUE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534
14228
d8a88e53f1e6 imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
535 ctx->error = t_strconcat("Unknown parameter ", name, NULL);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 return FALSE;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 }