Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 } |