annotate src/lib-storage/list/mailbox-list-index-notify.c @ 22078:f2b50a4a6951

lib-storage: Fix mailbox list index notifications when modseqs aren't enabled. No notifications were sent if highest_modseqs weren't updated in mailbox list index.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 17 May 2017 17:14:05 +0300
parents 2e2563132d5f
children c5eae96dcd71
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mail-index-private.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mail-transaction-log-private.h"
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
8 #include "mail-storage-private.h"
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mailbox-list-notify.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mailbox-list-notify-tree.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "mailbox-list-index.h"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <sys/stat.h>
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #define NOTIFY_DELAY_MSECS 500
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 enum ilist_ext_type {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 ILIST_EXT_NONE,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 ILIST_EXT_BASE,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 ILIST_EXT_MSGS,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 ILIST_EXT_HIGHESTMODSEQ,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 ILIST_EXT_UNKNOWN
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 };
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct mailbox_list_notify_rename {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 uint32_t old_uid, new_uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 };
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 struct mailbox_list_inotify_entry {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 uint32_t uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 guid_128_t guid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 bool expunge;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 };
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 struct mailbox_list_notify_index {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct mailbox_list_notify notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
38 struct mailbox_tree_context *subscriptions;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 struct mailbox_list_notify_tree *tree;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 struct mail_index_view *view, *old_view;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct mail_index_view_sync_ctx *sync_ctx;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 enum ilist_ext_type cur_ext;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 uint32_t cur_ext_id;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 void (*wait_callback)(void *context);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 void *wait_context;
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
47 struct io *io_wait, *io_wait_inbox;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 struct timeout *to_wait, *to_notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 ARRAY_TYPE(seq_range) new_uids, expunged_uids, changed_uids;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
51 ARRAY_TYPE(const_string) new_subscriptions, new_unsubscriptions;
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14898
diff changeset
52 ARRAY(struct mailbox_list_notify_rename) renames;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 struct seq_range_iter new_uids_iter, expunged_uids_iter;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 struct seq_range_iter changed_uids_iter;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 unsigned int new_uids_n, expunged_uids_n, changed_uids_n;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
56 unsigned int rename_idx, subscription_idx, unsubscription_idx;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 struct mailbox_list_notify_rec notify_rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 string_t *rec_name;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
61 char *list_log_path, *inbox_log_path;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
62 struct stat list_last_st, inbox_last_st;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 unsigned int initialized:1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 unsigned int read_failed:1;
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
66 unsigned int inbox_event_pending:1;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 };
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 int mailbox_list_index_notify_init(struct mailbox_list *list,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 enum mailbox_list_notify_event mask,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 struct mailbox_list_notify **notify_r)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 struct mailbox_list_notify_index *inotify;
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
75 const char *index_dir;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 if (ilist == NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 /* can't do this without mailbox list indexes */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 return -1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 (void)mailbox_list_index_refresh(list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 inotify = i_new(struct mailbox_list_notify_index, 1);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 inotify->notify.list = list;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 inotify->notify.mask = mask;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 inotify->view = mail_index_view_open(ilist->index);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 inotify->old_view = mail_index_view_dup_private(inotify->view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 inotify->tree = mailbox_list_notify_tree_init(list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 i_array_init(&inotify->new_uids, 8);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 i_array_init(&inotify->expunged_uids, 8);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 i_array_init(&inotify->changed_uids, 16);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 i_array_init(&inotify->renames, 16);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
94 i_array_init(&inotify->new_subscriptions, 16);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
95 i_array_init(&inotify->new_unsubscriptions, 16);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 inotify->rec_name = str_new(default_pool, 64);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
97 if ((mask & (MAILBOX_LIST_NOTIFY_SUBSCRIBE |
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
98 MAILBOX_LIST_NOTIFY_UNSUBSCRIBE)) != 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
99 (void)mailbox_list_iter_subscriptions_refresh(list);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
100 mailbox_tree_sort(list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
101 inotify->subscriptions = mailbox_tree_dup(list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
102 }
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
103 inotify->list_log_path = i_strdup(ilist->index->log->filepath);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
104 if ((list->ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 &&
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
105 mailbox_list_get_path(list, "INBOX", MAILBOX_LIST_PATH_TYPE_INDEX,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
106 &index_dir) > 0) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
107 /* FIXME: annoyingly hardcoded filename. */
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
108 inotify->inbox_log_path = i_strdup_printf(
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
109 "%s/"MAIL_INDEX_PREFIX".log", index_dir);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
110 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 *notify_r = &inotify->notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 void mailbox_list_index_notify_deinit(struct mailbox_list_notify *notify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 struct mailbox_list_notify_index *inotify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 (struct mailbox_list_notify_index *)notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 bool b;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
122 if (inotify->subscriptions != NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
123 mailbox_tree_deinit(&inotify->subscriptions);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 if (inotify->io_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 io_remove(&inotify->io_wait);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
126 if (inotify->io_wait_inbox != NULL)
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
127 io_remove(&inotify->io_wait_inbox);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 if (inotify->to_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 timeout_remove(&inotify->to_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 if (inotify->to_notify != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 timeout_remove(&inotify->to_notify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 if (inotify->sync_ctx != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 (void)mail_index_view_sync_commit(&inotify->sync_ctx, &b);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 mail_index_view_close(&inotify->view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 mail_index_view_close(&inotify->old_view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 mailbox_list_notify_tree_deinit(&inotify->tree);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
137 array_free(&inotify->new_subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
138 array_free(&inotify->new_unsubscriptions);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 array_free(&inotify->new_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 array_free(&inotify->expunged_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 array_free(&inotify->changed_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 array_free(&inotify->renames);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 str_free(&inotify->rec_name);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
144 i_free(inotify->list_log_path);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
145 i_free(inotify->inbox_log_path);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 i_free(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 static struct mailbox_list_index_node *
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 notify_lookup_guid(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 struct mail_index_view *view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 uint32_t uid, enum mailbox_status_items items,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 struct mailbox_status *status_r, guid_128_t guid_r)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 struct mailbox_list_index *ilist =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 INDEX_LIST_CONTEXT(inotify->notify.list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 struct mailbox_list_index_node *index_node;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 uint32_t seq;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 if (!mail_index_lookup_seq(view, uid, &seq))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 return NULL;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 index_node = mailbox_list_index_lookup_uid(ilist, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 if (index_node == NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 /* re-parse the index list using the given view. we could be
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 jumping here between old and new view. */
15167
0fa075f2e85a lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents: 15027
diff changeset
167 (void)mailbox_list_index_parse(inotify->notify.list,
0fa075f2e85a lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents: 15027
diff changeset
168 view, FALSE);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 index_node = mailbox_list_index_lookup_uid(ilist, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 if (index_node == NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 return NULL;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 /* get GUID */
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
175 i_zero(status_r);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 memset(guid_r, 0, GUID_128_SIZE);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 (void)mailbox_list_index_status(inotify->notify.list, view, seq,
18907
46cbde67f50b lib-storage: If mailboxes' vsizes are used, keep them updated also in mailbox list index.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
178 items, status_r, guid_r, NULL);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 return index_node;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 static void notify_update_stat(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 {
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
184 bool call = FALSE;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
186 if (stat(inotify->list_log_path, &inotify->list_last_st) < 0 &&
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
187 errno != ENOENT) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
188 i_error("stat(%s) failed: %m", inotify->list_log_path);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
189 call = TRUE;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
190 }
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
191 if (inotify->inbox_log_path != NULL) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
192 if (stat(inotify->inbox_log_path, &inotify->inbox_last_st) < 0 &&
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
193 errno != ENOENT) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
194 i_error("stat(%s) failed: %m", inotify->inbox_log_path);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
195 call = TRUE;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
196 }
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
197 }
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
198 if (call)
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 mailbox_list_index_notify_wait(&inotify->notify, NULL, NULL);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 mailbox_list_index_notify_sync_init(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 struct mail_index_view_sync_rec sync_rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 notify_update_stat(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 (void)mail_index_refresh(inotify->view->index);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 /* sync the view so that map extensions gets updated */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 inotify->sync_ctx = mail_index_view_sync_begin(inotify->view, 0);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 mail_transaction_log_view_mark(inotify->view->log_view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 while (mail_index_view_sync_next(inotify->sync_ctx, &sync_rec)) ;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 mail_transaction_log_view_rewind(inotify->view->log_view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 inotify->cur_ext = ILIST_EXT_NONE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 inotify->cur_ext_id = (uint32_t)-1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 static bool notify_ext_rec(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 uint32_t uid)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 struct mailbox_list_notify *notify = &inotify->notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 switch (inotify->cur_ext) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 case ILIST_EXT_NONE:
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 case ILIST_EXT_BASE:
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 /* UIDVALIDITY changed */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 if ((notify->mask & MAILBOX_LIST_NOTIFY_UIDVALIDITY) == 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 case ILIST_EXT_MSGS:
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 /* APPEND, EXPUNGE, \Seen or \Recent flag change */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 if ((notify->mask & MAILBOX_LIST_NOTIFY_STATUS) == 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 case ILIST_EXT_HIGHESTMODSEQ:
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 /* when this doesn't come with EXT_MSGS update,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 it can only be a flag change or an explicit
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 modseq change */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 if ((notify->mask & MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES) == 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 case ILIST_EXT_UNKNOWN:
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 seq_range_array_add(&inotify->changed_uids, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 static int
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 mailbox_list_index_notify_read_next(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 struct mailbox_list_notify *notify = &inotify->notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(notify->list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 const struct mail_transaction_header *hdr;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 const void *data;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 ret = mail_transaction_log_view_next(inotify->view->log_view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 &hdr, &data);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 if (ret <= 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 return ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 /* all mailbox index updates are external */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 case MAIL_TRANSACTION_APPEND: {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 /* mailbox added or renamed */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 const struct mail_index_record *rec, *end;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 if ((notify->mask & (MAILBOX_LIST_NOTIFY_CREATE |
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 MAILBOX_LIST_NOTIFY_RENAME)) == 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 end = CONST_PTR_OFFSET(data, hdr->size);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 for (rec = data; rec != end; rec++)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 seq_range_array_add(&inotify->new_uids, rec->uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 case MAIL_TRANSACTION_EXPUNGE_GUID: {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 /* mailbox deleted or renamed */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 const struct mail_transaction_expunge_guid *rec, *end;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 if ((notify->mask & (MAILBOX_LIST_NOTIFY_DELETE |
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 MAILBOX_LIST_NOTIFY_RENAME)) == 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 end = CONST_PTR_OFFSET(data, hdr->size);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 for (rec = data; rec != end; rec++)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 seq_range_array_add(&inotify->expunged_uids, rec->uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 case MAIL_TRANSACTION_EXT_INTRO: {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 struct mail_index_map *map = inotify->view->map;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 const struct mail_transaction_ext_intro *rec = data;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 const struct mail_index_ext *ext = NULL;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 const char *name;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 uint32_t ext_map_idx;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 if (!array_is_created(&map->extensions))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 /* we want to know what extension the future
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 ext-rec-updates are changing. we're assuming here that
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 there is only one ext-intro record before those,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 which is true at least for now. */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 if (rec->ext_id != (uint32_t)-1 &&
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 rec->ext_id < array_count(&map->extensions)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 /* get extension by id */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 ext = array_idx(&map->extensions, rec->ext_id);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 } else if (rec->name_size > 0) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 /* by name */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 name = t_strndup(rec+1, rec->name_size);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 if (mail_index_map_lookup_ext(map, name, &ext_map_idx))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 ext = array_idx(&map->extensions, ext_map_idx);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 if (ext != NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 if (ext->index_idx == ilist->ext_id)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 inotify->cur_ext = ILIST_EXT_BASE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 else if (ext->index_idx == ilist->msgs_ext_id)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 inotify->cur_ext = ILIST_EXT_MSGS;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 else if (ext->index_idx == ilist->hmodseq_ext_id)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 inotify->cur_ext = ILIST_EXT_HIGHESTMODSEQ;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 else
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 inotify->cur_ext = ILIST_EXT_UNKNOWN;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 inotify->cur_ext_id = ext->index_idx;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 case MAIL_TRANSACTION_EXT_REC_UPDATE: {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 const struct mail_index_registered_ext *ext;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 const struct mail_transaction_ext_rec_update *rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 unsigned int i, record_size;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 if (inotify->cur_ext == ILIST_EXT_NONE) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 i_error("%s: Missing ext-intro for ext-rec-update",
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 ilist->index->filepath);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 /* the record is padded to 32bits in the transaction log */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 ext = array_idx(&inotify->view->index->extensions,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 inotify->cur_ext_id);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 record_size = (sizeof(*rec) + ext->record_size + 3) & ~3;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 for (i = 0; i < hdr->size; i += record_size) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 rec = CONST_PTR_OFFSET(data, i);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 if (i + record_size > hdr->size)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 if (!notify_ext_rec(inotify, rec->uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 static int
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 mailbox_list_inotify_entry_guid_cmp(const struct mailbox_list_inotify_entry *r1,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 const struct mailbox_list_inotify_entry *r2)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 ret = memcmp(r1->guid, r2->guid, sizeof(r1->guid));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 if (ret != 0)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 return ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 if (r1->expunge == r2->expunge) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 /* this really shouldn't happen */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 return 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 return r1->expunge ? -1 : 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 mailbox_list_index_notify_find_renames(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 {
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14898
diff changeset
382 ARRAY(struct mailbox_list_inotify_entry) entries;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 struct mailbox_status status;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 struct mailbox_list_notify_rename *rename;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 struct mailbox_list_inotify_entry *entry;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 const struct mailbox_list_inotify_entry *e;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 unsigned int i, count;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 guid_128_t guid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 uint32_t uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 /* first get all of the added and expunged GUIDs */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 t_array_init(&entries, array_count(&inotify->new_uids) +
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 array_count(&inotify->expunged_uids));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 while (seq_range_array_iter_nth(&inotify->expunged_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 inotify->expunged_uids_n++, &uid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 if (notify_lookup_guid(inotify, inotify->old_view, uid,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 0, &status, guid) != NULL &&
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 !guid_128_is_empty(guid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 entry = array_append_space(&entries);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 entry->uid = uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 entry->expunge = TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 memcpy(entry->guid, guid, sizeof(entry->guid));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
15167
0fa075f2e85a lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents: 15027
diff changeset
406 (void)mailbox_list_index_parse(inotify->notify.list,
0fa075f2e85a lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents: 15027
diff changeset
407 inotify->view, TRUE);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 while (seq_range_array_iter_nth(&inotify->new_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 inotify->new_uids_n++, &uid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 if (notify_lookup_guid(inotify, inotify->view, uid,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 0, &status, guid) != NULL &&
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 !guid_128_is_empty(guid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 entry = array_append_space(&entries);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 entry->uid = uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 memcpy(entry->guid, guid, sizeof(entry->guid));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 /* now sort the entries by GUID and find those that have been both
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 added and expunged */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 array_sort(&entries, mailbox_list_inotify_entry_guid_cmp);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 e = array_get(&entries, &count);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 for (i = 1; i < count; i++) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 if (e[i-1].expunge && !e[i].expunge &&
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 memcmp(e[i-1].guid, e[i].guid, sizeof(e[i].guid)) == 0) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 rename = array_append_space(&inotify->renames);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 rename->old_uid = e[i-1].uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 rename->new_uid = e[i].uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 seq_range_array_remove(&inotify->expunged_uids,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 rename->old_uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 seq_range_array_remove(&inotify->new_uids,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 rename->new_uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 static void
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
440 mailbox_list_index_notify_find_subscribes(struct mailbox_list_notify_index *inotify)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
441 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
442 struct mailbox_tree_iterate_context *old_iter, *new_iter;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
443 struct mailbox_tree_context *old_tree, *new_tree;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
444 const char *old_path = NULL, *new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
445 pool_t pool;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
446 int ret;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
447
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
448 if (mailbox_list_iter_subscriptions_refresh(inotify->notify.list) < 0)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
449 return;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
450 mailbox_tree_sort(inotify->notify.list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
451
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
452 old_tree = inotify->subscriptions;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
453 new_tree = mailbox_tree_dup(inotify->notify.list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
454
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
455 old_iter = mailbox_tree_iterate_init(old_tree, NULL, MAILBOX_SUBSCRIBED);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
456 new_iter = mailbox_tree_iterate_init(new_tree, NULL, MAILBOX_SUBSCRIBED);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
457
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
458 pool = mailbox_tree_get_pool(new_tree);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
459 for (;;) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
460 if (old_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
461 if (mailbox_tree_iterate_next(old_iter, &old_path) == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
462 old_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
463 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
464 if (new_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
465 if (mailbox_tree_iterate_next(new_iter, &new_path) == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
466 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
467 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
468
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
469 if (old_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
470 if (new_path == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
471 break;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
472 ret = 1;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
473 } else if (new_path == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
474 ret = -1;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
475 else {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
476 ret = strcmp(old_path, new_path);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
477 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
478
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
479 if (ret == 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
480 old_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
481 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
482 } else if (ret > 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
483 new_path = p_strdup(pool, new_path);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
484 array_append(&inotify->new_subscriptions, &new_path, 1);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
485 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
486 } else {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
487 old_path = p_strdup(pool, old_path);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
488 array_append(&inotify->new_unsubscriptions, &old_path, 1);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
489 old_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
490 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
491 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
492 mailbox_tree_iterate_deinit(&old_iter);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
493 mailbox_tree_iterate_deinit(&new_iter);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
494
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
495 mailbox_tree_deinit(&inotify->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
496 inotify->subscriptions = new_tree;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
497 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
498
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
499 static void
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 mailbox_list_index_notify_reset_iters(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 seq_range_array_iter_init(&inotify->new_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 &inotify->new_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 seq_range_array_iter_init(&inotify->expunged_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 &inotify->expunged_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 seq_range_array_iter_init(&inotify->changed_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 &inotify->changed_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 inotify->changed_uids_n = 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 inotify->new_uids_n = 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 inotify->expunged_uids_n = 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 inotify->rename_idx = 0;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
512 inotify->subscription_idx = 0;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
513 inotify->unsubscription_idx = 0;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 mailbox_list_index_notify_read_init(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 bool b;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 mailbox_list_index_notify_sync_init(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 /* read all changes from .log file */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 while ((ret = mailbox_list_index_notify_read_next(inotify)) > 0) ;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 inotify->read_failed = ret < 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 (void)mail_index_view_sync_commit(&inotify->sync_ctx, &b);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 /* remove changes for already deleted mailboxes */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 seq_range_array_remove_seq_range(&inotify->new_uids,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 &inotify->expunged_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 seq_range_array_remove_seq_range(&inotify->changed_uids,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 &inotify->expunged_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 mailbox_list_index_notify_reset_iters(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 if (array_count(&inotify->new_uids) > 0 &&
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 array_count(&inotify->expunged_uids) > 0) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 mailbox_list_index_notify_find_renames(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 mailbox_list_index_notify_reset_iters(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 }
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
541 if (inotify->subscriptions != NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
542 mailbox_list_index_notify_find_subscribes(inotify);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 inotify->initialized = TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 mailbox_list_index_notify_read_deinit(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 /* save the old view so we can look up expunged records */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 mail_index_view_close(&inotify->old_view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 inotify->old_view = mail_index_view_dup_private(inotify->view);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
554 array_clear(&inotify->new_subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
555 array_clear(&inotify->new_unsubscriptions);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 array_clear(&inotify->new_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 array_clear(&inotify->expunged_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 array_clear(&inotify->changed_uids);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 array_clear(&inotify->renames);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 inotify->initialized = FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 mailbox_list_index_notify_lookup(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 struct mail_index_view *view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 uint32_t uid, enum mailbox_status_items items,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 struct mailbox_status *status_r,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 struct mailbox_list_notify_rec **rec_r)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 struct mailbox_list_notify_rec *rec = &inotify->notify_rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 struct mailbox_list_index_node *index_node;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 const char *storage_name;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 char ns_sep = mailbox_list_get_hierarchy_sep(inotify->notify.list);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
576 i_zero(rec);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 index_node = notify_lookup_guid(inotify, view, uid,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 items, status_r, rec->guid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 if (index_node == NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 /* get storage_name */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 str_truncate(inotify->rec_name, 0);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 mailbox_list_index_node_get_path(index_node, ns_sep, inotify->rec_name);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 storage_name = str_c(inotify->rec_name);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 rec->storage_name = storage_name;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 rec->vname = mailbox_list_get_vname(inotify->notify.list,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 rec->storage_name);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 *rec_r = rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 mailbox_list_index_notify_rename(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 unsigned int idx)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 const struct mailbox_list_notify_rename *rename;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 struct mailbox_list_notify_rec *rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600 struct mailbox_status status;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 const char *old_vname;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 rename = array_idx(&inotify->renames, idx);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 /* lookup the old name */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606 if (!mailbox_list_index_notify_lookup(inotify, inotify->old_view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 rename->old_uid, 0, &status, &rec))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 old_vname = t_strdup(rec->vname);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 /* return using the new name */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 if (!mailbox_list_index_notify_lookup(inotify, inotify->view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 rename->new_uid, 0, &status, &rec))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 rec->old_vname = old_vname;
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
617 rec->events = MAILBOX_LIST_NOTIFY_RENAME;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 static bool
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
622 mailbox_list_index_notify_subscribe(struct mailbox_list_notify_index *inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
623 unsigned int idx)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
624 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
625 struct mailbox_list_notify_rec *rec = &inotify->notify_rec;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
626 const char *const *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
627
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
628 i_zero(rec);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
629 vnamep = array_idx(&inotify->new_subscriptions, idx);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
630 rec->vname = *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
631 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
632 rec->vname);
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
633 rec->events = MAILBOX_LIST_NOTIFY_SUBSCRIBE;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
634 return TRUE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
635 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
636
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
637 static bool
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
638 mailbox_list_index_notify_unsubscribe(struct mailbox_list_notify_index *inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
639 unsigned int idx)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
640 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
641 struct mailbox_list_notify_rec *rec = &inotify->notify_rec;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
642 const char *const *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
643
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
644 i_zero(rec);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
645 vnamep = array_idx(&inotify->new_unsubscriptions, idx);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
646 rec->vname = *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
647 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
648 rec->vname);
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
649 rec->events = MAILBOX_LIST_NOTIFY_UNSUBSCRIBE;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
650 return TRUE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
651 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
652
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
653 static bool
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 mailbox_list_index_notify_expunge(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 uint32_t uid)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 struct mailbox_list_notify_rec *rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 struct mailbox_status status;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 if (!mailbox_list_index_notify_lookup(inotify, inotify->old_view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 uid, 0, &status, &rec))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 return FALSE;
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
663 rec->events = MAILBOX_LIST_NOTIFY_DELETE;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 mailbox_list_index_notify_new(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 uint32_t uid)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 struct mailbox_list_notify_rec *rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 struct mailbox_status status;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674 if (!mailbox_list_index_notify_lookup(inotify, inotify->view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 uid, 0, &status, &rec))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 i_unreached();
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
677 rec->events = MAILBOX_LIST_NOTIFY_CREATE;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 mailbox_list_index_notify_change(struct mailbox_list_notify_index *inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 uint32_t uid)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 const enum mailbox_status_items status_items =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 STATUS_UIDVALIDITY | STATUS_UIDNEXT | STATUS_MESSAGES |
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 STATUS_UNSEEN | STATUS_HIGHESTMODSEQ;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 struct mailbox_list_notify_rec *rec;
19140
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
689 struct mailbox_notify_node *nnode, empty_node;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 struct mailbox_status status;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 if (!mailbox_list_index_notify_lookup(inotify, inotify->view,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 uid, status_items, &status, &rec))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 /* get the old status */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 nnode = mailbox_list_notify_tree_lookup(inotify->tree,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 rec->storage_name);
19140
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
699 if (nnode == NULL) {
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
700 /* mailbox didn't exist earlier - report all events as new */
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
701 i_zero(&empty_node);
19140
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
702 nnode = &empty_node;
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
703 }
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
704 if (nnode->uidvalidity != status.uidvalidity)
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
705 rec->events |= MAILBOX_LIST_NOTIFY_UIDVALIDITY;
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
706 if (nnode->uidnext != status.uidnext)
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
707 rec->events |= MAILBOX_LIST_NOTIFY_APPENDS;
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
708 if (nnode->messages > status.messages) {
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
709 /* NOTE: not entirely reliable, since there could be both
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
710 expunges and appends.. but it shouldn't make any difference
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
711 in practise, since anybody interested in expunges is most
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
712 likely also interested in appends. */
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
713 rec->events |= MAILBOX_LIST_NOTIFY_EXPUNGES;
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
714 }
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
715 if (nnode->unseen != status.unseen)
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
716 rec->events |= MAILBOX_LIST_NOTIFY_SEEN_CHANGES;
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
717 if (nnode->highest_modseq < status.highest_modseq)
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
718 rec->events |= MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 /* update internal state */
19229
5af9b91c38c0 lib-storage: Removed unnecessary code - nnode is never NULL at this point.
Timo Sirainen <tss@iki.fi>
parents: 19140
diff changeset
721 nnode->uidvalidity = status.uidvalidity;
5af9b91c38c0 lib-storage: Removed unnecessary code - nnode is never NULL at this point.
Timo Sirainen <tss@iki.fi>
parents: 19140
diff changeset
722 nnode->uidnext = status.uidnext;
5af9b91c38c0 lib-storage: Removed unnecessary code - nnode is never NULL at this point.
Timo Sirainen <tss@iki.fi>
parents: 19140
diff changeset
723 nnode->messages = status.messages;
5af9b91c38c0 lib-storage: Removed unnecessary code - nnode is never NULL at this point.
Timo Sirainen <tss@iki.fi>
parents: 19140
diff changeset
724 nnode->unseen = status.unseen;
5af9b91c38c0 lib-storage: Removed unnecessary code - nnode is never NULL at this point.
Timo Sirainen <tss@iki.fi>
parents: 19140
diff changeset
725 nnode->highest_modseq = status.highest_modseq;
22078
f2b50a4a6951 lib-storage: Fix mailbox list index notifications when modseqs aren't enabled.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
726 return rec->events != 0;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 mailbox_list_index_notify_try_next(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 uint32_t uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 /* first show mailbox deletes */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 if (seq_range_array_iter_nth(&inotify->expunged_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 inotify->expunged_uids_n++, &uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737 return mailbox_list_index_notify_expunge(inotify, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 /* mailbox renames */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 if (inotify->rename_idx < array_count(&inotify->renames)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 return mailbox_list_index_notify_rename(inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 inotify->rename_idx++);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 /* next mailbox creates */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 if (seq_range_array_iter_nth(&inotify->new_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 inotify->new_uids_n++, &uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 return mailbox_list_index_notify_new(inotify, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
750 /* subscribes */
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
751 if (inotify->subscription_idx < array_count(&inotify->new_subscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
752 return mailbox_list_index_notify_subscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
753 inotify->subscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
754 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
755 if (inotify->unsubscription_idx < array_count(&inotify->new_unsubscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
756 return mailbox_list_index_notify_unsubscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
757 inotify->unsubscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
758 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
759
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 /* STATUS updates */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 while (seq_range_array_iter_nth(&inotify->changed_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 inotify->changed_uids_n++, &uid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 if (mailbox_list_index_notify_change(inotify, uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
769 int mailbox_list_index_notify_next(struct mailbox_list_notify *notify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
770 const struct mailbox_list_notify_rec **rec_r)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 struct mailbox_list_notify_index *inotify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773 (struct mailbox_list_notify_index *)notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 if (!inotify->initialized)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 mailbox_list_index_notify_read_init(inotify);
21226
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
777 if (mailbox_list_index_handle_corruption(notify->list) < 0)
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
778 return -1;
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
779
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 while (mailbox_list_index_notify_try_next(inotify)) {
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
781 if ((inotify->notify_rec.events & inotify->notify.mask) != 0) {
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
782 *rec_r = &inotify->notify_rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 } else {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785 /* caller doesn't care about this change */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
787 }
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
788 if (inotify->inbox_event_pending) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
789 inotify->inbox_event_pending = FALSE;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
790 i_zero(&inotify->notify_rec);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
791 inotify->notify_rec.vname = "INBOX";
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
792 inotify->notify_rec.storage_name = "INBOX";
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
793 /* Don't bother trying to figure out which event exactly this
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
794 is. Just send them all and let the caller handle it. */
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
795 inotify->notify_rec.events = MAILBOX_LIST_NOTIFY_APPENDS |
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
796 MAILBOX_LIST_NOTIFY_EXPUNGES |
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
797 MAILBOX_LIST_NOTIFY_SEEN_CHANGES |
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
798 MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
799 *rec_r = &inotify->notify_rec;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
800 return 1;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
801 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803 mailbox_list_index_notify_read_deinit(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 return inotify->read_failed ? -1 : 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807 static void notify_now_callback(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 timeout_remove(&inotify->to_notify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 inotify->wait_callback(inotify->wait_context);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 static void notify_callback(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 {
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
815 #define INOTIFY_ST_CHANGED(last_st, prev_st) \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
816 ((last_st).st_mtime != (prev_st).st_mtime || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
817 ST_MTIME_NSEC(last_st) != ST_MTIME_NSEC(prev_st) || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
818 (last_st).st_size != (prev_st).st_size || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
819 (last_st).st_ino != (prev_st).st_ino)
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
820 struct stat list_prev_st = inotify->list_last_st;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
821 struct stat inbox_prev_st = inotify->inbox_last_st;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
822
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823 notify_update_stat(inotify);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
824 if (INOTIFY_ST_CHANGED(inotify->inbox_last_st, inbox_prev_st))
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
825 inotify->inbox_event_pending = TRUE;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
826 if (inotify->inbox_event_pending ||
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
827 INOTIFY_ST_CHANGED(inotify->list_last_st, list_prev_st)) {
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 /* log has changed. call the callback with a small delay
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829 to allow bundling multiple changes together */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 if (inotify->to_notify != NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 /* already doing this */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 return;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
834 inotify->to_notify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 timeout_add_short(NOTIFY_DELAY_MSECS,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 notify_now_callback, inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 void mailbox_list_index_notify_wait(struct mailbox_list_notify *notify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 void (*callback)(void *context),
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 void *context)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 struct mailbox_list_notify_index *inotify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 (struct mailbox_list_notify_index *)notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846 unsigned int check_interval;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 inotify->wait_callback = callback;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 inotify->wait_context = context;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 if (callback == NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 if (inotify->io_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 io_remove(&inotify->io_wait);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
854 if (inotify->io_wait_inbox != NULL)
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
855 io_remove(&inotify->io_wait_inbox);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 if (inotify->to_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 timeout_remove(&inotify->to_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858 if (inotify->to_notify != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 timeout_remove(&inotify->to_notify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 } else if (inotify->to_wait == NULL) {
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
861 (void)io_add_notify(inotify->list_log_path, notify_callback,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
862 inotify, &inotify->io_wait);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
863 /* we need to check for INBOX explicitly, because INBOX changes
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
864 don't get added to mailbox.list.index.log */
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
865 if (inotify->inbox_log_path != NULL) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
866 (void)io_add_notify(inotify->inbox_log_path,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
867 notify_callback, inotify,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
868 &inotify->io_wait_inbox);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
869 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870 /* check with timeout as well, in case io_add_notify()
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 doesn't work (e.g. NFS) */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872 check_interval = notify->list->mail_set->mailbox_idle_check_interval;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 i_assert(check_interval > 0);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 inotify->to_wait = timeout_add(check_interval * 1000,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 notify_callback, inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 notify_update_stat(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
878 }