diff options
Diffstat (limited to 'src/plugins/push-notification/push-notification-events.c')
-rw-r--r-- | src/plugins/push-notification/push-notification-events.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/plugins/push-notification/push-notification-events.c b/src/plugins/push-notification/push-notification-events.c new file mode 100644 index 0000000..a71e8a6 --- /dev/null +++ b/src/plugins/push-notification/push-notification-events.c @@ -0,0 +1,100 @@ +/* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "array.h" + +#include "push-notification-drivers.h" +#include "push-notification-events.h" + +ARRAY_TYPE(push_notification_event) push_notification_events; + +ARRAY_TYPE(push_notification_event) *push_notification_get_events(void) +{ + return &push_notification_events; +} + +static bool +push_notification_event_find(const char *name, unsigned int *idx_r) +{ + unsigned int count, i; + const struct push_notification_event *const *events; + + events = array_get(&push_notification_events, &count); + for (i = 0; i < count; i++) { + if (strcasecmp(events[i]->name, name) == 0) { + *idx_r = i; + return TRUE; + } + } + + return FALSE; +} + +static const struct push_notification_event * +push_notification_event_find_class(const char *driver) +{ + unsigned int idx; + + if (!push_notification_event_find(driver, &idx)) + return NULL; + + return array_idx_elem(&push_notification_events, idx); +} + +void push_notification_event_init(struct push_notification_driver_txn *dtxn, + const char *event_name, void *config) +{ + const struct push_notification_event *event; + struct push_notification_event_config *ec; + + if (!array_is_created(&dtxn->ptxn->events)) + p_array_init(&dtxn->ptxn->events, dtxn->ptxn->pool, 4); + + event = push_notification_event_find_class(event_name); + if (event != NULL) { + if ((config == NULL) && (event->init.default_config != NULL)) { + config = event->init.default_config(); + } + + ec = p_new(dtxn->ptxn->pool, + struct push_notification_event_config, 1); + ec->config = config; + ec->event = event; + + array_push_back(&dtxn->ptxn->events, &ec); + } +} + +void push_notification_event_register( + const struct push_notification_event *event) +{ + unsigned int idx; + + if (!array_is_created(&push_notification_events)) + i_array_init(&push_notification_events, 16); + + if (push_notification_event_find(event->name, &idx)) { + i_panic("push_notification_event_register(%s): duplicate event", + event->name); + } + + array_push_back(&push_notification_events, &event); +} + +void push_notification_event_unregister( + const struct push_notification_event *event) +{ + unsigned int idx; + + if (!push_notification_event_find(event->name, &idx)) { + i_panic("push_notification_event_register(%s): unknown event", + event->name); + } + + if (array_is_created(&push_notification_events)) { + array_delete(&push_notification_events, idx, 1); + + if (array_is_empty(&push_notification_events)) + array_free(&push_notification_events); + } +} |