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