dovecot-2.2: push-notification: On-demand initialization of tran...

dovecot at dovecot.org dovecot at dovecot.org
Thu Oct 1 09:28:32 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/6f86db8428e6
changeset: 19263:6f86db8428e6
user:      Michael Slusarz <michael.slusarz at dovecot.fi>
date:      Wed Sep 30 17:59:07 2015 -0600
description:
push-notification: On-demand initialization of transaction data

diffstat:

 src/plugins/push-notification/push-notification-drivers.h |   1 +
 src/plugins/push-notification/push-notification-plugin.c  |  81 +++++++++-----
 2 files changed, 53 insertions(+), 29 deletions(-)

diffs (153 lines):

diff -r fe5890ba0618 -r 6f86db8428e6 src/plugins/push-notification/push-notification-drivers.h
--- a/src/plugins/push-notification/push-notification-drivers.h	Wed Sep 30 17:49:24 2015 -0600
+++ b/src/plugins/push-notification/push-notification-drivers.h	Wed Sep 30 17:59:07 2015 -0600
@@ -85,6 +85,7 @@
     struct mailbox *mbox;
     struct mail_user *muser;
     struct push_notification_user *puser;
+    bool initialized;
 
     enum push_notification_event_trigger trigger;
     struct push_notification_trigger_ctx *trigger_ctx;
diff -r fe5890ba0618 -r 6f86db8428e6 src/plugins/push-notification/push-notification-plugin.c
--- a/src/plugins/push-notification/push-notification-plugin.c	Wed Sep 30 17:49:24 2015 -0600
+++ b/src/plugins/push-notification/push-notification-plugin.c	Wed Sep 30 17:59:07 2015 -0600
@@ -29,12 +29,42 @@
 static struct push_notification_user *puser = NULL;
 
 
+static void
+push_notification_transaction_init(struct push_notification_txn *ptxn)
+{
+    struct push_notification_driver_txn *dtxn;
+    struct push_notification_driver_user **duser;
+    struct mail_storage *storage;
+
+    if (ptxn->initialized) {
+        return;
+    }
+
+    ptxn->initialized = TRUE;
+
+    storage = mailbox_get_storage(ptxn->mbox);
+    if (storage->user->autocreated &&
+        (strcmp(storage->name, "raw") == 0)) {
+        /* no notifications for autocreated raw users */
+        return;
+    }
+
+    array_foreach_modifiable(&ptxn->puser->drivers, duser) {
+        dtxn = p_new(ptxn->pool, struct push_notification_driver_txn, 1);
+        dtxn->duser = *duser;
+        dtxn->ptxn = ptxn;
+
+        if ((dtxn->duser->driver->v.begin_txn == NULL) ||
+            dtxn->duser->driver->v.begin_txn(dtxn)) {
+            array_append(&ptxn->drivers, &dtxn, 1);
+        }
+    }
+}
+
 static struct push_notification_txn *
 push_notification_transaction_create(struct mailbox *box,
                                      struct mailbox_transaction_context *t)
 {
-    struct push_notification_driver_txn *dtxn;
-    struct push_notification_driver_user **duser;
     pool_t pool;
     struct push_notification_txn *ptxn;
     struct mail_storage *storage;
@@ -52,23 +82,6 @@
 
     p_array_init(&ptxn->drivers, pool, 4);
 
-    if (storage->user->autocreated &&
-        (strcmp(storage->name, "raw") == 0)) {
-        /* no notifications for autocreated raw users */
-        return ptxn;
-    }
-
-    array_foreach_modifiable(&ptxn->puser->drivers, duser) {
-        dtxn = p_new(pool, struct push_notification_driver_txn, 1);
-        dtxn->duser = *duser;
-        dtxn->ptxn = ptxn;
-
-        if ((dtxn->duser->driver->v.begin_txn == NULL) ||
-            dtxn->duser->driver->v.begin_txn(dtxn)) {
-            array_append(&ptxn->drivers, &dtxn, 1);
-        }
-    }
-
     return ptxn;
 }
 
@@ -77,9 +90,11 @@
 {
     struct push_notification_driver_txn **dtxn;
 
-    array_foreach_modifiable(&ptxn->drivers, dtxn) {
-        if ((*dtxn)->duser->driver->v.end_txn != NULL) {
-            (*dtxn)->duser->driver->v.end_txn(*dtxn, success);
+    if (ptxn->initialized) {
+        array_foreach_modifiable(&ptxn->drivers, dtxn) {
+            if ((*dtxn)->duser->driver->v.end_txn != NULL) {
+                (*dtxn)->duser->driver->v.end_txn(*dtxn, success);
+            }
         }
     }
 
@@ -143,6 +158,8 @@
 {
     struct push_notification_txn *ptxn = txn;
 
+    push_notification_transaction_init(ptxn);
+
     /* POST_SESSION means MTA delivery. */
     if (mail->box->flags & MAILBOX_FLAG_POST_SESSION) {
         push_notification_trigger_msg_save_new(ptxn, mail, NULL);
@@ -160,24 +177,30 @@
 
 static void push_notification_mail_expunge(void *txn, struct mail *mail)
 {
-    push_notification_trigger_msg_save_expunge(
-            (struct push_notification_txn *)txn, mail, NULL);
+    struct push_notification_txn *ptxn = txn;
+
+    push_notification_transaction_init(ptxn);
+    push_notification_trigger_msg_save_expunge(txn, mail, NULL);
 }
 
 static void
 push_notification_mail_update_flags(void *txn, struct mail *mail,
                                     enum mail_flags old_flags)
 {
-    push_notification_trigger_msg_flag_change(
-            (struct push_notification_txn *) txn, mail, NULL, old_flags);
+    struct push_notification_txn *ptxn = txn;
+
+    push_notification_transaction_init(ptxn);
+    push_notification_trigger_msg_flag_change(txn, mail, NULL, old_flags);
 }
 
 static void
 push_notification_mail_update_keywords(void *txn, struct mail *mail,
                                        const char *const *old_keywords)
 {
-    push_notification_trigger_msg_keyword_change(
-            (struct push_notification_txn *) txn, mail, NULL, old_keywords);
+    struct push_notification_txn *ptxn = txn;
+
+    push_notification_transaction_init(ptxn);
+    push_notification_trigger_msg_keyword_change(txn, mail, NULL, old_keywords);
 }
 
 static void *
@@ -188,7 +211,7 @@
 
 static void push_notification_transaction_rollback(void *txn)
 {
-    struct push_notification_txn *ptxn = (struct push_notification_txn *)txn;
+    struct push_notification_txn *ptxn = txn;
 
     push_notification_transaction_end(ptxn, FALSE);
 }


More information about the dovecot-cvs mailing list