From d39e48ba1808463a3f8330ace6384d66d1b48100 Mon Sep 17 00:00:00 2001 From: James Booth Date: Mon, 28 Mar 2016 01:25:48 +0100 Subject: Use one stanza handler per type (message, iq, presence) Allows plugins to stop stanza processing --- src/xmpp/roster.c | 92 +++++++++++++------------------------------------------ 1 file changed, 21 insertions(+), 71 deletions(-) (limited to 'src/xmpp/roster.c') diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c index d1371e5e..9605f611 100644 --- a/src/xmpp/roster.c +++ b/src/xmpp/roster.c @@ -62,78 +62,56 @@ #include "xmpp/xmpp.h" #include "plugins/plugins.h" -#define HANDLE(type, func) xmpp_handler_add(conn, func, XMPP_NS_ROSTER, STANZA_NAME_IQ, type, ctx) - // callback data for group commands typedef struct _group_data { char *name; char *group; } GroupData; -// event handlers -static int _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); -static int _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); - // id handlers -static int _group_add_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); -static int _group_remove_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); - -static void _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza); +static int _group_add_id_handler(xmpp_stanza_t *const stanza, void *const userdata); +static int _group_remove_id_handler(xmpp_stanza_t *const stanza, void *const userdata); // helper functions GSList* _get_groups_from_item(xmpp_stanza_t *item); -void -roster_add_handlers(void) -{ - xmpp_conn_t * const conn = connection_get_conn(); - xmpp_ctx_t * const ctx = connection_get_ctx(); - - HANDLE(STANZA_TYPE_SET, _roster_set_handler); - HANDLE(STANZA_TYPE_RESULT, _roster_result_handler); -} - void roster_request(void) { - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_roster_iq(ctx); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); } void roster_send_add_new(const char *const barejid, const char *const name) { - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); char *id = create_unique_id("roster"); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, name, NULL); free(id); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); } void roster_send_remove(const char *const barejid) { - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_roster_remove_set(ctx, barejid); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); } void roster_send_name_change(const char *const barejid, const char *const new_name, GSList *groups) { - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); char *id = create_unique_id("roster"); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, new_name, groups); free(id); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); } @@ -158,22 +136,18 @@ roster_send_add_to_group(const char *const group, PContact contact) data->name = strdup(p_contact_barejid(contact)); } - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); - xmpp_id_handler_add(conn, _group_add_id_handler, unique_id, data); + id_handler_add(unique_id, _group_add_id_handler, data); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact), p_contact_name(contact), new_groups); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); free(unique_id); } static int -_group_add_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, - void *const userdata) +_group_add_id_handler(xmpp_stanza_t *const stanza, void *const userdata) { - log_debug("iq stanza group add id handler fired"); - if (userdata) { GroupData *data = userdata; ui_group_added(data->name, data->group); @@ -196,7 +170,6 @@ roster_send_remove_from_group(const char *const group, PContact contact) groups = g_slist_next(groups); } - xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); // add an id handler to handle the response @@ -209,20 +182,17 @@ roster_send_remove_from_group(const char *const group, PContact contact) data->name = strdup(p_contact_barejid(contact)); } - xmpp_id_handler_add(conn, _group_remove_id_handler, unique_id, data); + id_handler_add(unique_id, _group_remove_id_handler, data); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact), p_contact_name(contact), new_groups); - _send_iq_stanza(conn, iq); + send_iq_stanza(iq); xmpp_stanza_release(iq); free(unique_id); } static int -_group_remove_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, - void *const userdata) +_group_remove_id_handler(xmpp_stanza_t *const stanza, void *const userdata) { - log_debug("iq stanza group remove id handler fired"); - if (userdata) { GroupData *data = userdata; ui_group_removed(data->name, data->group); @@ -233,19 +203,16 @@ _group_remove_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, return 0; } -static int -_roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, - void *const userdata) +void +roster_set_handler(xmpp_stanza_t *const stanza) { - log_debug("iq stanza roster set handler fired"); - xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY); xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(query, STANZA_NAME_ITEM); if (item == NULL) { - return 1; + return; } // if from attribute exists and it is not current users barejid, ignore push @@ -253,7 +220,7 @@ _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); if (from && (strcmp(from, my_jid->barejid) != 0)) { jid_destroy(my_jid); - return 1; + return; } jid_destroy(my_jid); @@ -302,18 +269,16 @@ _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, g_free(barejid_lower); - return 1; + return; } -static int -_roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata) +void +roster_result_handler(xmpp_stanza_t *const stanza) { - log_debug("iq stanza roster result handler fired"); - const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID); if (g_strcmp0(id, "roster") != 0) { - return 1; + return; } // handle initial roster response @@ -348,7 +313,7 @@ _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi sv_ev_roster_received(); - return 1; + return; } GSList* @@ -369,18 +334,3 @@ _get_groups_from_item(xmpp_stanza_t *item) return groups; } - -static void -_send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza) -{ - char *text; - size_t text_size; - xmpp_stanza_to_text(stanza, &text, &text_size); - - char *plugin_text = plugins_on_iq_stanza_send(text); - if (plugin_text) { - xmpp_send_raw_string(conn, "%s", plugin_text); - } else { - xmpp_send_raw_string(conn, "%s", text); - } -} -- cgit 1.4.1-2-gfad0