diff --git a/include/asterisk/event.h b/include/asterisk/event.h index 2febeb3f75027d9affe1bd6cb7600944202d86d0..767ef1cee2013c5d21d19b1e21557a730e96182e 100644 --- a/include/asterisk/event.h +++ b/include/asterisk/event.h @@ -413,4 +413,61 @@ const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_i */ enum ast_event_type ast_event_get_type(const struct ast_event *event); +/*! + * \brief Initialize an event iterator instance + * + * \param iterator The iterator instance to initialize + * \param event The event that will be iterated through + * + * \return Nothing + */ +void ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event); + +/*! + * \brief Move iterator instance to next IE + * + * \param iterator The iterator instance + * + * \retval 0 on success + * \retval -1 if end is reached + */ +int ast_event_iterator_next(struct ast_event_iterator *iterator); + +/*! + * \brief Get the type of the current IE in the iterator instance + * + * \param iterator The iterator instance + * + * \return the ie type as represented by one of the value sin the + * ast_event_ie_type enum + */ +enum ast_event_ie_type ast_event_iterator_get_ie_type(struct ast_event_iterator *iterator); + +/*! + * \brief Get the value of the current IE in the ierator as an integer payload + * + * \param iterator The iterator instance + * + * \return This returns the payload of the information element as a uint. + */ +uint32_t ast_event_iteragor_get_ie_uint(struct ast_event_iterator *iterator); + +/*! + * \brief Get the value of the current IE in the iterator as a string payload + * + * \param iterator The iterator instance + * + * \return This returns the payload of the information element as a string. + */ +const char *ast_event_iterator_get_ie_str(struct ast_event_iterator *iterator); + +/*! + * \brief Get the value of the current IE in the iterator instance that has a raw payload + * + * \param iterator The iterator instance + * + * \return This returns the payload of the information element as type raw. + */ +void *ast_event_iterator_get_ie_raw(struct ast_event_iterator *iterator); + #endif /* AST_EVENT_H */ diff --git a/include/asterisk/event_defs.h b/include/asterisk/event_defs.h index 9aadaebf6029b55bddbe3b5d20e7efd9886b8203..b664ac14b9bf5177277ecf196bd8f98a38cdca1f 100644 --- a/include/asterisk/event_defs.h +++ b/include/asterisk/event_defs.h @@ -138,5 +138,6 @@ enum ast_event_subscriber_res { struct ast_event; struct ast_event_ie; struct ast_event_sub; +struct ast_event_iterator; #endif /* AST_EVENT_DEFS_H */ diff --git a/main/event.c b/main/event.c index 58515e007e96d60130e3d4dacc63a6c573aa918e..d7deede5147c8ca765c1e780a638679b94a8453e 100644 --- a/main/event.c +++ b/main/event.c @@ -66,6 +66,12 @@ struct ast_event_ref { AST_LIST_ENTRY(ast_event_ref) entry; }; +struct ast_event_iterator { + uint16_t event_len; + const struct ast_event *event; + struct ast_event_ie *ie; +}; + /*! \brief data shared between event dispatching threads */ static struct { ast_cond_t cond; @@ -355,6 +361,40 @@ void ast_event_unsubscribe(struct ast_event_sub *sub) ast_event_sub_destroy(sub); } +void ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event) +{ + iterator->event_len = ntohs(event->event_len); + iterator->event = event; + iterator->ie = ((void *) event) + sizeof(*event); + return; +} + +int ast_event_iterator_next(struct ast_event_iterator *iterator) +{ + iterator->ie = ((void *) iterator->ie) + sizeof(*iterator->ie) + ntohs(iterator->ie->ie_payload_len); + return ((iterator->event_len > (((void *) iterator->ie) - ((void *) iterator->event))) ? -1 : 0); +} + +enum ast_event_ie_type ast_event_iterator_get_ie_type(struct ast_event_iterator *iterator) +{ + return iterator->ie->ie_type; +} + +uint32_t ast_event_iteragor_get_ie_uint(struct ast_event_iterator *iterator) +{ + return ntohl(*iterator->ie->ie_payload); +} + +const char *ast_event_iterator_get_ie_str(struct ast_event_iterator *iterator) +{ + return (const char*)iterator->ie->ie_payload; +} + +void *ast_event_iterator_get_ie_raw(struct ast_event_iterator *iterator) +{ + return iterator->ie->ie_payload; +} + enum ast_event_type ast_event_get_type(const struct ast_event *event) { return ntohs(event->type); @@ -376,18 +416,11 @@ const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_i const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type) { - struct ast_event_ie *ie; - uint16_t event_len; - - ie_type = ntohs(ie_type); - event_len = ntohs(event->event_len); - - ie = ((void *) event) + sizeof(*event); + struct ast_event_iterator iterator; - while ((((void *) ie) - ((void *) event)) < event_len) { - if (ie->ie_type == ie_type) - return ie->ie_payload; - ie = ((void *) ie) + sizeof(*ie) + ntohs(ie->ie_payload_len); + for (ast_event_iterator_init(&iterator, event); !ast_event_iterator_next(&iterator); ) { + if (ast_event_iterator_get_ie_type(&iterator) == ie_type) + return ast_event_iterator_get_ie_raw(&iterator); } return NULL;