Mercurial > dovecot > core-2.2
annotate src/imap/imap-fetch-body.c @ 14859:f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 11 Aug 2012 05:31:46 +0300 |
parents | d0d7b810646b |
children | f0feae227c60 |
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 { |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
33 errno = ctx->cur_input->stream_errno; |
11428
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
34 mail_storage_set_critical(ctx->box->storage, |
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
35 "read(%s) failed: %m (FETCH for mailbox %s UID %u)", |
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
36 i_stream_get_name(ctx->cur_input), |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
37 mailbox_get_vname(ctx->cur_mail->box), ctx->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
|
38 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
40 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
|
41 { |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
42 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
|
43 |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
44 str = t_str_new(128); |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
45 if (body->binary_size) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
46 str_append(str, "BINARY.SIZE"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
47 else if (body->binary) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
48 str_append(str, "BINARY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
49 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
50 str_append(str, "BODY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
51 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
|
52 if (body->partial) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
53 str_printfa(str, "<%"PRIuUOFF_T">", |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
54 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
|
55 } |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
56 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
|
57 } |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
58 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 static string_t *get_prefix(struct imap_fetch_context *ctx, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 const struct imap_fetch_body_data *body, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 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
|
62 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 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
|
64 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 str = t_str_new(128); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 if (ctx->first) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 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
|
70 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
71 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
|
72 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if (size != (uoff_t)-1) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 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
|
75 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 str_append(str, " NIL"); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 return str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
80 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
|
81 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 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
|
83 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 o_stream_set_max_buffer_size(ctx->client->output, 0); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 ret = o_stream_send_istream(ctx->client->output, ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 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
|
87 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
88 if (ret > 0) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
89 ctx->cur_offset += ret; |
2448 | 90 |
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
|
91 if (ctx->cur_offset != ctx->cur_size) { |
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
|
92 /* unfinished */ |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
93 if (ctx->cur_input->stream_errno != 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
94 fetch_read_error(ctx); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
95 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
|
96 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
97 } |
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
|
98 if (!i_stream_have_bytes_left(ctx->cur_input)) { |
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
|
99 /* 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
|
100 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
|
101 "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
|
102 "%"PRIuUOFF_T" vs %"PRIuUOFF_T, |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
103 ctx->cur_name, mailbox_get_vname(ctx->cur_mail->box), |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
104 ctx->cur_mail->uid, ctx->cur_offset, ctx->cur_size); |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
105 mail_set_cache_corrupted(ctx->cur_mail, |
11241
be74fa9bfcc9
imap: If FETCH notices cached message size is wrong, mark cache corrupted (second such check).
Timo Sirainen <tss@iki.fi>
parents:
11063
diff
changeset
|
106 ctx->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
|
107 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
|
108 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
|
109 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
110 if (ret < 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
111 /* client probably disconnected */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
112 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
113 } |
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
|
114 |
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 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
|
116 return 0; |
2635
e69519ea4682
Make sure we disconnect if mail input is finished unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
2557
diff
changeset
|
117 } |
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
|
118 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
|
119 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
121 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
|
122 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
|
123 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
124 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
|
125 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
|
126 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
127 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
|
128 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
129 ctx->cur_input = result.input; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
130 ctx->cur_size = result.size; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
131 ctx->cur_size_field = result.size_field; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
132 ctx->cur_name = p_strconcat(ctx->pool, "[", body->section, "]", NULL); |
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 str = get_prefix(ctx, body, ctx->cur_size); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
135 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
|
136 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
137 ctx->cont_handler = fetch_stream_continue; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 return ctx->cont_handler(ctx); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
141 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
|
142 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
|
143 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
144 string_t *str; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
145 size_t size; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
146 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
147 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
|
148 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
149 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
150 str = t_str_new(128); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
151 if (ctx->first) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
152 ctx->first = FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
153 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
154 str_append_c(str, ' '); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
155 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
|
156 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
157 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
|
158 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
159 return 1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
160 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
161 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
162 /* 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
|
163 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
|
164 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
|
165 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 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
|
167 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 *value = 0; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 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
|
170 prev = *value; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 *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
|
172 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 if (*value < prev) |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
174 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
|
175 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 (*p)++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
178 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
|
179 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
181 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
186 string_t *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
187 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
|
188 size_t i; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
189 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
190 str = str_new(ctx->fetch_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
|
191 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
|
192 str_append(str, " ("); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
193 |
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
|
194 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
|
195 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
|
196 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
197 "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
|
198 return -1; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
199 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
200 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
|
201 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
202 if (i != 0) |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
203 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
|
204 |
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
|
205 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
|
206 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
|
207 else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
208 str_append_c(str, '"'); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
209 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
|
210 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
|
211 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
212 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
213 str_append_c(str, ')'); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
214 body->section = str_c(str); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
215 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
216 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
217 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
218 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
|
219 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
|
220 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
221 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
|
222 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
223 if (*p == '\0') |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
224 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
225 /* <start.end> */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
226 if (*p != '<') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
227 *error_r = "Unexpected data after ']'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
228 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
229 } |
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 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
232 body->partial = TRUE; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
233 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
234 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
|
235 /* wrapped */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
236 *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
|
237 return -1; |
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 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
240 if (*p == '.') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
241 p++; |
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, &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
|
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 end"; |
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 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
249 if (*p != '>') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
250 *error_r = "Missing '>' in partial"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
251 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
252 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
253 if (p[1] != '\0') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
254 *error_r = "Unexpected data after '>'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
255 return -1; |
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 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
|
258 return 0; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
259 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
260 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
261 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
|
262 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 struct imap_fetch_body_data *body; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
264 const struct imap_arg *list_args; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
265 unsigned int list_count; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
266 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
|
267 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
268 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
|
269 p = ctx->name + 4; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
270 |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
271 body = p_new(ctx->fetch_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
|
272 |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
273 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
|
274 p += 5; |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
275 else |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
276 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
|
277 if (*p != '[') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
278 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
|
279 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
282 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
|
283 /* BODY[HEADER.FIELDS.. (headers list)] */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
284 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
|
285 str[0] != ']') { |
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 ']'"; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
287 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
288 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
289 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
|
290 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
|
291 return FALSE; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
292 p = str+1; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
293 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
|
294 } else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
295 /* no headers list */ |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
296 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
|
297 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
|
298 if (p == NULL) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
299 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
|
300 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
301 } |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
302 body->section = p_strdup_until(ctx->fetch_ctx->pool, |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
303 body->section, p); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
304 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
305 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
306 if (imap_msgpart_parse(ctx->fetch_ctx->box, body->section, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
307 &body->msgpart) < 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
308 ctx->error = "Invalid BODY[..] section"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
309 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
310 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
311 ctx->fetch_ctx->fetch_data |= |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
312 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
|
313 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
314 if (body_parse_partial(body, p, &error) < 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
315 ctx->error = p_strdup_printf(ctx->fetch_ctx->pool, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
316 "Invalid BODY[..] parameter: %s", error); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
317 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
|
318 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
320 /* update the section name for the imap_fetch_add_handler() */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
321 ctx->name = p_strdup(ctx->fetch_ctx->pool, get_body_name(body)); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
322 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
|
323 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
|
324 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
326 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
|
327 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
328 struct imap_fetch_body_data *body; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
329 const struct imap_arg *list_args; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
330 unsigned int list_count; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
331 const char *str, *p, *error; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
332 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
333 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
|
334 p = ctx->name + 6; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
335 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
336 body = p_new(ctx->fetch_ctx->pool, struct imap_fetch_body_data, 1); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
337 body->binary = TRUE; |
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 if (strncmp(p, ".SIZE", 5) == 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
340 /* fetch decoded size of the section */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
341 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
342 body->binary_size = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
343 } 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
|
344 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
345 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
346 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
|
347 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
348 if (*p != '[') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
349 ctx->error = "Invalid BINARY[..] parameter: Missing '['"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
350 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
351 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
352 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
353 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
|
354 /* BINARY[HEADER.FIELDS.. (headers list)] */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
355 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
|
356 str[0] != ']') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
357 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
358 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
359 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
360 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
|
361 list_args, list_count) < 0) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
362 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
363 p = str+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
364 ctx->args += 2; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
365 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
366 /* no headers list */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
367 body->section = p+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
368 p = strchr(body->section, ']'); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
369 if (p == NULL) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
370 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
371 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
372 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
373 body->section = p_strdup_until(ctx->fetch_ctx->pool, |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
374 body->section, p); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
375 p++; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
376 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
377 if (imap_msgpart_parse(ctx->fetch_ctx->box, body->section, |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
378 &body->msgpart) < 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
379 ctx->error = "Invalid BINARY[..] section"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
380 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
381 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
382 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
|
383 ctx->fetch_ctx->fetch_data |= |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
384 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
|
385 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
386 if (!body->binary_size) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
387 if (body_parse_partial(body, p, &error) < 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
388 ctx->error = p_strdup_printf(ctx->fetch_ctx->pool, |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
389 "Invalid BINARY[..] parameter: %s", error); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
390 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
391 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
392 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
393 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
394 /* update the section name for the imap_fetch_add_handler() */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
395 ctx->name = p_strdup(ctx->fetch_ctx->pool, get_body_name(body)); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
396 if (body->binary_size) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
397 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
|
398 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
399 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
|
400 return TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
401 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
402 |
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
|
403 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
|
404 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
|
405 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
|
406 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 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
|
408 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
409 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
|
410 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 str_printfa(ctx->cur_str, "RFC822.SIZE %"PRIuUOFF_T" ", size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
416 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
417 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
|
418 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
|
419 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
420 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
|
421 int ret; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
422 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
423 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
|
424 imap_msgpart_free(_msgpart); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
425 if (ret < 0) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
426 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
427 ctx->cur_input = result.input; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
428 ctx->cur_size = result.size; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
429 ctx->cur_size_field = result.size_field; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
430 ctx->cont_handler = fetch_stream_continue; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
431 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
432 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
433 |
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
|
434 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
|
435 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
|
436 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
|
437 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
438 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
|
439 const char *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
440 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
441 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
|
442 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
|
443 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
|
444 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
445 str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n", ctx->cur_size); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
446 if (ctx->first) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
447 str++; ctx->first = FALSE; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
448 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
449 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
|
450 |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
451 ctx->cur_name = "RFC822"; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
452 return ctx->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
|
453 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 |
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
|
455 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
|
456 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
|
457 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
|
458 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
459 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
|
460 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
|
461 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
462 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
|
463 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
|
464 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
|
465 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n", |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
467 ctx->cur_size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 if (ctx->first) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 str++; ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
471 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
|
472 |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
473 ctx->cur_name = "RFC822.HEADER"; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
474 return ctx->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
|
475 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 |
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
|
477 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
|
478 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
|
479 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
|
480 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
481 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
|
482 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
|
483 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n", |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
489 ctx->cur_size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 if (ctx->first) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 str++; ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
493 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
|
494 |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
495 ctx->cur_name = "RFC822.TEXT"; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
496 return ctx->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
|
497 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
499 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
|
500 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
501 const char *name = ctx->name; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
502 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
503 if (name[6] == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
504 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
|
505 MAIL_FETCH_STREAM_BODY; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
506 ctx->fetch_ctx->flags_update_seen = TRUE; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
507 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
|
508 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
510 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
511 if (strcmp(name+6, ".SIZE") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
512 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
|
513 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
|
514 "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
|
515 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
517 if (strcmp(name+6, ".HEADER") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
518 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
|
519 imap_fetch_add_handler(ctx, 0, "NIL", |
4073 | 520 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
|
521 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
523 if (strcmp(name+6, ".TEXT") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
524 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
|
525 ctx->fetch_ctx->flags_update_seen = TRUE; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
526 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
|
527 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
530 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
|
531 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 } |