annotate src/lib-storage/index/imapc/imapc-mail-fetch.c @ 21659:0f6a1fee4c7f

imapc: Error handling wasn't setting storage error everywhere. This would have used the previous error, which might not have been correct.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 21 Feb 2017 15:44:09 +0200
parents 47ab3e3483be
children f9c13c7c7be2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19971
diff changeset
1 /* Copyright (c) 2011-2017 Dovecot authors, see the included COPYING file */
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "str.h"
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
5 #include "ioloop.h"
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
7 #include "istream-concat.h"
13524
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
8 #include "istream-header-filter.h"
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
9 #include "message-header-parser.h"
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "imap-arg.h"
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "imap-date.h"
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
12 #include "imap-quote.h"
19653
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
13 #include "imap-resp-code.h"
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "imapc-client.h"
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "imapc-mail.h"
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "imapc-storage.h"
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
19653
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
18 static void imapc_mail_set_failure(struct imapc_mail *mail,
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
19 const struct imapc_command_reply *reply)
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
20 {
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
21 struct imapc_mailbox *mbox =
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
22 (struct imapc_mailbox *)mail->imail.mail.mail.box;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
23
19665
cb104cf148af imapc: If FETCH didn't send our wanted data, log the tagged FETCH reply text.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19664
diff changeset
24 mail->last_fetch_reply = p_strdup(mail->imail.mail.pool, reply->text_full);
cb104cf148af imapc: If FETCH didn't send our wanted data, log the tagged FETCH reply text.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19664
diff changeset
25
19653
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
26 switch (reply->state) {
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
27 case IMAPC_COMMAND_STATE_OK:
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
28 break;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
29 case IMAPC_COMMAND_STATE_NO:
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
30 if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_FIX_BROKEN_MAILS)) {
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
31 /* fetch-fix-broken-mails feature disabled -
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
32 fail any mails with missing replies */
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
33 break;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
34 }
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
35 if (reply->resp_text_key != NULL &&
19664
d6561d5a8fb4 imapc: Don't use fetch-fix-broken-mails for NO [LIMIT] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19663
diff changeset
36 (strcasecmp(reply->resp_text_key, IMAP_RESP_CODE_SERVERBUG) == 0 ||
d6561d5a8fb4 imapc: Don't use fetch-fix-broken-mails for NO [LIMIT] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19663
diff changeset
37 strcasecmp(reply->resp_text_key, IMAP_RESP_CODE_LIMIT) == 0)) {
d6561d5a8fb4 imapc: Don't use fetch-fix-broken-mails for NO [LIMIT] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19663
diff changeset
38 /* this is a temporary error, retrying should work.
d6561d5a8fb4 imapc: Don't use fetch-fix-broken-mails for NO [LIMIT] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19663
diff changeset
39 Yahoo sends * BYE +
d6561d5a8fb4 imapc: Don't use fetch-fix-broken-mails for NO [LIMIT] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19663
diff changeset
40 NO [LIMIT] UID FETCH Rate limit hit. */
19653
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
41 } else {
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
42 /* hopefully this is a permanent failure */
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
43 mail->fetch_ignore_if_missing = TRUE;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
44 }
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
45 break;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
46 case IMAPC_COMMAND_STATE_BAD:
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
47 case IMAPC_COMMAND_STATE_DISCONNECTED:
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
48 mail->fetch_failed = TRUE;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
49 break;
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
50 }
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
51 }
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
52
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 static void
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
54 imapc_mail_fetch_callback(const struct imapc_command_reply *reply,
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
55 void *context)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
57 struct imapc_fetch_request *request = context;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
58 struct imapc_fetch_request *const *requests;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
59 struct imapc_mail *const *mailp;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
60 struct imapc_mailbox *mbox = NULL;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
61 unsigned int i, count;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
63 array_foreach(&request->mails, mailp) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
64 struct imapc_mail *mail = *mailp;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
66 i_assert(mail->fetch_count > 0);
19653
9a021ef4841a imapc: Don't use fetch-fix-broken-mails for OK and NO [SERVERBUG] FETCH replies
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19631
diff changeset
67 imapc_mail_set_failure(mail, reply);
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
68 if (--mail->fetch_count == 0)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
69 mail->fetching_fields = 0;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
70 pool_unref(&mail->imail.mail.pool);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
71 mbox = (struct imapc_mailbox *)mail->imail.mail.mail.box;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
72 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
73 i_assert(mbox != NULL);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
75 requests = array_get(&mbox->fetch_requests, &count);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
76 for (i = 0; i < count; i++) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
77 if (requests[i] == request) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
78 array_delete(&mbox->fetch_requests, i, 1);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
79 break;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 }
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
82 i_assert(i < count);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
83
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
84 array_free(&request->mails);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
85 i_free(request);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 if (reply->state == IMAPC_COMMAND_STATE_OK)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 ;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 else if (reply->state == IMAPC_COMMAND_STATE_NO) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 imapc_copy_error_from_reply(mbox->storage, MAIL_ERROR_PARAMS,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 reply);
13437
ec947cc9c9c7 imapc: If mail prefetching fails because of disconnection, don't log about it again.
Timo Sirainen <tss@iki.fi>
parents: 13383
diff changeset
92 } else if (reply->state == IMAPC_COMMAND_STATE_DISCONNECTED) {
ec947cc9c9c7 imapc: If mail prefetching fails because of disconnection, don't log about it again.
Timo Sirainen <tss@iki.fi>
parents: 13383
diff changeset
93 /* The disconnection message was already logged */
ec947cc9c9c7 imapc: If mail prefetching fails because of disconnection, don't log about it again.
Timo Sirainen <tss@iki.fi>
parents: 13383
diff changeset
94 mail_storage_set_internal_error(&mbox->storage->storage);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 } else {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 mail_storage_set_critical(&mbox->storage->storage,
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
97 "imapc: Mail FETCH failed: %s", reply->text_full);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
16586
620876853f6f imapc: Reorganize code so that imapc_list works without imapc_storage.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
99 imapc_client_stop(mbox->storage->client->client);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
102 static bool
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
103 headers_have_subset(const char *const *superset, const char *const *subset)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
104 {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
105 unsigned int i;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
106
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
107 if (superset == NULL)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
108 return FALSE;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
109 if (subset != NULL) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
110 for (i = 0; subset[i] != NULL; i++) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
111 if (!str_array_icase_find(superset, subset[i]))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
112 return FALSE;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
113 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
114 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
115 return TRUE;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
116 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
117
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
118 static const char *const *
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
119 headers_merge(pool_t pool, const char *const *h1, const char *const *h2)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
120 {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
121 ARRAY_TYPE(const_string) headers;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
122 const char *value;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
123 unsigned int i;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
124
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
125 p_array_init(&headers, pool, 16);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
126 if (h1 != NULL) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
127 for (i = 0; h1[i] != NULL; i++) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
128 value = p_strdup(pool, h1[i]);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
129 array_append(&headers, &value, 1);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
130 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
131 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
132 if (h2 != NULL) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
133 for (i = 0; h2[i] != NULL; i++) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
134 if (h1 == NULL || !str_array_icase_find(h1, h2[i])) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
135 value = p_strdup(pool, h2[i]);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
136 array_append(&headers, &value, 1);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
137 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
138 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
139 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
140 array_append_zero(&headers);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
141 return array_idx(&headers, 0);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
142 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
143
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
144 static bool
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
145 imapc_mail_try_merge_fetch(struct imapc_mailbox *mbox, string_t *str)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
146 {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
147 const char *s1 = str_c(str);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
148 const char *s2 = str_c(mbox->pending_fetch_cmd);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
149 const char *p1, *p2;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
150
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
151 i_assert(strncmp(s1, "UID FETCH ", 10) == 0);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
152 i_assert(strncmp(s2, "UID FETCH ", 10) == 0);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
153
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
154 /* skip over UID range */
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
155 p1 = strchr(s1+10, ' ');
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
156 p2 = strchr(s2+10, ' ');
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
157
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
158 if (null_strcmp(p1, p2) != 0)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
159 return FALSE;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
160 /* append the new UID to the pending FETCH UID range */
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
161 str_truncate(str, p1-s1);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
162 str_insert(mbox->pending_fetch_cmd, p2-s2, ",");
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
163 str_insert(mbox->pending_fetch_cmd, p2-s2+1, str_c(str) + 10);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
164 return TRUE;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
165 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
166
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
167 static void
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
168 imapc_mail_delayed_send_or_merge(struct imapc_mail *mail, string_t *str)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
169 {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
170 struct imapc_mailbox *mbox =
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
171 (struct imapc_mailbox *)mail->imail.mail.mail.box;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
172
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
173 if (mbox->pending_fetch_request != NULL &&
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
174 !imapc_mail_try_merge_fetch(mbox, str)) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
175 /* send the previous FETCH and create a new one */
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
176 imapc_mail_fetch_flush(mbox);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
177 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
178 if (mbox->pending_fetch_request == NULL) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
179 mbox->pending_fetch_request =
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
180 i_new(struct imapc_fetch_request, 1);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
181 i_array_init(&mbox->pending_fetch_request->mails, 4);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
182 i_assert(mbox->pending_fetch_cmd->used == 0);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
183 str_append_str(mbox->pending_fetch_cmd, str);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
184 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
185 array_append(&mbox->pending_fetch_request->mails, &mail, 1);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
186
18323
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
187 if (mbox->to_pending_fetch_send == NULL &&
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
188 array_count(&mbox->pending_fetch_request->mails) >
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
189 mbox->box.storage->set->mail_prefetch_count) {
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
190 /* we're now prefetching the maximum number of mails. this
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
191 most likely means that we need to flush out the command now
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
192 before sending anything else. delay it a little bit though
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
193 in case the sending code doesn't actually use
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
194 mail_prefetch_count and wants to fetch more.
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
195
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
196 note that we don't want to add this timeout too early,
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
197 because we want to optimize the maximum number of messages
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
198 placed into a single FETCH. even without timeout the command
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
199 gets flushed by imapc_mail_fetch() call. */
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
200 mbox->to_pending_fetch_send =
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
201 timeout_add_short(0, imapc_mail_fetch_flush, mbox);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
202 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
203 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
204
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 static int
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
206 imapc_mail_send_fetch(struct mail *_mail, enum mail_fetch_field fields,
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
207 const char *const *headers)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 struct imapc_mail *mail = (struct imapc_mail *)_mail;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
12883
0dec197d1bb7 imapc: Fixes to handling expunges.
Timo Sirainen <tss@iki.fi>
parents: 12880
diff changeset
211 struct mail_index_view *view;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 string_t *str;
12883
0dec197d1bb7 imapc: Fixes to handling expunges.
Timo Sirainen <tss@iki.fi>
parents: 12880
diff changeset
213 uint32_t seq;
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
214 unsigned int i;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
21659
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
216 if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
217 mail_set_aborted(_mail);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 return -1;
21659
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
219 }
21597
47ab3e3483be lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
220 _mail->mail_stream_opened = TRUE;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 /* drop any fields that we may already be fetching currently */
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 fields &= ~mail->fetching_fields;
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
224 if (headers_have_subset(mail->fetching_headers, headers))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
225 headers = NULL;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
226 if (fields == 0 && headers == NULL)
18322
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
227 return mail->fetch_sent ? 0 : 1;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
13609
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
229 if (!_mail->saving) {
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
230 /* if we already know that the mail is expunged,
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
231 don't try to FETCH it */
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
232 view = mbox->delayed_sync_view != NULL ?
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
233 mbox->delayed_sync_view : mbox->box.view;
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
234 if (!mail_index_lookup_seq(view, _mail->uid, &seq) ||
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
235 mail_index_is_expunged(view, seq)) {
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
236 mail_set_expunged(_mail);
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
237 return -1;
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
238 }
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
239 } else if (mbox->client_box == NULL) {
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
240 /* opened as save-only. we'll need to fetch the mail,
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
241 so actually SELECT/EXAMINE the mailbox */
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
242 i_assert(mbox->box.opened);
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
243
13609
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
244 if (imapc_mailbox_select(mbox) < 0)
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13607
diff changeset
245 return -1;
12883
0dec197d1bb7 imapc: Fixes to handling expunges.
Timo Sirainen <tss@iki.fi>
parents: 12880
diff changeset
246 }
0dec197d1bb7 imapc: Fixes to handling expunges.
Timo Sirainen <tss@iki.fi>
parents: 12880
diff changeset
247
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 if ((fields & MAIL_FETCH_STREAM_BODY) != 0)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 fields |= MAIL_FETCH_STREAM_HEADER;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 str = t_str_new(64);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 str_printfa(str, "UID FETCH %u (", _mail->uid);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 if ((fields & MAIL_FETCH_RECEIVED_DATE) != 0)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 str_append(str, "INTERNALDATE ");
18512
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
255 if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0)
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
256 str_append(str, "RFC822.SIZE ");
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
257 if ((fields & MAIL_FETCH_GUID) != 0) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
258 str_append(str, mbox->guid_fetch_field_name);
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
259 str_append_c(str, ' ');
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
260 }
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
261
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
262 if ((fields & MAIL_FETCH_STREAM_BODY) != 0) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
263 if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_ZIMBRA_WORKAROUNDS))
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
264 str_append(str, "BODY.PEEK[] ");
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
265 else {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
266 /* BODY.PEEK[] can return different headers than
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
267 BODY.PEEK[HEADER] (e.g. invalid 8bit chars replaced
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
268 with '?' in HEADER) - this violates IMAP protocol
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
269 and messes up dsync since it sometimes fetches the
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
270 full body and sometimes only the headers. */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
271 str_append(str, "BODY.PEEK[HEADER] BODY.PEEK[TEXT] ");
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
272 }
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
273 } else if ((fields & MAIL_FETCH_STREAM_HEADER) != 0)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 str_append(str, "BODY.PEEK[HEADER] ");
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
275 else if (headers != NULL) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
276 mail->fetching_headers =
16966
be0e619a018b imapc: Fixes to imapc_feature fetch-headers
Timo Sirainen <tss@iki.fi>
parents: 16962
diff changeset
277 headers_merge(mail->imail.mail.data_pool, headers,
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
278 mail->fetching_headers);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
279 str_append(str, "BODY.PEEK[HEADER.FIELDS (");
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
280 for (i = 0; mail->fetching_headers[i] != NULL; i++) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
281 if (i > 0)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
282 str_append_c(str, ' ');
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
283 imap_append_astring(str, mail->fetching_headers[i]);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
284 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
285 str_append(str, ")] ");
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
286 mail->header_list_fetched = FALSE;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
287 }
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 str_truncate(str, str_len(str)-1);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 str_append_c(str, ')');
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 pool_ref(mail->imail.mail.pool);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 mail->fetching_fields |= fields;
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
293 mail->fetch_count++;
18322
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
294 mail->fetch_sent = FALSE;
19003
a98267f8a6e6 imapc: If FETCH commands fail, have imapc_mail_fetch() always return failure.
Timo Sirainen <tss@iki.fi>
parents: 18512
diff changeset
295 mail->fetch_failed = FALSE;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
297 imapc_mail_delayed_send_or_merge(mail, str);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
298 return 1;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
301 static void imapc_mail_cache_get(struct imapc_mail *mail,
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
302 struct imapc_mail_cache *cache)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
303 {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
304 if (mail->body_fetched)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
305 return;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
306
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
307 if (cache->fd != -1) {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
308 mail->fd = cache->fd;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
309 mail->imail.data.stream =
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
310 i_stream_create_fd(mail->fd, 0, FALSE);
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
311 cache->fd = -1;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
312 } else if (cache->buf != NULL) {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
313 mail->body = cache->buf;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
314 mail->imail.data.stream =
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
315 i_stream_create_from_data(mail->body->data,
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
316 mail->body->used);
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
317 cache->buf = NULL;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
318 } else {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
319 return;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
320 }
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
321 mail->header_fetched = TRUE;
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
322 mail->body_fetched = TRUE;
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
323 imapc_mail_init_stream(mail);
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
324 }
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
325
16962
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
326 static enum mail_fetch_field
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
327 imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 {
16962
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
329 struct imapc_mailbox *mbox =
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
330 (struct imapc_mailbox *)mail->imail.mail.mail.box;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 struct index_mail_data *data = &mail->imail.data;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 enum mail_fetch_field fields = 0;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333
13633
e77601949937 lib-storage: Added mail_log_update_wanted_fields()
Timo Sirainen <tss@iki.fi>
parents: 13628
diff changeset
334 if ((data->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0 &&
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 data->received_date == (time_t)-1)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 fields |= MAIL_FETCH_RECEIVED_DATE;
16961
4597e6572ba1 imapc: Avoid FETCH INTERNALDATE for getting save_date when we already know received_date.
Timo Sirainen <tss@iki.fi>
parents: 16960
diff changeset
337 if ((data->wanted_fields & MAIL_FETCH_SAVE_DATE) != 0 &&
4597e6572ba1 imapc: Avoid FETCH INTERNALDATE for getting save_date when we already know received_date.
Timo Sirainen <tss@iki.fi>
parents: 16960
diff changeset
338 data->save_date == (time_t)-1 && data->received_date == (time_t)-1)
4597e6572ba1 imapc: Avoid FETCH INTERNALDATE for getting save_date when we already know received_date.
Timo Sirainen <tss@iki.fi>
parents: 16960
diff changeset
339 fields |= MAIL_FETCH_RECEIVED_DATE;
18512
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
340 if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
341 MAIL_FETCH_VIRTUAL_SIZE)) != 0 &&
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
342 data->physical_size == (uoff_t)-1 &&
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
343 IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
18512
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
344 fields |= MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE;
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
345 if ((data->wanted_fields & MAIL_FETCH_GUID) != 0 &&
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
346 data->guid == NULL && mbox->guid_fetch_field_name != NULL)
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
347 fields |= MAIL_FETCH_GUID;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 if (data->stream == NULL && data->access_part != 0) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 if ((data->access_part & (READ_BODY | PARSE_BODY)) != 0)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 fields |= MAIL_FETCH_STREAM_BODY;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 else
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 fields |= MAIL_FETCH_STREAM_HEADER;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 }
16962
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
355 return fields;
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
356 }
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
357
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
358 bool imapc_mail_prefetch(struct mail *_mail)
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
359 {
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
360 struct imapc_mail *mail = (struct imapc_mail *)_mail;
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
361 struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
362 struct index_mail_data *data = &mail->imail.data;
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
363 enum mail_fetch_field fields;
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
364
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
365 if (mbox->prev_mail_cache.uid == _mail->uid)
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
366 imapc_mail_cache_get(mail, &mbox->prev_mail_cache);
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
367 /* try to get as much from cache as possible */
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
368 imapc_mail_update_access_parts(&mail->imail);
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
369
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
370 fields = imapc_mail_get_wanted_fetch_fields(mail);
19631
97f82dbd71e7 imapc: Prefetching shouldn't send FETCH requests for headers that are already cached.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
371 if (fields != 0 ||
97f82dbd71e7 imapc: Prefetching shouldn't send FETCH requests for headers that are already cached.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
372 (data->wanted_headers != NULL &&
97f82dbd71e7 imapc: Prefetching shouldn't send FETCH requests for headers that are already cached.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
373 !imapc_mail_has_headers_in_cache(&mail->imail, data->wanted_headers))) T_BEGIN {
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
374 if (imapc_mail_send_fetch(_mail, fields,
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
375 data->wanted_headers == NULL ? NULL :
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
376 data->wanted_headers->name) > 0)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
377 mail->imail.data.prefetch_sent = TRUE;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 } T_END;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 return !mail->imail.data.prefetch_sent;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381
12878
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
382 static bool
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
383 imapc_mail_have_fields(struct imapc_mail *imail, enum mail_fetch_field fields)
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
384 {
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
385 if ((fields & MAIL_FETCH_RECEIVED_DATE) != 0) {
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
386 if (imail->imail.data.received_date == (time_t)-1)
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
387 return FALSE;
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
388 fields &= ~MAIL_FETCH_RECEIVED_DATE;
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
389 }
18512
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
390 if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
391 if (imail->imail.data.physical_size == (uoff_t)-1)
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
392 return FALSE;
18512
d350a23207c2 imapc: Various optimization fixes to fetching messages' virtual size.
Timo Sirainen <tss@iki.fi>
parents: 18404
diff changeset
393 fields &= ~(MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE);
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
394 }
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
395 if ((fields & MAIL_FETCH_GUID) != 0) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
396 if (imail->imail.data.guid == NULL)
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
397 return FALSE;
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
398 fields &= ~MAIL_FETCH_GUID;
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
399 }
12878
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
400 if ((fields & (MAIL_FETCH_STREAM_HEADER |
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
401 MAIL_FETCH_STREAM_BODY)) != 0) {
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
402 if (imail->imail.data.stream == NULL)
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
403 return FALSE;
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
404 fields &= ~(MAIL_FETCH_STREAM_HEADER | MAIL_FETCH_STREAM_BODY);
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
405 }
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
406 i_assert(fields == 0);
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
407 return TRUE;
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
408 }
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
409
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
410 int imapc_mail_fetch(struct mail *_mail, enum mail_fetch_field fields,
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
411 const char *const *headers)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 struct imapc_mail *imail = (struct imapc_mail *)_mail;
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
414 struct imapc_mailbox *mbox =
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
415 (struct imapc_mailbox *)_mail->box;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 int ret;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
418 if ((fields & MAIL_FETCH_GUID) != 0 &&
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
419 mbox->guid_fetch_field_name == NULL) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
420 mail_storage_set_error(_mail->box->storage,
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
421 MAIL_ERROR_NOTPOSSIBLE,
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
422 "Message GUID not available in this server");
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
423 return -1;
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
424 }
19971
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
425 if (_mail->saving) {
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
426 mail_storage_set_error(_mail->box->storage,
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
427 MAIL_ERROR_NOTPOSSIBLE,
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
428 "Attempting to issue FETCH for a mail not yet committed");
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
429 return -1;
17c480995bc9 imapc: Don't try to FETCH uncommitted mails, because it would attempt to FETCH uid=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19665
diff changeset
430 }
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
431
16962
0c9b17f7cadf imapc: When sending FETCH, always request also missing wanted_fields.
Timo Sirainen <tss@iki.fi>
parents: 16961
diff changeset
432 fields |= imapc_mail_get_wanted_fetch_fields(imail);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 T_BEGIN {
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
434 ret = imapc_mail_send_fetch(_mail, fields, headers);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 } T_END;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 if (ret < 0)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 return -1;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
12878
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
439 /* we'll continue waiting until we've got all the fields we wanted,
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
440 or until all FETCH replies have been received (i.e. some FETCHes
194855240d31 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply.
Timo Sirainen <tss@iki.fi>
parents: 12874
diff changeset
441 failed) */
18322
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
442 if (ret > 0)
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
443 imapc_mail_fetch_flush(mbox);
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
444 while (imail->fetch_count > 0 &&
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
445 (!imapc_mail_have_fields(imail, fields) ||
19003
a98267f8a6e6 imapc: If FETCH commands fail, have imapc_mail_fetch() always return failure.
Timo Sirainen <tss@iki.fi>
parents: 18512
diff changeset
446 !imail->header_list_fetched)) {
17166
af7a606dc15c imapc: Avoid hanging when running into server problems.
Timo Sirainen <tss@iki.fi>
parents: 17165
diff changeset
447 imapc_mailbox_run_nofetch(mbox);
19003
a98267f8a6e6 imapc: If FETCH commands fail, have imapc_mail_fetch() always return failure.
Timo Sirainen <tss@iki.fi>
parents: 18512
diff changeset
448 }
21659
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
449 if (imail->fetch_failed) {
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
450 mail_storage_set_internal_error(&mbox->storage->storage);
19003
a98267f8a6e6 imapc: If FETCH commands fail, have imapc_mail_fetch() always return failure.
Timo Sirainen <tss@iki.fi>
parents: 18512
diff changeset
451 return -1;
21659
0f6a1fee4c7f imapc: Error handling wasn't setting storage error everywhere.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21597
diff changeset
452 }
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 return 0;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
456 void imapc_mail_fetch_flush(struct imapc_mailbox *mbox)
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
457 {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
458 struct imapc_command *cmd;
18322
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
459 struct imapc_mail *const *mailp;
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
460
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
461 if (mbox->pending_fetch_request == NULL) {
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
462 i_assert(mbox->to_pending_fetch_send == NULL);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
463 return;
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
464 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
465
18322
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
466 array_foreach(&mbox->pending_fetch_request->mails, mailp)
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
467 (*mailp)->fetch_sent = TRUE;
d21f71ab9f28 imapc: Make sure we don't flush prefetch FETCH command unneededly.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
468
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
469 cmd = imapc_client_mailbox_cmd(mbox->client_box,
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
470 imapc_mail_fetch_callback,
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
471 mbox->pending_fetch_request);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
472 imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
17165
610c79565959 imapc: Fixed crash when FETCH command immediately failed due to connection error.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
473 array_append(&mbox->fetch_requests, &mbox->pending_fetch_request, 1);
610c79565959 imapc: Fixed crash when FETCH command immediately failed due to connection error.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
474
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
475 imapc_command_send(cmd, str_c(mbox->pending_fetch_cmd));
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
476
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
477 mbox->pending_fetch_request = NULL;
18323
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
478 if (mbox->to_pending_fetch_send != NULL)
f8f57dde247d imapc: Don't flush prefetch FETCH command before it has mail_prefetch_count number of mails.
Timo Sirainen <tss@iki.fi>
parents: 18322
diff changeset
479 timeout_remove(&mbox->to_pending_fetch_send);
16975
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
480 str_truncate(mbox->pending_fetch_cmd, 0);
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
481 }
10462996fa32 imapc: Merge identical FETCH commands together (only updating UID range)
Timo Sirainen <tss@iki.fi>
parents: 16966
diff changeset
482
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 static bool imapc_find_lfile_arg(const struct imapc_untagged_reply *reply,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 const struct imap_arg *arg, int *fd_r)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 const struct imap_arg *list;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 unsigned int i, count;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 for (i = 0; i < reply->file_args_count; i++) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 const struct imapc_arg_file *farg = &reply->file_args[i];
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 if (farg->parent_arg == arg->parent &&
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 imap_arg_get_list_full(arg->parent, &list, &count) &&
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 farg->list_idx < count && &list[farg->list_idx] == arg) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 *fd_r = farg->fd;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 return TRUE;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 return FALSE;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501
13524
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
502 static void imapc_stream_filter(struct istream **input)
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
503 {
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
504 static const char *imapc_hide_headers[] = {
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
505 /* Added by MS Exchange 2010 when \Flagged flag is set.
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
506 This violates IMAP guarantee of messages being immutable. */
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
507 "X-Message-Flag"
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
508 };
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
509 struct istream *filter_input;
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
510
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
511 filter_input = i_stream_create_header_filter(*input,
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
512 HEADER_FILTER_EXCLUDE,
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
513 imapc_hide_headers, N_ELEMENTS(imapc_hide_headers),
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14403
diff changeset
514 *null_header_filter_callback, (void *)NULL);
13524
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
515 i_stream_unref(input);
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
516 *input = filter_input;
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
517 }
501b33c4aa28 imapc: Filter out X-Message-Flag: header from incoming mails.
Timo Sirainen <tss@iki.fi>
parents: 13437
diff changeset
518
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
519 void imapc_mail_init_stream(struct imapc_mail *mail)
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
520 {
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
521 struct index_mail *imail = &mail->imail;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
522 struct mail *_mail = &imail->mail.mail;
19663
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
523 struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
524 struct istream *input;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
525 uoff_t size;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
526 int ret;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
527
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
528 i_stream_set_name(imail->data.stream,
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
529 t_strdup_printf("imapc mail uid=%u", _mail->uid));
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
530 index_mail_set_read_buffer_size(_mail, imail->data.stream);
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
531
19663
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
532 if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE)) {
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
533 /* enable filtering only when we're not passing through
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
534 RFC822.SIZE. otherwise we'll get size mismatches. */
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
535 imapc_stream_filter(&imail->data.stream);
befd1785a11f imapc: Remove X-Message-Flag filtering if imapc_features has rfc822.size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19653
diff changeset
536 }
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
537 if (imail->mail.v.istream_opened != NULL) {
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
538 if (imail->mail.v.istream_opened(_mail,
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
539 &imail->data.stream) < 0) {
13860
efb48f4e40a6 imapc: Avoid assert-crashing when replacing mail stream with a new one.
Timo Sirainen <tss@iki.fi>
parents: 13855
diff changeset
540 index_mail_close_streams(imail);
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
541 return;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
542 }
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
543 } else if (mail->body_fetched) {
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
544 ret = i_stream_get_size(imail->data.stream, TRUE, &size);
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
545 if (ret < 0) {
13860
efb48f4e40a6 imapc: Avoid assert-crashing when replacing mail stream with a new one.
Timo Sirainen <tss@iki.fi>
parents: 13855
diff changeset
546 index_mail_close_streams(imail);
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
547 return;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
548 }
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
549 i_assert(ret != 0);
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
550 imail->data.physical_size = size;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
551 /* we'll assume that the remote server is working properly and
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
552 sending CRLF linefeeds */
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
553 imail->data.virtual_size = size;
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
554 }
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
555
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
556 imail->data.stream_has_only_header = !mail->body_fetched;
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
557 if (index_mail_init_stream(imail, NULL, NULL, &input) < 0)
13860
efb48f4e40a6 imapc: Avoid assert-crashing when replacing mail stream with a new one.
Timo Sirainen <tss@iki.fi>
parents: 13855
diff changeset
558 index_mail_close_streams(imail);
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
559 }
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
560
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 static void
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 imapc_fetch_stream(struct imapc_mail *mail,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 const struct imapc_untagged_reply *reply,
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
564 const struct imap_arg *arg,
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
565 bool have_header, bool have_body)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 struct index_mail *imail = &mail->imail;
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
568 struct istream *hdr_stream = NULL;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 const char *value;
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
570 int fd;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 if (imail->data.stream != NULL) {
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
573 i_assert(mail->header_fetched);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
574 if (mail->body_fetched || !have_body)
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 return;
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
576 if (have_header) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
577 /* replace the existing stream */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
578 } else if (mail->fd == -1) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
579 /* append this body stream to the existing
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
580 header stream */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
581 hdr_stream = imail->data.stream;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
582 i_stream_ref(hdr_stream);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
583 } else {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
584 /* append this body stream to the existing
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
585 header stream. we'll need to recreate the stream
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
586 with autoclosed fd. */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
587 if (lseek(mail->fd, 0, SEEK_SET) < 0)
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
588 i_error("lseek(imapc) failed: %m");
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
589 hdr_stream = i_stream_create_fd_autoclose(&mail->fd, 0);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
590 }
13860
efb48f4e40a6 imapc: Avoid assert-crashing when replacing mail stream with a new one.
Timo Sirainen <tss@iki.fi>
parents: 13855
diff changeset
591 index_mail_close_streams(imail);
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
592 if (mail->fd != -1) {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
593 if (close(mail->fd) < 0)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
594 i_error("close(imapc mail) failed: %m");
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
595 mail->fd = -1;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
596 }
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
597 } else {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
598 if (!have_header) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
599 /* BODY.PEEK[TEXT] received - we can't currently handle
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
600 this before receiving BODY.PEEK[HEADER] reply */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
601 return;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
602 }
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 if (arg->type == IMAP_ARG_LITERAL_SIZE) {
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
606 if (!imapc_find_lfile_arg(reply, arg, &fd)) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
607 if (hdr_stream != NULL)
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
608 i_stream_unref(&hdr_stream);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 return;
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
610 }
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 if ((fd = dup(fd)) == -1) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 i_error("dup() failed: %m");
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
613 if (hdr_stream != NULL)
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
614 i_stream_unref(&hdr_stream);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 return;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 }
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
617 mail->fd = fd;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13542
diff changeset
618 imail->data.stream = i_stream_create_fd(fd, 0, FALSE);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 } else {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620 if (!imap_arg_get_nstring(arg, &value))
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
621 value = NULL;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 if (value == NULL) {
13542
b6633cb57814 imapc: Allow accessing a mail that is being saved without crashing.
Timo Sirainen <tss@iki.fi>
parents: 13524
diff changeset
623 mail_set_expunged(&imail->mail.mail);
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
624 if (hdr_stream != NULL)
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
625 i_stream_unref(&hdr_stream);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 return;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 if (mail->body == NULL) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 mail->body = buffer_create_dynamic(default_pool,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 arg->str_len + 1);
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
631 } else if (!have_header && hdr_stream != NULL) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
632 /* header is already in the buffer - add body now
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
633 without destroying the existing header data */
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
634 i_stream_unref(&hdr_stream);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
635 } else {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
636 buffer_set_used_size(mail->body, 0);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
638 buffer_append(mail->body, value, arg->str_len);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 imail->data.stream = i_stream_create_from_data(mail->body->data,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 mail->body->used);
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641 }
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
642 if (have_header)
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
643 mail->header_fetched = TRUE;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
644 mail->body_fetched = have_body;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
645
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
646 if (hdr_stream != NULL) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
647 struct istream *inputs[3];
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
649 inputs[0] = hdr_stream;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
650 inputs[1] = imail->data.stream;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
651 inputs[2] = NULL;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
652 imail->data.stream = i_stream_create_concat(inputs);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
653 i_stream_unref(&inputs[0]);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
654 i_stream_unref(&inputs[1]);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
655 }
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
656
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
657 imapc_mail_init_stream(mail);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
660 static void
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
661 imapc_fetch_header_stream(struct imapc_mail *mail,
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
662 const struct imapc_untagged_reply *reply,
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
663 const struct imap_arg *args)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
664 {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
665 const enum message_header_parser_flags hdr_parser_flags =
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
666 MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP |
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
667 MESSAGE_HEADER_PARSER_FLAG_DROP_CR;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
668 const struct imap_arg *hdr_list;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
669 struct mailbox_header_lookup_ctx *headers_ctx;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
670 struct message_header_parser_ctx *parser;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
671 struct message_header_line *hdr;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
672 struct istream *input;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
673 ARRAY_TYPE(const_string) hdr_arr;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
674 const char *value;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
675 int ret, fd;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
676
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
677 if (!imap_arg_get_list(args, &hdr_list))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
678 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
679 if (!imap_arg_atom_equals(args+1, "]"))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
680 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
681 args += 2;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
682
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
683 /* see if this is reply to the latest headers list request
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
684 (parse it even if it's not) */
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
685 t_array_init(&hdr_arr, 16);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
686 while (imap_arg_get_astring(hdr_list, &value)) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
687 array_append(&hdr_arr, &value, 1);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
688 hdr_list++;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
689 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
690 if (hdr_list->type != IMAP_ARG_EOL)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
691 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
692 array_append_zero(&hdr_arr);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
693
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
694 if (headers_have_subset(array_idx(&hdr_arr, 0), mail->fetching_headers))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
695 mail->header_list_fetched = TRUE;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
696
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
697 if (args->type == IMAP_ARG_LITERAL_SIZE) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
698 if (!imapc_find_lfile_arg(reply, args, &fd))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
699 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
700 input = i_stream_create_fd(fd, 0, FALSE);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
701 } else {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
702 if (!imap_arg_get_nstring(args, &value))
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
703 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
704 if (value == NULL) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
705 mail_set_expunged(&mail->imail.mail.mail);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
706 return;
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
707 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
708 input = i_stream_create_from_data(value, args->str_len);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
709 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
710
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
711 headers_ctx = mailbox_header_lookup_init(mail->imail.mail.mail.box,
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
712 array_idx(&hdr_arr, 0));
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
713 index_mail_parse_header_init(&mail->imail, headers_ctx);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
714
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
715 parser = message_parse_header_init(input, NULL, hdr_parser_flags);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
716 while ((ret = message_parse_header_next(parser, &hdr)) > 0)
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
717 index_mail_parse_header(NULL, hdr, &mail->imail);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
718 i_assert(ret != 0);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
719 index_mail_parse_header(NULL, NULL, &mail->imail);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
720 message_parse_header_deinit(&parser);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
721
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
722 mailbox_header_lookup_unref(&headers_ctx);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
723 i_stream_destroy(&input);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
724 }
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
725
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 void imapc_mail_fetch_update(struct imapc_mail *mail,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 const struct imapc_untagged_reply *reply,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 const struct imap_arg *args)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 struct imapc_mailbox *mbox =
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 (struct imapc_mailbox *)mail->imail.mail.mail.box;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 const char *key, *value;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 unsigned int i;
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
734 uoff_t size;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 time_t t;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 int tz;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737 bool match = FALSE;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 for (i = 0; args[i].type != IMAP_ARG_EOL; i += 2) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 if (!imap_arg_get_atom(&args[i], &key) ||
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 args[i+1].type == IMAP_ARG_EOL)
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 break;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 if (strcasecmp(key, "BODY[]") == 0) {
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
745 imapc_fetch_stream(mail, reply, &args[i+1], TRUE, TRUE);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 match = TRUE;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 } else if (strcasecmp(key, "BODY[HEADER]") == 0) {
18404
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
748 imapc_fetch_stream(mail, reply, &args[i+1], TRUE, FALSE);
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
749 match = TRUE;
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
750 } else if (strcasecmp(key, "BODY[TEXT]") == 0) {
1c17f06d5e52 imapc: Added imapc_features=zimbra-workarounds
Timo Sirainen <tss@iki.fi>
parents: 18333
diff changeset
751 imapc_fetch_stream(mail, reply, &args[i+1], FALSE, TRUE);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 match = TRUE;
16958
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
753 } else if (strcasecmp(key, "BODY[HEADER.FIELDS") == 0) {
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
754 imapc_fetch_header_stream(mail, reply, &args[i+1]);
00fc1e040603 imapc: Added imapc_feature fetch-header.
Timo Sirainen <tss@iki.fi>
parents: 16586
diff changeset
755 match = TRUE;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 } else if (strcasecmp(key, "INTERNALDATE") == 0) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 if (imap_arg_get_astring(&args[i+1], &value) &&
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 imap_parse_datetime(value, &t, &tz))
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759 mail->imail.data.received_date = t;
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 match = TRUE;
14403
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
761 } else if (strcasecmp(key, "RFC822.SIZE") == 0) {
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
762 if (imap_arg_get_atom(&args[i+1], &value) &&
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
763 str_to_uoff(value, &size) == 0 &&
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
764 IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
765 mail->imail.data.physical_size = size;
6a8b78450202 imapc: Added imapc_features=rfc822.size setting to use RFC822.size for physical sizes.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
766 match = TRUE;
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
767 } else if (strcasecmp(key, "X-GM-MSGID") == 0 ||
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
768 strcasecmp(key, "X-GUID") == 0) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
769 if (imap_arg_get_astring(&args[i+1], &value)) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
770 mail->imail.data.guid =
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
771 p_strdup(mail->imail.mail.pool, value);
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
772 }
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13633
diff changeset
773 match = TRUE;
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 if (!match) {
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 /* this is only a FETCH FLAGS update for the wanted mail */
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
778 } else {
16586
620876853f6f imapc: Reorganize code so that imapc_list works without imapc_storage.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
779 imapc_client_stop(mbox->storage->client->client);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 }
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781 }