annotate src/lib-storage/index/imapc/imapc-storage.c @ 15272:ca10d2e8d8e3

lib-storage: Moved mail attribute dict to struct mail_storage. This also means that index_storage_destroy() must always be called, so removed now unnecessary mail_storage.destroy=NULL checks.
author Timo Sirainen <tss@iki.fi>
date Mon, 29 Oct 2012 14:50:11 +0200
parents 5659c178bdeb
children 15dfd6475f64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 14060
diff changeset
1 /* Copyright (c) 2011-2012 Dovecot authors, see the included COPYING file */
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
7dd1e45721ae Added initial implementation of "imapc" storage.
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"
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
6 #include "imap-arg.h"
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "imap-resp-code.h"
13446
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
8 #include "mailbox-tree.h"
13616
cd4a65125c84 imapc: Code cleanup: avoid unnecessarily accessing imapc-client-private.h
Timo Sirainen <tss@iki.fi>
parents: 13614
diff changeset
9 #include "imapc-client.h"
13383
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
10 #include "imapc-connection.h"
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
11 #include "imapc-msgmap.h"
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
12 #include "imapc-mail.h"
12588
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
13 #include "imapc-list.h"
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "imapc-sync.h"
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
15 #include "imapc-settings.h"
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "imapc-storage.h"
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #define DNS_CLIENT_SOCKET_NAME "dns-client"
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct imapc_open_context {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct imapc_mailbox *mbox;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 int ret;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 };
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct imapc_resp_code_map {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 const char *code;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 enum mail_error error;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 };
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 static struct imapc_resp_code_map imapc_resp_code_map[] = {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 { IMAP_RESP_CODE_UNAVAILABLE, MAIL_ERROR_TEMP },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 { IMAP_RESP_CODE_AUTHFAILED, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 { IMAP_RESP_CODE_AUTHZFAILED, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 { IMAP_RESP_CODE_EXPIRED, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 { IMAP_RESP_CODE_PRIVACYREQUIRED, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 { IMAP_RESP_CODE_CONTACTADMIN, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 { IMAP_RESP_CODE_NOPERM, MAIL_ERROR_PERM },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 { IMAP_RESP_CODE_INUSE, MAIL_ERROR_INUSE },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 { IMAP_RESP_CODE_EXPUNGEISSUED, MAIL_ERROR_EXPUNGED },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 { IMAP_RESP_CODE_CORRUPTION, MAIL_ERROR_TEMP },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 { IMAP_RESP_CODE_SERVERBUG, MAIL_ERROR_TEMP },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 /* { IMAP_RESP_CODE_CLIENTBUG, 0 }, */
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 { IMAP_RESP_CODE_CANNOT, MAIL_ERROR_NOTPOSSIBLE },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 { IMAP_RESP_CODE_LIMIT, MAIL_ERROR_NOTPOSSIBLE },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 { IMAP_RESP_CODE_OVERQUOTA, MAIL_ERROR_NOSPACE },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 { IMAP_RESP_CODE_ALREADYEXISTS, MAIL_ERROR_EXISTS },
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 { IMAP_RESP_CODE_NONEXISTENT, MAIL_ERROR_NOTFOUND }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 };
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
50 static void imapc_untagged_status(const struct imapc_untagged_reply *reply,
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
51 struct imapc_storage *storage);
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
52 static void imapc_untagged_namespace(const struct imapc_untagged_reply *reply,
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
53 struct imapc_storage *storage);
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
54
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 static bool
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 imap_resp_text_code_parse(const char *str, enum mail_error *error_r)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 unsigned int i;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (str == NULL)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return FALSE;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 for (i = 0; i < N_ELEMENTS(imapc_resp_code_map); i++) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 if (strcmp(imapc_resp_code_map[i].code, str) == 0) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 *error_r = imapc_resp_code_map[i].error;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 return TRUE;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 return FALSE;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 static struct mail_storage *imapc_storage_alloc(void)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 struct imapc_storage *storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 pool_t pool;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
12763
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
77 pool = pool_alloconly_create("imapc storage", 2048);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 storage = p_new(pool, struct imapc_storage, 1);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 storage->storage = imapc_storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 storage->storage.pool = pool;
13616
cd4a65125c84 imapc: Code cleanup: avoid unnecessarily accessing imapc-client-private.h
Timo Sirainen <tss@iki.fi>
parents: 13614
diff changeset
81 storage->root_ioloop = current_ioloop;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 return &storage->storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
12604
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12596
diff changeset
85 void imapc_copy_error_from_reply(struct imapc_storage *storage,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12596
diff changeset
86 enum mail_error default_error,
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12596
diff changeset
87 const struct imapc_command_reply *reply)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 enum mail_error error;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
91 if (imap_resp_text_code_parse(reply->resp_text_key, &error)) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
92 mail_storage_set_error(&storage->storage, error,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
93 reply->text_without_resp);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 } else {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 mail_storage_set_error(&storage->storage, default_error,
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
96 reply->text_without_resp);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
100 void imapc_simple_context_init(struct imapc_simple_context *sctx,
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
101 struct imapc_storage *storage)
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
102 {
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
103 memset(sctx, 0, sizeof(*sctx));
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
104 sctx->storage = storage;
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
105 sctx->ret = -2;
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
106 }
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
107
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
108 void imapc_simple_run(struct imapc_simple_context *sctx)
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
109 {
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
110 while (sctx->ret == -2)
13383
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
111 imapc_storage_run(sctx->storage);
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
112 }
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
113
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
114 void imapc_storage_run(struct imapc_storage *storage)
e404a1bef6bc imapc: Fixed handling immediate changes when starting IDLE.
Timo Sirainen <tss@iki.fi>
parents: 13381
diff changeset
115 {
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
116 do {
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
117 imapc_client_run(storage->client);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
118 } while (storage->reopen_count > 0);
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
119 }
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
120
12588
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
121 void imapc_simple_callback(const struct imapc_command_reply *reply,
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
122 void *context)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 struct imapc_simple_context *ctx = context;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 if (reply->state == IMAPC_COMMAND_STATE_OK)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 ctx->ret = 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 else if (reply->state == IMAPC_COMMAND_STATE_NO) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 imapc_copy_error_from_reply(ctx->storage, MAIL_ERROR_PARAMS, reply);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 ctx->ret = -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 } else {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 mail_storage_set_critical(&ctx->storage->storage,
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
133 "imapc: Command failed: %s", reply->text_full);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 ctx->ret = -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 imapc_client_stop(ctx->storage->client);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
13622
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
139 void imapc_mailbox_noop(struct imapc_mailbox *mbox)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 {
13622
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
141 struct imapc_command *cmd;
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
142 struct imapc_simple_context sctx;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
13622
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
144 imapc_simple_context_init(&sctx, mbox->storage);
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
145 cmd = imapc_client_mailbox_cmd(mbox->client_box,
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
146 imapc_simple_callback, &sctx);
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
147 imapc_command_send(cmd, "NOOP");
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
148 imapc_simple_run(&sctx);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 static void imapc_storage_untagged_cb(const struct imapc_untagged_reply *reply,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 void *context)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 struct imapc_storage *storage = context;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 struct imapc_mailbox *mbox = reply->untagged_box_context;
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
156 const struct imapc_storage_event_callback *cb;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
157 const struct imapc_mailbox_event_callback *mcb;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
159 array_foreach(&storage->untagged_callbacks, cb) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
160 if (strcasecmp(reply->name, cb->name) == 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
161 cb->callback(reply, storage);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
162 }
12588
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
163
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 if (mbox == NULL)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 return;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
167 array_foreach(&mbox->untagged_callbacks, mcb) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
168 if (strcasecmp(reply->name, mcb->name) == 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
169 mcb->callback(reply, mbox);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
172 if (reply->resp_text_key != NULL) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
173 array_foreach(&mbox->resp_text_callbacks, mcb) {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
174 if (strcasecmp(reply->resp_text_key, mcb->name) == 0)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
175 mcb->callback(reply, mbox);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
176 }
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 static int
13416
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
181 imapc_storage_get_hierarchy_sep(struct imapc_storage *storage,
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
182 const char **error_r)
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
183 {
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
184 struct imapc_command *cmd;
13416
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
185 struct imapc_simple_context sctx;
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
186
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
187 imapc_simple_context_init(&sctx, storage);
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
188 cmd = imapc_client_cmd(storage->client, imapc_simple_callback, &sctx);
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
189 imapc_command_send(cmd, "LIST \"\" \"\"");
13416
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
190 imapc_simple_run(&sctx);
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
191
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
192 if (sctx.ret < 0) {
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
193 *error_r = t_strdup_printf("LIST failed: %s",
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
194 mail_storage_get_last_error(&storage->storage, NULL));
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
195 return -1;
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
196 }
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
197
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
198 if (storage->list->sep == '\0') {
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
199 *error_r = "LIST didn't return hierarchy separator";
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
200 return -1;
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
201 }
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
202 return sctx.ret;
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
203 }
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
204
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
205 static int
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 imapc_storage_create(struct mail_storage *_storage,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 struct mail_namespace *ns,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 const char **error_r)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 struct imapc_storage *storage = (struct imapc_storage *)_storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 struct imapc_client_settings set;
12615
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
212 string_t *str;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
214 storage->set = mail_storage_get_driver_settings(_storage);
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
215
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 memset(&set, 0, sizeof(set));
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
217 set.host = storage->set->imapc_host;
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
218 if (*set.host == '\0') {
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
219 *error_r = "missing imapc_host";
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
220 return -1;
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
221 }
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
222 set.port = storage->set->imapc_port;
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
223 set.username = storage->set->imapc_user;
13916
b860d38f6b9e imapc: Added imapc_master_user setting.
Timo Sirainen <tss@iki.fi>
parents: 13876
diff changeset
224 set.master_user = storage->set->imapc_master_user;
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
225 set.password = storage->set->imapc_password;
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
226 if (*set.password == '\0') {
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
227 *error_r = "missing imapc_password";
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 return -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
14933
f33e3ac28e1d imapc: Added imapc_max_idle_time setting to force activity on connection.
Timo Sirainen <tss@iki.fi>
parents: 14665
diff changeset
230 set.max_idle_time = storage->set->imapc_max_idle_time;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 set.dns_client_socket_path =
14060
47072538ff11 imapc: If base_dir isn't set, do a blocking DNS lookup.
Timo Sirainen <tss@iki.fi>
parents: 13916
diff changeset
232 *_storage->user->set->base_dir == '\0' ? "" :
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 t_strconcat(_storage->user->set->base_dir, "/",
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 DNS_CLIENT_SOCKET_NAME, NULL);
12669
ce7b1fa63f2f imapc: Added more debugging output with mail_debug=yes
Timo Sirainen <tss@iki.fi>
parents: 12667
diff changeset
235 set.debug = _storage->set->mail_debug;
13535
87662d9ceff8 imapc: Added imapc_rawlog_dir setting.
Timo Sirainen <tss@iki.fi>
parents: 13522
diff changeset
236 set.rawlog_dir = mail_user_home_expand(_storage->user,
87662d9ceff8 imapc: Added imapc_rawlog_dir setting.
Timo Sirainen <tss@iki.fi>
parents: 13522
diff changeset
237 storage->set->imapc_rawlog_dir);
12669
ce7b1fa63f2f imapc: Added more debugging output with mail_debug=yes
Timo Sirainen <tss@iki.fi>
parents: 12667
diff changeset
238
12615
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
239 str = t_str_new(128);
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
240 mail_user_set_get_temp_prefix(str, _storage->user->set);
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
241 set.temp_path_prefix = str_c(str);
3dde816d945d imapc: Write large message bodies to temp files rather than keeping in memory.
Timo Sirainen <tss@iki.fi>
parents: 12609
diff changeset
242
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
243 set.ssl_ca_dir = storage->set->imapc_ssl_ca_dir;
13635
63ac3b1c2950 imapc: Added imapc_ssl_verify setting.
Timo Sirainen <tss@iki.fi>
parents: 13628
diff changeset
244 set.ssl_verify = storage->set->imapc_ssl_verify;
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
245 if (strcmp(storage->set->imapc_ssl, "imaps") == 0)
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
246 set.ssl_mode = IMAPC_CLIENT_SSL_MODE_IMMEDIATE;
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
247 else if (strcmp(storage->set->imapc_ssl, "starttls") == 0)
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
248 set.ssl_mode = IMAPC_CLIENT_SSL_MODE_STARTTLS;
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
249 else
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
250 set.ssl_mode = IMAPC_CLIENT_SSL_MODE_NONE;
13775
e8c6ff480a18 imapc: Pass ssl_crypto_device setting to lib-ssl-iostream.
Timo Sirainen <tss@iki.fi>
parents: 13748
diff changeset
251 set.ssl_crypto_device = storage->set->ssl_crypto_device;
12617
7b7434fef6ff imapc: Added initial support for SSL.
Timo Sirainen <tss@iki.fi>
parents: 12615
diff changeset
252
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
253 storage->list = (struct imapc_mailbox_list *)ns->list;
12588
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
254 storage->list->storage = storage;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 storage->client = imapc_client_init(&set);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
256
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
257 p_array_init(&storage->remote_namespaces, _storage->pool, 4);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
258 p_array_init(&storage->untagged_callbacks, _storage->pool, 16);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 imapc_client_register_untagged(storage->client,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 imapc_storage_untagged_cb, storage);
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
261 imapc_list_register_callbacks(storage->list);
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
262 imapc_storage_register_untagged(storage, "STATUS",
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
263 imapc_untagged_status);
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
264 imapc_storage_register_untagged(storage, "NAMESPACE",
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
265 imapc_untagged_namespace);
13416
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
266 /* connect to imap server and get the hierarchy separator. */
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
267 if (imapc_storage_get_hierarchy_sep(storage, error_r) < 0) {
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
268 imapc_client_deinit(&storage->client);
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
269 return -1;
e5570ee5d695 imapc: Connect to server immediately at startup and lookup hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents: 13414
diff changeset
270 }
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 return 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 static void imapc_storage_destroy(struct mail_storage *_storage)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 struct imapc_storage *storage = (struct imapc_storage *)_storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 imapc_client_deinit(&storage->client);
15272
ca10d2e8d8e3 lib-storage: Moved mail attribute dict to struct mail_storage.
Timo Sirainen <tss@iki.fi>
parents: 15224
diff changeset
279 index_storage_destroy(_storage);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
14665
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
282 static void imapc_storage_add_list(struct mail_storage *_storage,
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
283 struct mailbox_list *_list)
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
284 {
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
285 struct imapc_storage *storage = (struct imapc_storage *)_storage;
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
286 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
287
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
288 i_assert(storage->list != NULL);
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
289 i_assert(storage->list->sep != '\0');
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
290
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
291 list->storage = storage;
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
292 list->sep = storage->list->sep;
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
293 }
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
294
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
295 void imapc_storage_register_untagged(struct imapc_storage *storage,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
296 const char *name,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
297 imapc_storage_callback_t *callback)
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
298 {
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
299 struct imapc_storage_event_callback *cb;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
300
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
301 cb = array_append_space(&storage->untagged_callbacks);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
302 cb->name = p_strdup(storage->storage.pool, name);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
303 cb->callback = callback;
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
304 }
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
305
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 static void
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 imapc_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 struct mailbox_list_settings *set)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 {
12588
1b8fb4ff2bb3 imapc: Added support for LIST/LSUB.
Timo Sirainen <tss@iki.fi>
parents: 12586
diff changeset
310 set->layout = MAILBOX_LIST_NAME_IMAPC;
13652
7e1981ecbe40 imapc: Don't use separate indexes/ directory anymore. Fixes/cleanups to make it possible.
Timo Sirainen <tss@iki.fi>
parents: 13635
diff changeset
311 set->escape_char = IMAPC_LIST_ESCAPE_CHAR;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 static struct mailbox *
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 imapc_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
12586
a2780b694b2d lib-storage: mailbox_alloc() now takes a virtual mailbox name and other related API changes.
Timo Sirainen <tss@iki.fi>
parents: 12583
diff changeset
316 const char *vname, enum mailbox_flags flags)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 struct imapc_mailbox *mbox;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 pool_t pool;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320
13522
bed9bc9b9e22 Increased initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 13446
diff changeset
321 pool = pool_alloconly_create("imapc mailbox", 1024*4);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 mbox = p_new(pool, struct imapc_mailbox, 1);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 mbox->box = imapc_mailbox;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 mbox->box.pool = pool;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 mbox->box.storage = storage;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 mbox->box.list = list;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 mbox->box.mail_vfuncs = &imapc_mail_vfuncs;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
12786
934c529052eb imapc: Initial support for local index files.
Timo Sirainen <tss@iki.fi>
parents: 12767
diff changeset
329 index_storage_mailbox_alloc(&mbox->box, vname, flags,
934c529052eb imapc: Initial support for local index files.
Timo Sirainen <tss@iki.fi>
parents: 12767
diff changeset
330 IMAPC_INDEX_PREFIX);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 mbox->storage = (struct imapc_storage *)storage;
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
333
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
334 p_array_init(&mbox->untagged_callbacks, pool, 16);
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
335 p_array_init(&mbox->resp_text_callbacks, pool, 16);
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents: 12866
diff changeset
336 p_array_init(&mbox->fetch_mails, pool, 16);
13414
3ae5d7e0a4b4 imapc: Don't crash if a newly seen uncommitted message is expunged.
Timo Sirainen <tss@iki.fi>
parents: 13396
diff changeset
337 p_array_init(&mbox->delayed_expunged_uids, pool, 16);
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
338 mbox->prev_mail_cache.fd = -1;
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
339 imapc_mailbox_register_callbacks(mbox);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 return &mbox->box;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342
13446
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
343 static int
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
344 imapc_mailbox_exists(struct mailbox *box, bool auto_boxes ATTR_UNUSED,
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
345 enum mailbox_existence *existence_r)
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
346 {
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
347 enum mailbox_info_flags flags;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
348
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
349 if (imapc_list_get_mailbox_flags(box->list, box->name, &flags) < 0)
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
350 return -1;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
351 if ((flags & MAILBOX_NONEXISTENT) != 0)
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
352 *existence_r = MAILBOX_EXISTENCE_NONE;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
353 else if ((flags & MAILBOX_NOSELECT) != 0)
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
354 *existence_r = MAILBOX_EXISTENCE_NOSELECT;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
355 else
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
356 *existence_r = MAILBOX_EXISTENCE_SELECT;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
357 return 0;
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
358 }
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
359
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
360 static bool imapc_mailbox_want_examine(struct imapc_mailbox *mbox)
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
361 {
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
362 return (mbox->box.flags & MAILBOX_FLAG_DROP_RECENT) == 0 &&
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
363 ((mbox->box.flags & MAILBOX_FLAG_READONLY) != 0 ||
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
364 (mbox->box.flags & MAILBOX_FLAG_SAVEONLY) != 0);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
365 }
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
366
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
367 static void
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
368 imapc_mailbox_reopen_callback(const struct imapc_command_reply *reply,
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
369 void *context)
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
370 {
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
371 struct imapc_mailbox *mbox = context;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
372
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
373 i_assert(mbox->storage->reopen_count > 0);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
374 mbox->storage->reopen_count--;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
375 mbox->selecting = FALSE;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
376 if (reply->state != IMAPC_COMMAND_STATE_OK) {
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
377 mail_storage_set_critical(mbox->box.storage,
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
378 "imapc: Reopening mailbox '%s' failed: %s",
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
379 mbox->box.name, reply->text_full);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
380 imapc_client_mailbox_reconnect(mbox->client_box);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
381 }
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
382 imapc_client_stop(mbox->storage->client);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
383 }
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
384
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
385 static void imapc_mailbox_reopen(void *context)
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
386 {
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
387 struct imapc_mailbox *mbox = context;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
388 struct imapc_command *cmd;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
389
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
390 /* we're reconnecting and need to reopen the mailbox */
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
391 mbox->initial_sync_done = FALSE;
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
392 mbox->selecting = TRUE;
13626
2dbc6108f090 imapc: Mailbox reopening fix.
Timo Sirainen <tss@iki.fi>
parents: 13622
diff changeset
393 mbox->prev_skipped_rseq = 0;
2dbc6108f090 imapc: Mailbox reopening fix.
Timo Sirainen <tss@iki.fi>
parents: 13622
diff changeset
394 mbox->prev_skipped_uid = 0;
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
395 imapc_msgmap_reset(imapc_client_mailbox_get_msgmap(mbox->client_box));
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
396
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
397 cmd = imapc_client_mailbox_cmd(mbox->client_box,
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
398 imapc_mailbox_reopen_callback, mbox);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
399 imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
400 if (imapc_mailbox_want_examine(mbox))
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
401 imapc_command_sendf(cmd, "EXAMINE %s", mbox->box.name);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
402 else
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
403 imapc_command_sendf(cmd, "SELECT %s", mbox->box.name);
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
404 mbox->storage->reopen_count++;
13628
c9594ff166a9 imapc: Support retrying some IMAP commands if we get disconnected.
Timo Sirainen <tss@iki.fi>
parents: 13626
diff changeset
405
c9594ff166a9 imapc: Support retrying some IMAP commands if we get disconnected.
Timo Sirainen <tss@iki.fi>
parents: 13626
diff changeset
406 if (mbox->syncing)
c9594ff166a9 imapc: Support retrying some IMAP commands if we get disconnected.
Timo Sirainen <tss@iki.fi>
parents: 13626
diff changeset
407 imapc_sync_mailbox_reopened(mbox);
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
408 }
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
409
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 static void
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 imapc_mailbox_open_callback(const struct imapc_command_reply *reply,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 void *context)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 struct imapc_open_context *ctx = context;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
416 ctx->mbox->selecting = FALSE;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 if (reply->state == IMAPC_COMMAND_STATE_OK)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 ctx->ret = 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 else if (reply->state == IMAPC_COMMAND_STATE_NO) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 imapc_copy_error_from_reply(ctx->mbox->storage,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 MAIL_ERROR_NOTFOUND, reply);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 ctx->ret = -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 } else {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 mail_storage_set_critical(ctx->mbox->box.storage,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 "imapc: Opening mailbox '%s' failed: %s",
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
426 ctx->mbox->box.name, reply->text_full);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 ctx->ret = -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 }
13386
1da4bc23d4dc imapc: Delay handling new messages and setting uidvalidity/uidnext until sync.
Timo Sirainen <tss@iki.fi>
parents: 13383
diff changeset
429 imapc_client_stop(ctx->mbox->storage->client);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
432 static void imapc_mailbox_get_extensions(struct imapc_mailbox *mbox)
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
433 {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
434 enum imapc_capability capa =
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
435 imapc_client_get_capabilities(mbox->storage->client);
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
436
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
437 if (mbox->guid_fetch_field_name == NULL) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
438 /* see if we can get message GUIDs somehow */
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
439 if ((capa & IMAPC_CAPABILITY_X_GM_EXT_1) != 0) {
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
440 /* GMail */
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
441 mbox->guid_fetch_field_name = "X-GM-MSGID";
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
442 }
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
443 }
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
444 }
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
445
13609
09707b608d8d imapc: Fixed fetching data for a saved, but uncommitted, mail.
Timo Sirainen <tss@iki.fi>
parents: 13596
diff changeset
446 int imapc_mailbox_select(struct imapc_mailbox *mbox)
13541
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
447 {
13614
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
448 struct imapc_command *cmd;
13541
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
449 struct imapc_open_context ctx;
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
450
13614
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
451 i_assert(mbox->client_box == NULL);
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
452
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
453 mbox->client_box =
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
454 imapc_client_mailbox_open(mbox->storage->client, mbox);
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
455 imapc_client_mailbox_set_reopen_cb(mbox->client_box,
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
456 imapc_mailbox_reopen, mbox);
13614
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
457
13855
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
458 imapc_mailbox_get_extensions(mbox);
0bdbb8d99492 imapc: Added support for fetching GUID from remote server, if supported.
Timo Sirainen <tss@iki.fi>
parents: 13851
diff changeset
459
13541
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
460 mbox->selecting = TRUE;
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
461 ctx.mbox = mbox;
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
462 ctx.ret = -2;
13614
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
463 cmd = imapc_client_mailbox_cmd(mbox->client_box,
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
464 imapc_mailbox_open_callback, &ctx);
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
465 imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
466 if (imapc_mailbox_want_examine(mbox))
13614
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
467 imapc_command_sendf(cmd, "EXAMINE %s", mbox->box.name);
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
468 else
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
469 imapc_command_sendf(cmd, "SELECT %s", mbox->box.name);
c358b13e32cc imapc: Changed mailbox opening API to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13613
diff changeset
470
13541
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
471 while (ctx.ret == -2)
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
472 imapc_storage_run(mbox->storage);
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
473 return ctx.ret;
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
474 }
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
475
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 static int imapc_mailbox_open(struct mailbox *box)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 if (index_storage_mailbox_open(box, FALSE) < 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 return -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482
12604
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12596
diff changeset
483 if (box->deleting || (box->flags & MAILBOX_FLAG_SAVEONLY) != 0) {
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
484 /* We don't actually want to SELECT the mailbox. */
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
485 return 0;
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
486 }
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487
13444
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
488 if (*box->name == '\0' &&
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
489 (box->list->ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0) {
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
490 /* trying to open INBOX as the namespace prefix.
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
491 Don't allow this. */
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
492 mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
493 "Mailbox isn't selectable");
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
494 mailbox_close(box);
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
495 return -1;
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
496 }
59c7b30973cf imapc: Fixes to handling non-empty imapc namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 13440
diff changeset
497
13541
645a56f9d8ee iampc: Small code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 13535
diff changeset
498 if (imapc_mailbox_select(mbox) < 0) {
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 mailbox_close(box);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 return -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 return 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504
13564
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
505 void imapc_mail_cache_free(struct imapc_mail_cache *cache)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
506 {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
507 if (cache->fd != -1) {
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
508 if (close(cache->fd) < 0)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
509 i_error("close(imapc cached mail) failed: %m");
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
510 cache->fd = -1;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
511 }
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
512 if (cache->buf != NULL)
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
513 buffer_free(&cache->buf);
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
514 cache->uid = 0;
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
515 }
5726f89486a0 imapc: Keep the last fetched message body cached until mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13541
diff changeset
516
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 static void imapc_mailbox_close(struct mailbox *box)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520
12595
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
521 if (mbox->client_box != NULL)
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
522 imapc_client_mailbox_close(&mbox->client_box);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
523 if (mbox->delayed_sync_view != NULL)
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
524 mail_index_view_close(&mbox->delayed_sync_view);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
525 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
526 if (mail_index_transaction_commit(&mbox->delayed_sync_trans) < 0)
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
527 mail_storage_set_index_error(&mbox->box);
5d97dfa9d86c imapc: Fixed mailbox deletion and some error handling. Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 12592
diff changeset
528 }
12763
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
529 if (mbox->sync_view != NULL)
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
530 mail_index_view_close(&mbox->sync_view);
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
531 if (mbox->to_idle_delay != NULL)
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
532 timeout_remove(&mbox->to_idle_delay);
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
533 if (mbox->to_idle_check != NULL)
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
534 timeout_remove(&mbox->to_idle_check);
13572
967a53c3ef5e imapc: Make sure mail cache is freed when mailbox is closed.
Timo Sirainen <tss@iki.fi>
parents: 13564
diff changeset
535 imapc_mail_cache_free(&mbox->prev_mail_cache);
13748
bfcd0bed5a9e Compile fixes.
Timo Sirainen <tss@iki.fi>
parents: 13652
diff changeset
536 index_storage_mailbox_close(box);
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 static int
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 imapc_mailbox_create(struct mailbox *box,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 const struct mailbox_update *update ATTR_UNUSED,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 bool directory)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
545 struct imapc_command *cmd;
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
546 struct imapc_simple_context sctx;
13439
0801852b2156 imapc: Another try at fixing mUTF-7 mailbox names.
Timo Sirainen <tss@iki.fi>
parents: 13438
diff changeset
547 const char *name = box->name;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 if (directory) {
12590
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
550 name = t_strdup_printf("%s%c", name,
9e471f267fb4 imapc: Code cleanups and fixes.
Timo Sirainen <tss@iki.fi>
parents: 12588
diff changeset
551 mailbox_list_get_hierarchy_sep(box->list));
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 }
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
553 imapc_simple_context_init(&sctx, mbox->storage);
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
554 cmd = imapc_client_cmd(mbox->storage->client,
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
555 imapc_simple_callback, &sctx);
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
556 imapc_command_sendf(cmd, "CREATE %s", name);
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
557 imapc_simple_run(&sctx);
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
558 return sctx.ret;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 static int imapc_mailbox_update(struct mailbox *box,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 const struct mailbox_update *update ATTR_UNUSED)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 "Not supported");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 return -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
569 static void imapc_untagged_status(const struct imapc_untagged_reply *reply,
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
570 struct imapc_storage *storage)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
571 {
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
572 struct mailbox_status *status;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
573 const struct imap_arg *list;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
574 const char *name, *key, *value;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
575 uint32_t num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
576 unsigned int i;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
577
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
578 if (!imap_arg_get_astring(&reply->args[0], &name) ||
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
579 !imap_arg_get_list(&reply->args[1], &list))
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
580 return;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
581
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
582 if (storage->cur_status_box == NULL ||
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
583 strcmp(storage->cur_status_box->box.name, name) != 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
584 return;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
585
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
586 status = storage->cur_status;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
587 for (i = 0; list[i].type != IMAP_ARG_EOL; i += 2) {
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
588 if (!imap_arg_get_atom(&list[i], &key) ||
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
589 !imap_arg_get_atom(&list[i+1], &value) ||
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
590 str_to_uint32(value, &num) < 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
591 return;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
592
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
593 if (strcasecmp(key, "MESSAGES") == 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
594 status->messages = num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
595 else if (strcasecmp(key, "RECENT") == 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
596 status->recent = num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
597 else if (strcasecmp(key, "UIDNEXT") == 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
598 status->uidnext = num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
599 else if (strcasecmp(key, "UIDVALIDITY") == 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
600 status->uidvalidity = num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
601 else if (strcasecmp(key, "UNSEEN") == 0)
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
602 status->unseen = num;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
603 }
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
604 }
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
605
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
606 static void imapc_untagged_namespace(const struct imapc_untagged_reply *reply,
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
607 struct imapc_storage *storage)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
608 {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
609 static enum mail_namespace_type ns_types[] = {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
610 MAIL_NAMESPACE_TYPE_PRIVATE,
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
611 MAIL_NAMESPACE_TYPE_SHARED,
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
612 MAIL_NAMESPACE_TYPE_PUBLIC
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
613 };
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
614 struct imapc_namespace *ns;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
615 const struct imap_arg *list, *list2;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
616 const char *prefix, *sep;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
617 unsigned int i;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
618
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
619 array_clear(&storage->remote_namespaces);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
620 for (i = 0; i < N_ELEMENTS(ns_types); i++) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
621 if (reply->args[i].type == IMAP_ARG_NIL)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
622 continue;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
623 if (!imap_arg_get_list(&reply->args[i], &list))
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
624 break;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
625
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
626 for (; list->type != IMAP_ARG_EOL; list++) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
627 if (!imap_arg_get_list(list, &list2) ||
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
628 !imap_arg_get_astring(&list2[0], &prefix) ||
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
629 !imap_arg_get_nstring(&list2[1], &sep))
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
630 break;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
631
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
632 ns = array_append_space(&storage->remote_namespaces);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
633 ns->prefix = p_strdup(storage->storage.pool, prefix);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
634 ns->separator = sep == NULL ? '\0' : sep[0];
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
635 ns->type = ns_types[i];
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
636 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
637 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
638 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
639
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 static void imapc_mailbox_get_selected_status(struct imapc_mailbox *mbox,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641 enum mailbox_status_items items,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 struct mailbox_status *status_r)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 {
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
644 index_storage_get_open_status(&mbox->box, items, status_r);
13396
4ddbbfa1c515 imapc: mailbox_status now returns permanent flags/keywords as they are on remote server.
Timo Sirainen <tss@iki.fi>
parents: 13386
diff changeset
645 if ((items & STATUS_PERMANENT_FLAGS) != 0)
4ddbbfa1c515 imapc: mailbox_status now returns permanent flags/keywords as they are on remote server.
Timo Sirainen <tss@iki.fi>
parents: 13386
diff changeset
646 status_r->permanent_flags = mbox->permanent_flags;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 static int imapc_mailbox_get_status(struct mailbox *box,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 enum mailbox_status_items items,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 struct mailbox_status *status_r)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
654 struct imapc_command *cmd;
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
655 struct imapc_simple_context sctx;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 string_t *str;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 memset(status_r, 0, sizeof(*status_r));
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 if (box->opened) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 imapc_mailbox_get_selected_status(mbox, items, status_r);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 return 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 /* mailbox isn't opened yet */
13396
4ddbbfa1c515 imapc: mailbox_status now returns permanent flags/keywords as they are on remote server.
Timo Sirainen <tss@iki.fi>
parents: 13386
diff changeset
666 if ((items & (STATUS_FIRST_UNSEEN_SEQ | STATUS_KEYWORDS |
4ddbbfa1c515 imapc: mailbox_status now returns permanent flags/keywords as they are on remote server.
Timo Sirainen <tss@iki.fi>
parents: 13386
diff changeset
667 STATUS_PERMANENT_FLAGS)) != 0) {
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 /* getting these requires opening the mailbox */
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 if (mailbox_open(box) < 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 return -1;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 imapc_mailbox_get_selected_status(mbox, items, status_r);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 return 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 str = t_str_new(256);
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 if ((items & STATUS_MESSAGES) != 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 str_append(str, " MESSAGES");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 if ((items & STATUS_RECENT) != 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 str_append(str, " RECENT");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680 if ((items & STATUS_UIDNEXT) != 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 str_append(str, " UIDNEXT");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 if ((items & STATUS_UIDVALIDITY) != 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 str_append(str, " UIDVALIDITY");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 if ((items & STATUS_UNSEEN) != 0)
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 str_append(str, " UNSEEN");
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 if (str_len(str) == 0) {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 /* nothing requested */
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 return 0;
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
692 imapc_simple_context_init(&sctx, mbox->storage);
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
693 mbox->storage->cur_status_box = mbox;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
694 mbox->storage->cur_status = status_r;
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
695 cmd = imapc_client_cmd(mbox->storage->client,
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
696 imapc_simple_callback, &sctx);
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
697 imapc_command_sendf(cmd, "STATUS %s (%1s)", box->name, str_c(str)+1);
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
698 imapc_simple_run(&sctx);
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
699 mbox->storage->cur_status_box = NULL;
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
700 mbox->storage->cur_status = NULL;
12767
c5816dd58dcf imapc: Use multiple client connections when necessary. Some other fixes.
Timo Sirainen <tss@iki.fi>
parents: 12763
diff changeset
701 return sctx.ret;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
704 static int imapc_mailbox_get_namespaces(struct imapc_storage *storage)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
705 {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
706 enum imapc_capability capa;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
707 struct imapc_command *cmd;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
708 struct imapc_simple_context sctx;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
709
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
710 if (storage->namespaces_requested)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
711 return 0;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
712
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
713 capa = imapc_client_get_capabilities(storage->client);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
714 if ((capa & IMAPC_CAPABILITY_NAMESPACE) == 0) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
715 /* NAMESPACE capability not supported */
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
716 return 0;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
717 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
718
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
719 imapc_simple_context_init(&sctx, storage);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
720 cmd = imapc_client_cmd(storage->client,
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
721 imapc_simple_callback, &sctx);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
722 imapc_command_send(cmd, "NAMESPACE");
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
723 imapc_simple_run(&sctx);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
724
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
725 if (sctx.ret < 0)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
726 return -1;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
727 storage->namespaces_requested = TRUE;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
728 return 0;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
729 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
730
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
731 static const struct imapc_namespace *
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
732 imapc_namespace_find_mailbox(struct imapc_storage *storage, const char *name)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
733 {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
734 const struct imapc_namespace *ns, *best_ns = NULL;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
735 unsigned int best_len = -1U, len;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
736
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
737 array_foreach(&storage->remote_namespaces, ns) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
738 len = strlen(ns->prefix);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
739 if (strncmp(ns->prefix, name, len) == 0) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
740 if (best_len > len) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
741 best_ns = ns;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
742 best_len = len;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
743 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
744 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
745 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
746 return best_ns;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
747 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
748
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 static int imapc_mailbox_get_metadata(struct mailbox *box,
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
750 enum mailbox_metadata_items items,
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
751 struct mailbox_metadata *metadata_r)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 {
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
753 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
754 const struct imapc_namespace *ns;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
755
13596
b7e58d26393f lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents: 13575
diff changeset
756 if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
b7e58d26393f lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents: 13575
diff changeset
757 return -1;
12596
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
758 if ((items & MAILBOX_METADATA_GUID) != 0) {
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
759 /* a bit ugly way to do this, but better than nothing for now.
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
760 FIXME: if indexes are enabled, keep this there. */
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
761 mail_generate_guid_128_hash(box->name, metadata_r->guid);
d75d4841c890 imapc: Implemented more methods.
Timo Sirainen <tss@iki.fi>
parents: 12595
diff changeset
762 }
15014
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
763 if ((items & MAILBOX_METADATA_BACKEND_NAMESPACE) != 0) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
764 if (imapc_mailbox_get_namespaces(mbox->storage) < 0)
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
765 return -1;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
766
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
767 ns = imapc_namespace_find_mailbox(mbox->storage, box->name);
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
768 if (ns != NULL) {
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
769 metadata_r->backend_ns_prefix = ns->prefix;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
770 metadata_r->backend_ns_type = ns->type;
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
771 }
5f313144c481 lib-storage: Added MAILBOX_METADATA_BACKEND_NAMESPACE
Timo Sirainen <tss@iki.fi>
parents: 14939
diff changeset
772 }
13596
b7e58d26393f lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents: 13575
diff changeset
773 return 0;
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775
13622
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
776 static void imapc_noop_callback(const struct imapc_command_reply *reply,
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
777 void *context)
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
778
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
779 {
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
780 struct imapc_storage *storage = context;
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
781
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
782 if (reply->state == IMAPC_COMMAND_STATE_OK)
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
783 ;
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
784 else if (reply->state == IMAPC_COMMAND_STATE_NO)
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
785 imapc_copy_error_from_reply(storage, MAIL_ERROR_PARAMS, reply);
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
786 else if (reply->state == IMAPC_COMMAND_STATE_DISCONNECTED)
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
787 mail_storage_set_internal_error(&storage->storage);
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
788 else {
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
789 mail_storage_set_critical(&storage->storage,
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
790 "imapc: NOOP failed: %s", reply->text_full);
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
791 }
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
792 }
305ca9c93dd7 imapc: Fixed detecting when messages are missing from index.
Timo Sirainen <tss@iki.fi>
parents: 13621
diff changeset
793
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
794 static void imapc_idle_timeout(struct imapc_mailbox *mbox)
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
795 {
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
796 struct imapc_command *cmd;
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
797
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
798 cmd = imapc_client_mailbox_cmd(mbox->client_box,
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
799 imapc_noop_callback, mbox->storage);
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
800 imapc_command_send(cmd, "NOOP");
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
801 }
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
802
13376
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
803 static void imapc_idle_noop_callback(const struct imapc_command_reply *reply,
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
804 void *context)
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
805
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
806 {
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
807 struct imapc_mailbox *mbox = context;
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
808
13381
7db3ed5e17ed imapc: Error logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 13380
diff changeset
809 imapc_noop_callback(reply, mbox->box.storage);
13827
94e32772e593 imapc: Crashfix on error conditions.
Timo Sirainen <tss@iki.fi>
parents: 13775
diff changeset
810 if (mbox->client_box != NULL)
94e32772e593 imapc: Crashfix on error conditions.
Timo Sirainen <tss@iki.fi>
parents: 13775
diff changeset
811 imapc_client_mailbox_idle(mbox->client_box);
13376
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
812 }
e1a8ad9c83cd imapc: Fixed IDLE handling.
Timo Sirainen <tss@iki.fi>
parents: 13374
diff changeset
813
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
814 static void imapc_notify_changes(struct mailbox *box)
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815 {
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
816 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
14218
5e4e6c57c142 lib-storage: Removed min_timeout parameter from mailbox_notify_changes()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
817 const struct mail_storage_settings *set = box->storage->set;
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
818 struct imapc_command *cmd;
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
819 enum imapc_capability capa;
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
820
14218
5e4e6c57c142 lib-storage: Removed min_timeout parameter from mailbox_notify_changes()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
821 if (box->notify_callback == NULL) {
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
822 if (mbox->to_idle_check != NULL)
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
823 timeout_remove(&mbox->to_idle_check);
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
824 return;
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
825 }
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
826
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
827 capa = imapc_client_get_capabilities(mbox->storage->client);
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
828 if ((capa & IMAPC_CAPABILITY_IDLE) != 0) {
12667
ceab4f233bff imapc: When local IDLE is started, force remote server to first check changes with NOOP.
Timo Sirainen <tss@iki.fi>
parents: 12635
diff changeset
829 /* remote server is already in IDLE. but since some servers
ceab4f233bff imapc: When local IDLE is started, force remote server to first check changes with NOOP.
Timo Sirainen <tss@iki.fi>
parents: 12635
diff changeset
830 don't notice changes immediately, we'll force them to check
ceab4f233bff imapc: When local IDLE is started, force remote server to first check changes with NOOP.
Timo Sirainen <tss@iki.fi>
parents: 12635
diff changeset
831 here by sending a NOOP. this helps with clients that break
ceab4f233bff imapc: When local IDLE is started, force remote server to first check changes with NOOP.
Timo Sirainen <tss@iki.fi>
parents: 12635
diff changeset
832 IDLE when clicking "get mail". */
13613
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
833 cmd = imapc_client_mailbox_cmd(mbox->client_box,
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
834 imapc_idle_noop_callback, mbox);
e0a339d677cb imapc: Command sending API changed to be more extensible.
Timo Sirainen <tss@iki.fi>
parents: 13609
diff changeset
835 imapc_command_send(cmd, "NOOP");
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
836 } else {
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
837 /* remote server doesn't support IDLE.
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
838 check for changes with NOOP every once in a while. */
13377
44e3c053f9f8 imapc: Added assert.
Timo Sirainen <tss@iki.fi>
parents: 13376
diff changeset
839 i_assert(!imapc_client_is_running(mbox->storage->client));
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
840 mbox->to_idle_check =
14218
5e4e6c57c142 lib-storage: Removed min_timeout parameter from mailbox_notify_changes()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
841 timeout_add(set->mailbox_idle_check_interval * 1000,
12635
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
842 imapc_idle_timeout, mbox);
4fdf3084f74f imapc: Support IDLE even if remote IMAP server doesn't support it.
Timo Sirainen <tss@iki.fi>
parents: 12627
diff changeset
843 }
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845
12763
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
846 static bool imapc_is_inconsistent(struct mailbox *box)
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
847 {
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
848 struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
849
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
850 if (mail_index_view_is_inconsistent(box->view))
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
851 return TRUE;
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
852
13621
8fdd22504aab imapc: Initial support for automatically reconnecting to remote server.
Timo Sirainen <tss@iki.fi>
parents: 13619
diff changeset
853 return !imapc_client_mailbox_is_opened(mbox->client_box);
12763
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
854 }
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
855
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 struct mail_storage imapc_storage = {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 .name = IMAPC_STORAGE_NAME,
12626
aa131065b53d imapc: Don't force a root directory to exist.
Timo Sirainen <tss@iki.fi>
parents: 12625
diff changeset
858 .class_flags = MAIL_STORAGE_CLASS_FLAG_NO_ROOT,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 .v = {
12625
495fb0e9f7cc imapc: Moved settings from plugin {} section to proper imapc_* settings.
Timo Sirainen <tss@iki.fi>
parents: 12619
diff changeset
861 imapc_get_setting_parser_info,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 imapc_storage_alloc,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 imapc_storage_create,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 imapc_storage_destroy,
14665
b13753851a07 imapc: Don't crash when using multiple imapc namespaces.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
865 imapc_storage_add_list,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 imapc_storage_get_list_settings,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 NULL,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 imapc_mailbox_alloc,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 NULL
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 };
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 struct mailbox imapc_mailbox = {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 .v = {
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 index_storage_is_readonly,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 index_storage_mailbox_enable,
13446
cc9332de9982 imapc: Fixed mailbox_exists() to actually work.
Timo Sirainen <tss@iki.fi>
parents: 13444
diff changeset
877 imapc_mailbox_exists,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
878 imapc_mailbox_open,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879 imapc_mailbox_close,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 index_storage_mailbox_free,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 imapc_mailbox_create,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 imapc_mailbox_update,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 index_storage_mailbox_delete,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884 index_storage_mailbox_rename,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
885 imapc_mailbox_get_status,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 imapc_mailbox_get_metadata,
13876
bc9217cb0193 lib-storage: Added struct mailbox.set_subscribed() virtual method.
Timo Sirainen <tss@iki.fi>
parents: 13855
diff changeset
887 index_storage_set_subscribed,
15224
5659c178bdeb lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15208
diff changeset
888 index_storage_attribute_set,
5659c178bdeb lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15208
diff changeset
889 index_storage_attribute_get,
5659c178bdeb lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15208
diff changeset
890 index_storage_attribute_iter_init,
5659c178bdeb lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15208
diff changeset
891 index_storage_attribute_iter_next,
5659c178bdeb lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15208
diff changeset
892 index_storage_attribute_iter_deinit,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 NULL,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 NULL,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 imapc_mailbox_sync_init,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
896 index_mailbox_sync_next,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 imapc_mailbox_sync_deinit,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898 NULL,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 imapc_notify_changes,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
900 index_transaction_begin,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901 index_transaction_commit,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 index_transaction_rollback,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903 NULL,
12609
391ba80cb125 imapc: Send UID FETCH commands with larger uidset parameter if possible.
Timo Sirainen <tss@iki.fi>
parents: 12604
diff changeset
904 imapc_mail_alloc,
12874
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents: 12866
diff changeset
905 index_storage_search_init,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents: 12866
diff changeset
906 index_storage_search_deinit,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents: 12866
diff changeset
907 index_storage_search_next_nonblock,
0461e23ae57c Search supports now prefetching data for returned mails. Dropped imapc's own prefetching.
Timo Sirainen <tss@iki.fi>
parents: 12866
diff changeset
908 index_storage_search_next_update_seq,
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 imapc_save_alloc,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
910 imapc_save_begin,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911 imapc_save_continue,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912 imapc_save_finish,
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
913 imapc_save_cancel,
12604
0e5c36a54ce8 imapc: Added support for saving and copying messages.
Timo Sirainen <tss@iki.fi>
parents: 12596
diff changeset
914 imapc_copy,
12866
59e4c0d1457b lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents: 12786
diff changeset
915 imapc_transaction_save_commit_pre,
59e4c0d1457b lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents: 12786
diff changeset
916 imapc_transaction_save_commit_post,
59e4c0d1457b lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents: 12786
diff changeset
917 imapc_transaction_save_rollback,
12763
345100da8c67 imapc: Many fixes related to syncing and error handling.
Timo Sirainen <tss@iki.fi>
parents: 12669
diff changeset
918 imapc_is_inconsistent
12580
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 }
7dd1e45721ae Added initial implementation of "imapc" storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 };