Mercurial > dovecot > core-2.2
annotate src/plugins/push-notification/push-notification-plugin.c @ 22713:cb108f786fb4
Updated copyright notices to include the year 2018.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 01 Jan 2018 22:42:08 +0100 |
parents | 55bd9d8ca7ce |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22419
diff
changeset
|
1 /* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */ |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
2 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
4 #include "array.h" |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
5 #include "ioloop.h" |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
6 #include "mail-namespace.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
7 #include "mail-storage.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
8 #include "mail-storage-private.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
9 #include "notify-plugin.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
10 #include "str.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
11 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
12 #include "push-notification-drivers.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
13 #include "push-notification-events.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
14 #include "push-notification-events-rfc5423.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
15 #include "push-notification-plugin.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
16 #include "push-notification-triggers.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
17 #include "push-notification-txn-mbox.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
18 #include "push-notification-txn-msg.h" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
19 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
20 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
21 #define PUSH_NOTIFICATION_CONFIG "push_notification_driver" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
22 #define PUSH_NOTIFICATION_CONFIG_OLD "push_notification_backend" |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
23 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
24 #define PUSH_NOTIFICATION_USER_CONTEXT(obj) \ |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
25 MODULE_CONTEXT(obj, push_notification_user_module) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
26 static MODULE_CONTEXT_DEFINE_INIT(push_notification_user_module, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
27 &mail_user_module_register); |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
28 static struct ioloop *main_ioloop; |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
29 |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
30 static void |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
31 push_notification_transaction_init(struct push_notification_txn *ptxn) |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
32 { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
33 struct push_notification_driver_txn *dtxn; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
34 struct push_notification_driver_user **duser; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
35 struct mail_storage *storage; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
36 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
37 if (ptxn->initialized) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
38 return; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
39 } |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
40 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
41 ptxn->initialized = TRUE; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
42 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
43 storage = mailbox_get_storage(ptxn->mbox); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
44 if (storage->user->autocreated && |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
45 (strcmp(storage->name, "raw") == 0)) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
46 /* no notifications for autocreated raw users */ |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
47 return; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
48 } |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
49 |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
50 array_foreach_modifiable(&ptxn->puser->driverlist->drivers, duser) { |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
51 dtxn = p_new(ptxn->pool, struct push_notification_driver_txn, 1); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
52 dtxn->duser = *duser; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
53 dtxn->ptxn = ptxn; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
54 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
55 if ((dtxn->duser->driver->v.begin_txn == NULL) || |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
56 dtxn->duser->driver->v.begin_txn(dtxn)) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
57 array_append(&ptxn->drivers, &dtxn, 1); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
58 } |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
59 } |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
60 } |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
61 |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
62 static struct push_notification_txn * |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
63 push_notification_transaction_create(struct mailbox *box, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
64 struct mailbox_transaction_context *t) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
65 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
66 pool_t pool; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
67 struct push_notification_txn *ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
68 struct mail_storage *storage; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
69 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
70 pool = pool_alloconly_create("push notification transaction", 2048); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
71 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
72 ptxn = p_new(pool, struct push_notification_txn, 1); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
73 ptxn->mbox = box; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
74 storage = mailbox_get_storage(box); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
75 ptxn->muser = mail_storage_get_user(storage); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
76 ptxn->pool = pool; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
77 ptxn->puser = PUSH_NOTIFICATION_USER_CONTEXT(ptxn->muser); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
78 ptxn->t = t; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
79 ptxn->trigger = PUSH_NOTIFICATION_EVENT_TRIGGER_NONE; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
80 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
81 p_array_init(&ptxn->drivers, pool, 4); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
82 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
83 return ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
84 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
85 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
86 static void push_notification_transaction_end |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
87 (struct push_notification_txn *ptxn, bool success) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
88 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
89 struct push_notification_driver_txn **dtxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
90 |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
91 if (ptxn->initialized) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
92 array_foreach_modifiable(&ptxn->drivers, dtxn) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
93 if ((*dtxn)->duser->driver->v.end_txn != NULL) { |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
94 (*dtxn)->duser->driver->v.end_txn(*dtxn, success); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
95 } |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
96 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
97 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
98 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
99 pool_unref(&ptxn->pool); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
100 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
101 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
102 static void push_notification_transaction_commit |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
103 (void *txn, struct mail_transaction_commit_changes *changes) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
104 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
105 struct push_notification_txn *ptxn = (struct push_notification_txn *)txn; |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
106 struct ioloop *prev_ioloop = current_ioloop; |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
107 |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
108 /* Make sure we're not in just any random ioloop, which could get |
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
109 destroyed soon. This way the push-notification drivers can do async |
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
110 operations that finish in the main ioloop. */ |
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
111 io_loop_set_current(main_ioloop); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
112 if (changes == NULL) { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
113 push_notification_txn_mbox_end(ptxn); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
114 } else { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
115 push_notification_txn_msg_end(ptxn, changes); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
116 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
117 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
118 push_notification_transaction_end(ptxn, TRUE); |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
119 io_loop_set_current(prev_ioloop); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
120 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
121 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
122 static void push_notification_mailbox_create(struct mailbox *box) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
123 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
124 struct push_notification_txn *ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
125 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
126 ptxn = push_notification_transaction_create(box, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
127 push_notification_trigger_mbox_create(ptxn, box, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
128 push_notification_transaction_commit(ptxn, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
129 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
130 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
131 static void push_notification_mailbox_delete(void *txn ATTR_UNUSED, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
132 struct mailbox *box) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
133 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
134 struct push_notification_txn *ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
135 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
136 ptxn = push_notification_transaction_create(box, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
137 push_notification_trigger_mbox_delete(ptxn, box, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
138 push_notification_transaction_commit(ptxn, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
139 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
140 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
141 static void push_notification_mailbox_rename(struct mailbox *src, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
142 struct mailbox *dest) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
143 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
144 struct push_notification_txn *ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
145 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
146 ptxn = push_notification_transaction_create(dest, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
147 push_notification_trigger_mbox_rename(ptxn, src, dest, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
148 push_notification_transaction_commit(ptxn, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
149 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
150 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
151 static void push_notification_mailbox_subscribe(struct mailbox *box, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
152 bool subscribed) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
153 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
154 struct push_notification_txn *ptxn; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
155 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
156 ptxn = push_notification_transaction_create(box, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
157 push_notification_trigger_mbox_subscribe(ptxn, box, subscribed, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
158 push_notification_transaction_commit(ptxn, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
159 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
160 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
161 static void push_notification_mail_save(void *txn, struct mail *mail) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
162 { |
19260
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
163 struct push_notification_txn *ptxn = txn; |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
164 |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
165 push_notification_transaction_init(ptxn); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
166 |
19260
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
167 /* POST_SESSION means MTA delivery. */ |
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
168 if (mail->box->flags & MAILBOX_FLAG_POST_SESSION) { |
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
169 push_notification_trigger_msg_save_new(ptxn, mail, NULL); |
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
170 } else { |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
171 push_notification_trigger_msg_save_append(ptxn, mail, NULL); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
172 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
173 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
174 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
175 static void push_notification_mail_copy(void *txn, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
176 struct mail *src ATTR_UNUSED, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
177 struct mail *dest) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
178 { |
19260
39ae1789ba74
push-notification: Fix distinguishing between IMAP APPEND and MTA deliveries
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19189
diff
changeset
|
179 push_notification_mail_save(txn, dest); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
180 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
181 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
182 static void push_notification_mail_expunge(void *txn, struct mail *mail) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
183 { |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
184 struct push_notification_txn *ptxn = txn; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
185 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
186 push_notification_transaction_init(ptxn); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
187 push_notification_trigger_msg_save_expunge(txn, mail, NULL); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
188 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
189 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
190 static void |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
191 push_notification_mail_update_flags(void *txn, struct mail *mail, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
192 enum mail_flags old_flags) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
193 { |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
194 struct push_notification_txn *ptxn = txn; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
195 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
196 push_notification_transaction_init(ptxn); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
197 push_notification_trigger_msg_flag_change(txn, mail, NULL, old_flags); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
198 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
199 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
200 static void |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
201 push_notification_mail_update_keywords(void *txn, struct mail *mail, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
202 const char *const *old_keywords) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
203 { |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
204 struct push_notification_txn *ptxn = txn; |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
205 |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
206 push_notification_transaction_init(ptxn); |
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
207 push_notification_trigger_msg_keyword_change(txn, mail, NULL, old_keywords); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
208 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
209 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
210 static void * |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
211 push_notification_transaction_begin(struct mailbox_transaction_context *t) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
212 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
213 return push_notification_transaction_create(mailbox_transaction_get_mailbox(t), t); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
214 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
215 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
216 static void push_notification_transaction_rollback(void *txn) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
217 { |
19263
6f86db8428e6
push-notification: On-demand initialization of transaction data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19260
diff
changeset
|
218 struct push_notification_txn *ptxn = txn; |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
219 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
220 push_notification_transaction_end(ptxn, FALSE); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
221 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
222 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
223 static void |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
224 push_notification_config_init(const char *config_name, |
19270
6c001f36f1ed
push-notification: OCD fix for lining up function parameters
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19269
diff
changeset
|
225 struct mail_user *user, |
6c001f36f1ed
push-notification: OCD fix for lining up function parameters
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19269
diff
changeset
|
226 struct push_notification_driver_list *dlist) |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
227 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
228 struct push_notification_driver_user *duser; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
229 const char *env; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
230 unsigned int i; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
231 string_t *root_name; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
232 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
233 root_name = t_str_new(32); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
234 str_append(root_name, config_name); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
235 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
236 for (i = 2;; i++) { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
237 env = mail_user_plugin_getenv(user, str_c(root_name)); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
238 if ((env == NULL) || (*env == '\0')) { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
239 break; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
240 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
241 |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
242 if (push_notification_driver_init(user, env, user->pool, &duser) < 0) { |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
243 break; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
244 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
245 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
246 // Add driver. |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
247 array_append(&dlist->drivers, &duser, 1); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
248 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
249 str_truncate(root_name, strlen(config_name)); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
250 str_printfa(root_name, "%d", i); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
251 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
252 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
253 |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
254 static struct push_notification_driver_list * |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
255 push_notification_driver_list_init(struct mail_user *user) |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
256 { |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
257 struct push_notification_driver_list *dlist; |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
258 |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
259 dlist = p_new(user->pool, struct push_notification_driver_list, 1); |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
260 p_array_init(&dlist->drivers, user->pool, 4); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
261 |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
262 push_notification_config_init(PUSH_NOTIFICATION_CONFIG, user, dlist); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
263 |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
264 if (array_is_empty(&dlist->drivers)) { |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
265 /* Support old configuration (it was available at time initial OX |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
266 * driver was first released). */ |
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
267 push_notification_config_init(PUSH_NOTIFICATION_CONFIG_OLD, user, |
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
268 dlist); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
269 } |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
270 return dlist; |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
271 } |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
272 |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
273 static void push_notification_user_deinit(struct mail_user *user) |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
274 { |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
275 struct push_notification_user *puser = PUSH_NOTIFICATION_USER_CONTEXT(user); |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
276 struct push_notification_driver_list *dlist = puser->driverlist; |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
277 struct push_notification_driver_user **duser; |
22419
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
278 struct ioloop *prev_ioloop = current_ioloop; |
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
279 |
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
280 /* Make sure we're in the main ioloop, so if the deinit/cleanup moves any |
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
281 I/Os or timeouts they won't get moved to some temporary ioloop. */ |
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
282 io_loop_set_current(main_ioloop); |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
283 |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
284 array_foreach_modifiable(&dlist->drivers, duser) { |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
285 if ((*duser)->driver->v.deinit != NULL) { |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
286 (*duser)->driver->v.deinit(*duser); |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
287 } |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
288 |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
289 if ((*duser)->driver->v.cleanup != NULL) { |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
290 (*duser)->driver->v.cleanup(); |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
291 } |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
292 } |
22419
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
293 io_loop_set_current(prev_ioloop); |
55bd9d8ca7ce
push-notification: Switch to main ioloop while calling drivers' deinit/cleanup callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22223
diff
changeset
|
294 |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
295 puser->module_ctx.super.deinit(user); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
296 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
297 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
298 static void push_notification_user_created(struct mail_user *user) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
299 { |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
300 struct mail_user_vfuncs *v = user->vlast; |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
301 struct push_notification_user *puser; |
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
302 |
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
303 puser = p_new(user->pool, struct push_notification_user, 1); |
19269
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
304 puser->module_ctx.super = *v; |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
305 user->vlast = &puser->module_ctx.super; |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
306 v->deinit = push_notification_user_deinit; |
cb7b0ad2836a
push-notification: Removed optimization to init drivers only once.
Timo Sirainen <tss@iki.fi>
parents:
19268
diff
changeset
|
307 puser->driverlist = push_notification_driver_list_init(user); |
19264
e309b27f02ea
push-notification: Improved struct naming of driver list data
Michael Slusarz <michael.slusarz@dovecot.fi>
parents:
19263
diff
changeset
|
308 |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
309 MODULE_CONTEXT_SET(user, push_notification_user_module, puser); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
310 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
311 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
312 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
313 /* Plugin interface. */ |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
314 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
315 const char *push_notification_plugin_version = DOVECOT_ABI_VERSION; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
316 const char *push_notification_plugin_dependencies[] = { "notify", NULL }; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
317 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
318 extern struct push_notification_driver push_notification_driver_dlog; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
319 extern struct push_notification_driver push_notification_driver_ox; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
320 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
321 static struct notify_context *push_notification_ctx; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
322 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
323 static const struct notify_vfuncs push_notification_vfuncs = { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
324 /* Mailbox Events */ |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
325 .mailbox_create = push_notification_mailbox_create, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
326 .mailbox_delete_commit = push_notification_mailbox_delete, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
327 .mailbox_rename = push_notification_mailbox_rename, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
328 .mailbox_set_subscribed = push_notification_mailbox_subscribe, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
329 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
330 /* Mail Events */ |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
331 .mail_copy = push_notification_mail_copy, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
332 .mail_save = push_notification_mail_save, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
333 .mail_expunge = push_notification_mail_expunge, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
334 .mail_update_flags = push_notification_mail_update_flags, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
335 .mail_update_keywords = push_notification_mail_update_keywords, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
336 .mail_transaction_begin = push_notification_transaction_begin, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
337 .mail_transaction_commit = push_notification_transaction_commit, |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
338 .mail_transaction_rollback = push_notification_transaction_rollback |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
339 }; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
340 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
341 static struct mail_storage_hooks push_notification_storage_hooks = { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
342 .mail_user_created = push_notification_user_created |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
343 }; |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
344 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
345 void push_notification_plugin_init(struct module *module) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
346 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
347 push_notification_ctx = notify_register(&push_notification_vfuncs); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
348 mail_storage_hooks_add(module, &push_notification_storage_hooks); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
349 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
350 push_notification_driver_register(&push_notification_driver_dlog); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
351 push_notification_driver_register(&push_notification_driver_ox); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
352 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
353 push_notification_event_register_rfc5423_events(); |
22223
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
354 main_ioloop = current_ioloop; |
7fa4ccc9a738
push-notification: Switch to main ioloop while calling drivers' commit callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
355 i_assert(main_ioloop != NULL); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
356 } |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
357 |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
358 void push_notification_plugin_deinit(void) |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
359 { |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
360 push_notification_driver_unregister(&push_notification_driver_dlog); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
361 push_notification_driver_unregister(&push_notification_driver_ox); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
362 |
19268
5f883bc3f380
push-notification: Free all events at plugin deinit.
Timo Sirainen <tss@iki.fi>
parents:
19264
diff
changeset
|
363 push_notification_event_unregister_rfc5423_events(); |
19189
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
364 mail_storage_hooks_remove(&push_notification_storage_hooks); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
365 notify_unregister(push_notification_ctx); |
1afdeb1cae62
Added push-notification plugin
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents:
diff
changeset
|
366 } |