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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }