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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 14074
diff changeset
1 /* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents: 9015
diff changeset
3 #include "imap-common.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
6 #include "strescape.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "ostream.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "istream-header-filter.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "message-parser.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "message-send.h"
11428
e5b491043b5e If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents: 11241
diff changeset
12 #include "mail-storage-private.h"
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
13 #include "imap-quote.h"
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 2655
diff changeset
14 #include "imap-parser.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents: 14228
diff changeset
15 #include "imap-msgpart.h"
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "imap-fetch.h"
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <stdlib.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include <ctype.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <unistd.h>
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct imap_fetch_body_data {
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
23 const char *section; /* NOTE: always uppercased */
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
24 struct imap_msgpart *msgpart;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
14623
df8ba29d9eb3 imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
26 unsigned int partial:1;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
27 unsigned int binary:1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
28 unsigned int binary_size:1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 };
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8011
diff changeset
31 static void fetch_read_error(struct imap_fetch_context *ctx)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 {
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
f1e4c99cbb2b Added netscape-eoh workaround.
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
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
cd701884900c Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
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 }