annotate src/lib-storage/index/imapc/imapc-mailbox.c @ 12615:3dde816d945d

imapc: Write large message bodies to temp files rather than keeping in memory.
author Timo Sirainen <tss@iki.fi>
date Mon, 31 Jan 2011 04:02:04 +0200
parents 391ba80cb125
children 4fdf3084f74f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
12592
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
4 #include "ioloop.h"
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "imap-arg.h"
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "imap-util.h"
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "imapc-client.h"
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "imapc-seqmap.h"
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "imapc-storage.h"
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
12592
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
11 #define NOTIFY_DELAY_MSECS 500
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
12
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
13 static void imapc_mailbox_init_delayed_trans(struct imapc_mailbox *mbox)
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
14 {
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
15 if (mbox->delayed_sync_trans != NULL)
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
16 return;
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
17
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
18 mbox->delayed_sync_trans =
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
19 mail_index_transaction_begin(mbox->box.view,
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
20 MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
21 mbox->delayed_sync_view =
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
22 mail_index_transaction_open_updated_view(mbox->delayed_sync_trans);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
23 }
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
24
12604
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
25 static void
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
26 imapc_newmsgs_callback(const struct imapc_command_reply *reply,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
27 void *context)
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
28 {
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
29 struct imapc_mailbox *mbox = context;
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
30
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
31 if (reply->state == IMAPC_COMMAND_STATE_OK)
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
32 ;
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
33 else if (reply->state == IMAPC_COMMAND_STATE_NO) {
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
34 imapc_copy_error_from_reply(mbox->storage, MAIL_ERROR_PARAMS,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
35 reply);
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
36 } else {
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
37 mail_storage_set_critical(&mbox->storage->storage,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
38 "imapc: Command failed: %s", reply->text_full);
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
39 }
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
40 if (mbox->opening)
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
41 imapc_client_stop(mbox->storage->client);
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
42 }
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
43
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 static void imapc_untagged_exists(const struct imapc_untagged_reply *reply,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 uint32_t rcount = reply->num;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 const struct mail_index_header *hdr;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct imapc_seqmap *seqmap;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 uint32_t next_lseq, next_rseq;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (mbox == NULL)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 seqmap = imapc_client_mailbox_get_seqmap(mbox->client_box);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 next_lseq = mail_index_view_get_messages_count(mbox->box.view) + 1;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 next_rseq = imapc_seqmap_lseq_to_rseq(seqmap, next_lseq);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 if (next_rseq > rcount)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 hdr = mail_index_get_header(mbox->box.view);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 mbox->new_msgs = TRUE;
12604
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
64 imapc_client_mailbox_cmdf(mbox->client_box, imapc_newmsgs_callback,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12600
diff changeset
65 mbox, "UID FETCH %u:* FLAGS", hdr->next_uid);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
12592
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
68 static void imapc_mailbox_idle_timeout(struct imapc_mailbox *mbox)
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
69 {
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
70 timeout_remove(&mbox->to_idle);
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
71 if (mbox->box.notify_callback != NULL)
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
72 mbox->box.notify_callback(&mbox->box, mbox->box.notify_context);
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
73 }
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
74
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
75 static void imapc_mailbox_idle_notify(struct imapc_mailbox *mbox)
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
76 {
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
77 if (mbox->box.notify_callback != NULL && mbox->to_idle == NULL) {
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
78 mbox->to_idle =
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
79 timeout_add(NOTIFY_DELAY_MSECS,
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
80 imapc_mailbox_idle_timeout, mbox);
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
81 }
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
82 }
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 static void imapc_untagged_fetch(const struct imapc_untagged_reply *reply,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 uint32_t seq = reply->num;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 struct imapc_seqmap *seqmap;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 const struct imap_arg *list, *flags_list;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 const char *atom;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 const struct mail_index_record *rec;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 enum mail_flags flags;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 uint32_t uid, old_count;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 unsigned int i, j;
12609
391ba80cb125 imapc: Send UID FETCH commands with larger uidset parameter if possible.
Timo Sirainen <tss@iki.fi>
parents: 12604
diff changeset
95 ARRAY_TYPE(const_string) keywords = ARRAY_INIT;
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 bool seen_flags = FALSE;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 if (mbox == NULL || seq == 0 || !imap_arg_get_list(reply->args, &list))
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 uid = 0; flags = 0;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 for (i = 0; list[i].type != IMAP_ARG_EOL; i += 2) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 if (!imap_arg_get_atom(&list[i], &atom))
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 if (strcasecmp(atom, "UID") == 0) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 if (!imap_arg_get_atom(&list[i+1], &atom) ||
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 str_to_uint32(atom, &uid) < 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 } else if (strcasecmp(atom, "FLAGS") == 0) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 if (!imap_arg_get_list(&list[i+1], &flags_list))
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
12600
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
114 t_array_init(&keywords, 8);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 seen_flags = TRUE;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 for (j = 0; flags_list[j].type != IMAP_ARG_EOL; j++) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 if (!imap_arg_get_atom(&flags_list[j], &atom))
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 if (atom[0] == '\\')
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 flags |= imap_parse_system_flag(atom);
12600
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
121 else {
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
122 /* keyword */
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
123 array_append(&keywords, &atom, 1);
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
124 }
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 seqmap = imapc_client_mailbox_get_seqmap(mbox->client_box);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 seq = imapc_seqmap_rseq_to_lseq(seqmap, seq);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 if (mbox->cur_fetch_mail != NULL && mbox->cur_fetch_mail->seq == seq) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 i_assert(uid == 0 || mbox->cur_fetch_mail->uid == uid);
12615
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
134 imapc_fetch_mail_update(mbox->cur_fetch_mail, reply, list);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
137 imapc_mailbox_init_delayed_trans(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 old_count = mail_index_view_get_messages_count(mbox->delayed_sync_view);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 if (seq > old_count) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 if (uid == 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 i_assert(seq == old_count + 1);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 mail_index_append(mbox->delayed_sync_trans, uid, &seq);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 rec = mail_index_lookup(mbox->delayed_sync_view, seq);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 if (seen_flags && rec->flags != flags) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 mail_index_update_flags(mbox->delayed_sync_trans, seq,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 MODIFY_REPLACE, flags);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 }
12600
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
150 if (seen_flags) {
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
151 struct mail_keywords *kw;
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
152
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
153 (void)array_append_space(&keywords);
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
154 kw = mail_index_keywords_create(mbox->box.index,
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
155 array_idx(&keywords, 0));
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
156 mail_index_update_keywords(mbox->delayed_sync_trans, seq,
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
157 MODIFY_REPLACE, kw);
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
158 mail_index_keywords_unref(&kw);
ba3c0ee558f5 imapc: Added support for keywords.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
159 }
12592
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
160 imapc_mailbox_idle_notify(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 static void imapc_untagged_expunge(const struct imapc_untagged_reply *reply,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 struct imapc_seqmap *seqmap;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 uint32_t lseq, rseq = reply->num;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 if (mbox == NULL || rseq == 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 seqmap = imapc_client_mailbox_get_seqmap(mbox->client_box);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 lseq = imapc_seqmap_rseq_to_lseq(seqmap, rseq);
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
174 imapc_seqmap_expunge(seqmap, rseq);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
175
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
176 imapc_mailbox_init_delayed_trans(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 mail_index_expunge(mbox->delayed_sync_trans, lseq);
12592
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
178
475050722f54 imapc: Handle properly mailbox changes while it's selected. Added support for IDLE.
Timo Sirainen <tss@iki.fi>
parents: 12590
diff changeset
179 imapc_mailbox_idle_notify(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 static void
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 imapc_resp_text_uidvalidity(const struct imapc_untagged_reply *reply,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 uint32_t uid_validity;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 if (mbox == NULL || reply->resp_text_value == NULL ||
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 str_to_uint32(reply->resp_text_value, &uid_validity) < 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
192 imapc_mailbox_init_delayed_trans(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 mail_index_update_header(mbox->delayed_sync_trans,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 offsetof(struct mail_index_header, uid_validity),
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 &uid_validity, sizeof(uid_validity), TRUE);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 static void
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 imapc_resp_text_uidnext(const struct imapc_untagged_reply *reply,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 uint32_t uid_next;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 if (mbox == NULL || reply->resp_text_value == NULL ||
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 str_to_uint32(reply->resp_text_value, &uid_next) < 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 return;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
208 imapc_mailbox_init_delayed_trans(mbox);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 mail_index_update_header(mbox->delayed_sync_trans,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 offsetof(struct mail_index_header, next_uid),
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 &uid_next, sizeof(uid_next), FALSE);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 void imapc_mailbox_register_untagged(struct imapc_mailbox *mbox,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 const char *key,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 imapc_mailbox_callback_t *callback)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 struct imapc_mailbox_event_callback *cb;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 cb = array_append_space(&mbox->untagged_callbacks);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 cb->name = p_strdup(mbox->box.pool, key);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 cb->callback = callback;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 void imapc_mailbox_register_resp_text(struct imapc_mailbox *mbox,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 const char *key,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 imapc_mailbox_callback_t *callback)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 struct imapc_mailbox_event_callback *cb;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 cb = array_append_space(&mbox->resp_text_callbacks);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 cb->name = p_strdup(mbox->box.pool, key);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 cb->callback = callback;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 void imapc_mailbox_register_callbacks(struct imapc_mailbox *mbox)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 imapc_mailbox_register_untagged(mbox, "EXISTS",
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 imapc_untagged_exists);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 imapc_mailbox_register_untagged(mbox, "FETCH",
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 imapc_untagged_fetch);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 imapc_mailbox_register_untagged(mbox, "EXPUNGE",
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 imapc_untagged_expunge);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 imapc_mailbox_register_resp_text(mbox, "UIDVALIDITY",
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 imapc_resp_text_uidvalidity);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 imapc_mailbox_register_resp_text(mbox, "UIDNEXT",
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 imapc_resp_text_uidnext);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }