(array_is_created(&(t)->updates) && array_count(&(t)->updates) > 0) || \
(t)->index_deleted || (t)->index_undeleted)
-extern void (*hook_mail_index_transaction_created)
- (struct mail_index_transaction *t);
+typedef void hook_mail_index_transaction_created_t(struct mail_index_transaction *t);
+
+void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook);
+void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook);
struct mail_index_record *
mail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq);
#include "mail-transaction-log-private.h"
#include "mail-index-transaction-private.h"
+static ARRAY(const hook_mail_index_transaction_created_t *)
+ hook_mail_index_transaction_created;
+
+void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook)
+{
+ if (!array_is_created(&hook_mail_index_transaction_created))
+ i_array_init(&hook_mail_index_transaction_created, 8);
+ array_append(&hook_mail_index_transaction_created, &hook, 1);
+}
+
+void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook)
+{
+ unsigned int idx;
+ bool found = FALSE;
+
+ i_assert(array_is_created(&hook_mail_index_transaction_created));
+ for(idx = 0; idx < array_count(&hook_mail_index_transaction_created); idx++) {
+ const hook_mail_index_transaction_created_t *const *hook_ptr =
+ array_idx(&hook_mail_index_transaction_created, idx);
+ if (*hook_ptr == hook) {
+ array_delete(&hook_mail_index_transaction_created, idx, 1);
+ found = TRUE;
+ break;
+ }
+ }
+ i_assert(found == TRUE);
+ if (array_count(&hook_mail_index_transaction_created) == 0)
+ array_free(&hook_mail_index_transaction_created);
+}
-void (*hook_mail_index_transaction_created)
- (struct mail_index_transaction *t) = NULL;
struct mail_index_view *
mail_index_transaction_get_view(struct mail_index_transaction *t)
I_MIN(5, mail_index_module_register.id));
DLLIST_PREPEND(&view->transactions_list, t);
- if (hook_mail_index_transaction_created != NULL)
- hook_mail_index_transaction_created(t);
+ if (array_is_created(&hook_mail_index_transaction_created)) {
+ const hook_mail_index_transaction_created_t *const *ptr;
+ array_foreach(&hook_mail_index_transaction_created, ptr) {
+ (*ptr)(t);
+ }
+ }
return t;
}