summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2007-08-29 15:19:11 +0000
committerJoshua Colp <jcolp@digium.com>2007-08-29 15:19:11 +0000
commit2351d789fddd09f6bea6df2e3ac34df7bf8c1949 (patch)
treea15fa3b222a64edeaaad1e833880ca302cbb2654 /main
parentf9d5c43b872f216c12be1e701de2c992a4131493 (diff)
Add API calls for iterating through an event. This should allow events to have multiple information elements (while there was nothing preventing it before you could not actually access any except the first one).
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@81334 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/event.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/main/event.c b/main/event.c
index 58515e007..d7deede51 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;