Mercurial > dovecot > core-2.2
annotate src/lib-storage/list/mailbox-list-index-notify.c @ 15027:fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 04 Sep 2012 18:51:43 +0300 |
parents | a097ef0a9d6d |
children | 0fa075f2e85a |
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. */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 (void)mailbox_list_index_parse(ilist, view, FALSE); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 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
|
155 return NULL; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 } |
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 /* get GUID */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 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
|
160 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
|
161 (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
|
162 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
|
163 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
|
164 } |
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 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
|
167 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 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
|
169 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
|
170 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
|
171 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 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
|
174 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
|
175 } |
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 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 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
|
180 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 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
|
182 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 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
|
184 (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
|
185 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 /* 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 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
|
193 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
|
194 } |
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 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
|
197 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
|
198 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 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
|
200 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 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
|
202 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
|
203 i_unreached(); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 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
|
205 /* UIDVALIDITY changed */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 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
|
207 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 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
|
210 /* 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
|
211 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
|
212 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 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
|
215 /* 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
|
216 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
|
217 modseq change */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 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
|
219 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 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
|
222 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 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
|
225 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 } |
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 static int |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 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
|
230 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 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
|
235 int ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 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
|
238 &hdr, &data); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 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
|
240 return ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 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
|
243 /* 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
|
244 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 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
|
247 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
|
248 /* 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
|
249 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
|
250 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 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
|
252 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
|
253 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 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
|
256 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
|
257 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
|
258 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 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
|
261 /* 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
|
262 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
|
263 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 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
|
265 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
|
266 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 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
|
269 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
|
270 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
|
271 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 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
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 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
|
281 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 /* 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
|
283 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
|
284 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
|
285 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
|
286 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
|
287 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
|
288 /* 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
|
289 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
|
290 } 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
|
291 /* by name */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 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
|
293 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
|
294 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
|
295 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 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
|
303 else |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 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
|
305 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
|
306 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 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
|
310 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
|
311 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
|
312 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
|
313 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 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
|
315 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
|
316 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
|
317 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 } |
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 /* 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
|
321 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
|
322 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
|
323 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
|
324 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
|
325 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
|
326 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 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
|
328 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 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
|
330 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 } |
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 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
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 static int |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 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
|
340 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
|
341 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 int ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 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
|
345 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
|
346 return ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 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
|
349 /* 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
|
350 return 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 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
|
353 } |
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 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 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
|
357 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 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
|
359 INDEX_LIST_CONTEXT(inotify->notify.list); |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14898
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 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
|
368 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 /* 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
|
370 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
|
371 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
|
372 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
|
373 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
|
374 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
|
375 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
|
376 !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
|
377 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
|
378 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
|
379 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
|
380 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
|
381 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 (void)mailbox_list_index_parse(ilist, inotify->view, TRUE); |
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 } |