Add API calls for iterating through an event. This should allow events to have multip...
[asterisk/asterisk.git] / main / event.c
index 58515e0..d7deede 100644 (file)
@@ -66,6 +66,12 @@ struct ast_event_ref {
        AST_LIST_ENTRY(ast_event_ref) entry;
 };
 
        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;
 /*! \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);
 }
 
        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);
 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)
 {
 
 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;
        }
 
        return NULL;