annotate src/lib-storage/list/mailbox-list-index-notify.c @ 15167:0fa075f2e85a

lib-storage: Added initial implementation for layout=index. The idea is that all of the mailbox names only exist in the mailbox list index. Storage directories use mailbox GUIDs. This avoids all kinds of race conditions with mailbox renames. mailbox_list_index=yes is required for this layout to work. There are probably still some race conditions within the indexing code itself. Also error recovery is missing.
author Timo Sirainen <tss@iki.fi>
date Fri, 28 Sep 2012 00:11:19 +0300
parents fcd480c4a0db
children 90710c6c3beb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
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"
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-storage.h"
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;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct io *io_wait;
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
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 struct stat last_st;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 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
64 unsigned int read_failed:1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 };
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 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
68 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
69 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
70 {
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_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
72 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
73
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 /* 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
76 return -1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 (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
80
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 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
82 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
83 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
84 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
85 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
86 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
87 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
88 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
89 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
90 i_array_init(&inotify->renames, 16);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
91 i_array_init(&inotify->new_subscriptions, 16);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
92 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
93 inotify->rec_name = str_new(default_pool, 64);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
94 if ((mask & (MAILBOX_LIST_NOTIFY_SUBSCRIBE |
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
95 MAILBOX_LIST_NOTIFY_UNSUBSCRIBE)) != 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
96 (void)mailbox_list_iter_subscriptions_refresh(list);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
97 mailbox_tree_sort(list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
98 inotify->subscriptions = mailbox_tree_dup(list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
99 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 *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
102 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 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
106 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 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
108 (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
109 bool b;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
111 if (inotify->subscriptions != NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
112 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
113 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
114 io_remove(&inotify->io_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 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
116 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
117 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
118 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
119 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
120 (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
121 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
122 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
123 mailbox_list_notify_tree_deinit(&inotify->tree);
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
124 array_free(&inotify->new_subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
125 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
126 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
127 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
128 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
129 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
130 str_free(&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
131 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
132 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 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
135 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
136 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
137 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
138 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
139 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 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
141 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
142 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
143 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
144
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 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
146 return NULL;
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 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
149 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
150 /* 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
151 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
152 (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
153 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
154 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
155 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
156 return NULL;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 /* get GUID */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 memset(status_r, 0, sizeof(*status_r));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 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
162 (void)mailbox_list_index_status(inotify->notify.list, view, seq,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 items, status_r, guid_r);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 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
165 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 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
168 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 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
170 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
171 const char *path = ilist->index->log->filepath;
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 if (stat(path, &inotify->last_st) < 0 && errno != ENOENT) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 i_error("stat(%s) failed: %m", path);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 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
176 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 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
181 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 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
183
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 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
185 (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
186
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 /* 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
188 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
189 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
190 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
191 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
192
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 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
194 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
195 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 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
198 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
199 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 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
201
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 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
203 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
204 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 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
206 /* UIDVALIDITY changed */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 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
208 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 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
211 /* 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
212 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
213 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 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
216 /* 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
217 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
218 modseq change */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 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
220 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 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
223 return FALSE;
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 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
226 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 static int
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 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
231 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 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
233 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
234 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
235 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
236 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 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
239 &hdr, &data);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 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
241 return ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 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
244 /* 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
245 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 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
248 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
249 /* 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
250 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
251
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 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
253 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
254 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 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
257 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
258 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
259 break;
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 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
262 /* 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
263 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
264
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 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
266 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
267 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 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
270 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
271 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
272 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 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
275 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
276 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
277 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
278 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
279 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
280
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 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
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 /* 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
284 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
285 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
286 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
287 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
288 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
289 /* 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
290 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
291 } 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
292 /* by name */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 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
294 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
295 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
296 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 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
298 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
299 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
300 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
301 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
302 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
303 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
304 else
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 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
306 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
307 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 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
311 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
312 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
313 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
314
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 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
316 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
317 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
318 break;
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
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 /* 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
322 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
323 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
324 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
325 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
326 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
327
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 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
329 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 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
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 break;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 return 1;
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
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 static int
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 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
341 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
342 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 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
346 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
347 return ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 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
350 /* 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
351 return 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 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
354 }
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 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 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
358 {
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14898
diff changeset
359 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
360 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
361 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
362 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
363 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
364 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
365 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
366 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
367
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 /* 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
369 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
370 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
371 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
372 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
373 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
374 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
375 !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
376 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
377 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
378 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
379 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
380 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
15167
0fa075f2e85a lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents: 15027
diff changeset
383 (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
384 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
385 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
386 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
387 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
388 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
389 !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
390 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
391 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
392 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
393 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 /* 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
397 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
398 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
399
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 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
401 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
402 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
403 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
404 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
405 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
406 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
407
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 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
409 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
410 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
411 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
412 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 static void
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
417 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
418 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
419 struct mailbox_tree_iterate_context *old_iter, *new_iter;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
420 struct mailbox_tree_context *old_tree, *new_tree;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
421 const char *old_path = NULL, *new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
422 pool_t pool;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
423 int ret;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
424
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
425 if (mailbox_list_iter_subscriptions_refresh(inotify->notify.list) < 0)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
426 return;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
427 mailbox_tree_sort(inotify->notify.list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
428
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
429 old_tree = inotify->subscriptions;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
430 new_tree = mailbox_tree_dup(inotify->notify.list->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
431
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
432 old_iter = mailbox_tree_iterate_init(old_tree, NULL, MAILBOX_SUBSCRIBED);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
433 new_iter = mailbox_tree_iterate_init(new_tree, NULL, MAILBOX_SUBSCRIBED);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
434
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
435 pool = mailbox_tree_get_pool(new_tree);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
436 for (;;) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
437 if (old_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
438 if (mailbox_tree_iterate_next(old_iter, &old_path) == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
439 old_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
440 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
441 if (new_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
442 if (mailbox_tree_iterate_next(new_iter, &new_path) == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
443 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
444 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
445
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
446 if (old_path == NULL) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
447 if (new_path == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
448 break;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
449 ret = 1;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
450 } else if (new_path == NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
451 ret = -1;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
452 else {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
453 ret = strcmp(old_path, new_path);
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
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
456 if (ret == 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
457 old_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
458 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
459 } else if (ret > 0) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
460 new_path = p_strdup(pool, new_path);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
461 array_append(&inotify->new_subscriptions, &new_path, 1);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
462 new_path = NULL;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
463 } else {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
464 old_path = p_strdup(pool, old_path);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
465 array_append(&inotify->new_unsubscriptions, &old_path, 1);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
466 old_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 mailbox_tree_iterate_deinit(&old_iter);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
470 mailbox_tree_iterate_deinit(&new_iter);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
471
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
472 mailbox_tree_deinit(&inotify->subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
473 inotify->subscriptions = new_tree;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
474 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
475
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
476 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
477 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
478 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 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
480 &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
481 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
482 &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
483 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
484 &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
485 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
486 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
487 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
488 inotify->rename_idx = 0;
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
489 inotify->subscription_idx = 0;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
490 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
491 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 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
495 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 bool b;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 int ret;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 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
500
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 /* 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
502 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
503 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
504
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 (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
506
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 /* 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
508 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
509 &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
510 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
511 &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
512 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
513 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
514 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
515 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
516 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
517 }
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
518 if (inotify->subscriptions != NULL)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
519 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
520
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 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
522 }
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 static void
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 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
526 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 /* 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
528 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
529 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
530
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
531 array_clear(&inotify->new_subscriptions);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
532 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
533 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
534 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
535 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
536 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
537
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 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
539 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 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
543 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
544 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
545 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
546 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
547 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 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
549 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
550 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
551 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
552
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 memset(rec, 0, sizeof(*rec));
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 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
555 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
556 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
557 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 /* 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
560 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
561 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
562 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
563
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 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
565 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
566 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
567 *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
568 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 }
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 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 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
573 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
574 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 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
576 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
577 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
578 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
579
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 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
581
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 /* 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
583 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
584 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
585 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 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
587
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 /* 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
589 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
590 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
591 return FALSE;
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 rec->old_vname = old_vname;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 rec->event = 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
595 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 }
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 static bool
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
599 mailbox_list_index_notify_subscribe(struct mailbox_list_notify_index *inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
600 unsigned int idx)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
601 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
602 struct mailbox_list_notify_rec *rec = &inotify->notify_rec;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
603 const char *const *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
604
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
605 memset(rec, 0, sizeof(*rec));
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
606 vnamep = array_idx(&inotify->new_subscriptions, idx);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
607 rec->vname = *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
608 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
609 rec->vname);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
610 rec->event = MAILBOX_LIST_NOTIFY_SUBSCRIBE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
611 return TRUE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
612 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
613
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
614 static bool
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
615 mailbox_list_index_notify_unsubscribe(struct mailbox_list_notify_index *inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
616 unsigned int idx)
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
617 {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
618 struct mailbox_list_notify_rec *rec = &inotify->notify_rec;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
619 const char *const *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
620
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
621 memset(rec, 0, sizeof(*rec));
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
622 vnamep = array_idx(&inotify->new_unsubscriptions, idx);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
623 rec->vname = *vnamep;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
624 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
625 rec->vname);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
626 rec->event = MAILBOX_LIST_NOTIFY_UNSUBSCRIBE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
627 return TRUE;
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
628 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
629
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
630 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
631 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
632 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
633 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
634 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
635 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
636
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 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
638 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
639 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 rec->event = 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
641 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 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
646 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
647 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 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
649 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
650
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 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
652 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
653 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 rec->event = 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
655 return TRUE;
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
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 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
660 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
661 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 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
663 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
664 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
665 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
666 struct mailbox_notify_node *nnode;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 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
668
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 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
670 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
671 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 /* 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
674 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
675 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
676 if (nnode == NULL || nnode->uidvalidity != status.uidvalidity)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 rec->event = MAILBOX_LIST_NOTIFY_UIDVALIDITY;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 else if (nnode->uidnext != status.uidnext)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 rec->event = MAILBOX_LIST_NOTIFY_APPENDS;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680 else if (nnode->messages > status.messages)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 rec->event = MAILBOX_LIST_NOTIFY_EXPUNGES;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 else if (nnode->unseen != status.unseen)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 rec->event = MAILBOX_LIST_NOTIFY_SEEN_CHANGES;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 else if (nnode->highest_modseq < status.highest_modseq)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 rec->event = MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 else {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 /* nothing changed */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 /* update internal state */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 if (nnode != NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 nnode->uidvalidity = status.uidvalidity;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 nnode->uidnext = status.uidnext;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 nnode->messages = status.messages;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 nnode->unseen = status.unseen;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 nnode->highest_modseq = status.highest_modseq;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 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
704 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 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
706
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 /* 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
708 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
709 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
710 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
711
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 /* mailbox renames */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 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
714 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
715 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
716 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718 /* 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
719 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
720 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
721 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
722
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
723 /* subscribes */
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
724 if (inotify->subscription_idx < array_count(&inotify->new_subscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
725 return mailbox_list_index_notify_subscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
726 inotify->subscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
727 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
728 if (inotify->unsubscription_idx < array_count(&inotify->new_unsubscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
729 return mailbox_list_index_notify_unsubscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
730 inotify->unsubscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
731 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
732
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 /* STATUS updates */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 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
735 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
736 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
737 return TRUE;
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 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 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
743 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
744 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 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
746 (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
747
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 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
749 mailbox_list_index_notify_read_init(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 while (mailbox_list_index_notify_try_next(inotify)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751 if ((inotify->notify_rec.event & inotify->notify.mask) != 0) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 *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
753 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
754 } else {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 /* 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
756 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759 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
760 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
761 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 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
764 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 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
766 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
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 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
770 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771 struct stat prev_st = inotify->last_st;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773 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
774 if (inotify->last_st.st_mtime != prev_st.st_mtime ||
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 ST_MTIME_NSEC(inotify->last_st) != ST_MTIME_NSEC(prev_st) ||
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 inotify->last_st.st_size != prev_st.st_size ||
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 inotify->last_st.st_ino != prev_st.st_ino) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
778 /* 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
779 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
780 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
781 /* 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
782 return;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 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
785 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
786 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
787 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
788 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
790 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
791 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
792 void *context)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 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
795 (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
796 const char *path;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 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
798
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 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
800 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
801
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 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
803 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
804 io_remove(&inotify->io_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 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
806 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
807 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
808 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
809 } else 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
810 path = inotify->view->index->log->filepath;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 (void)io_add_notify(path, 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
812 &inotify->io_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 /* 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
814 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
815 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
816 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
817 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
818 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
819 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
820 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821 }