From 9454c8f29a3e40ff539349e631549a36aac0a34c Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Thu, 3 Jul 2008 02:46:24 +0000 Subject: [PATCH] Replace last patch with new patch that does same thing better. This new method adds xmpp_stanza_get_child_by_ns() to the API. Implementation and copyright assigned to us by Matthew Wild . --- src/handler.c | 2 +- src/stanza.c | 26 ++++++++++++++++++++++++++ strophe.h | 2 ++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/handler.c b/src/handler.c index 98704b0..7a1ec8a 100644 --- a/src/handler.c +++ b/src/handler.c @@ -127,7 +127,7 @@ void handler_fire_stanza(xmpp_conn_t * const conn, } if ((!item->ns || (ns && strcmp(ns, item->ns) == 0) || - _match_children(stanza, item->ns)) && + xmpp_stanza_get_child_by_ns(stanza, item->ns)) && (!item->name || (name && strcmp(name, item->name) == 0)) && (!item->type || (type && strcmp(type, item->type) == 0))) if (!((xmpp_handler)(item->handler))(conn, stanza, item->userdata)) { diff --git a/src/stanza.c b/src/stanza.c index fa7332f..2a36b6e 100644 --- a/src/stanza.c +++ b/src/stanza.c @@ -706,6 +706,32 @@ xmpp_stanza_t *xmpp_stanza_get_child_by_name(xmpp_stanza_t * const stanza, return child; } +/** Get the first child of a stanza with a given namespace. + * This function searches all the immediate children of a stanza for a child + * stanza that matches the namespace provided. The first matching child + * is returned. + * + * @param stanza a Strophe stanza object + * @param ns a string with the namespace to match + * + * @return the matching child stanza object or NULL if no match was found + * + * @ingroup Stanza + */ +xmpp_stanza_t *xmpp_stanza_get_child_by_ns(xmpp_stanza_t * const stanza, + const char * const ns) +{ + xmpp_stanza_t *child; + + for (child = stanza->children; child; child = child->next) { + if (xmpp_stanza_get_ns(child) && + strcmp(ns, xmpp_stanza_get_ns(child)) == 0) + break; + } + + return child; +} + /** Get the list of children. * This function returns the first child of the stanza object. The rest * of the children can be obtained by calling xmpp_stanza_get_next() to diff --git a/strophe.h b/strophe.h index 290c4f1..d89eed5 100644 --- a/strophe.h +++ b/strophe.h @@ -293,6 +293,8 @@ int xmpp_stanza_to_text(xmpp_stanza_t *stanza, xmpp_stanza_t *xmpp_stanza_get_children(xmpp_stanza_t * const stanza); xmpp_stanza_t *xmpp_stanza_get_child_by_name(xmpp_stanza_t * const stanza, const char * const name); +xmpp_stanza_t *xmpp_stanza_get_child_by_ns(xmpp_stanza_t * const stanza, + const char * const ns); xmpp_stanza_t *xmpp_stanza_get_next(xmpp_stanza_t * const stanza); char *xmpp_stanza_get_attribute(xmpp_stanza_t * const stanza, const char * const name);