Mercurial > dovecot > core-2.2
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 |
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 | 393 mbox->prev_skipped_rseq = 0; |
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 | 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 | 449 struct imapc_open_context ctx; |
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 | 460 mbox->selecting = TRUE; |
461 ctx.mbox = mbox; | |
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 | 471 while (ctx.ret == -2) |
472 imapc_storage_run(mbox->storage); | |
473 return ctx.ret; | |
474 } | |
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 | 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 | 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 | 803 static void imapc_idle_noop_callback(const struct imapc_command_reply *reply, |
804 void *context) | |
805 | |
806 { | |
807 struct imapc_mailbox *mbox = context; | |
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 | 812 } |
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 | 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 }; |