Added stanza send hooks for plugins

This commit is contained in:
James Booth
2016-03-26 15:50:16 +00:00
parent ce9b0836a0
commit d0397f3da5
11 changed files with 396 additions and 58 deletions

View File

@@ -59,6 +59,7 @@
#include "xmpp/connection.h"
#include "xmpp/stanza.h"
#include "xmpp/xmpp.h"
#include "plugins/plugins.h"
static Autocomplete sub_requests_ac;
@@ -75,6 +76,9 @@ static int _presence_error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const
void _send_caps_request(char *node, char *caps_key, char *id, char *from);
static void _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence);
static void _send_presence_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
static void _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
void
presence_sub_requests_init(void)
{
@@ -134,7 +138,7 @@ presence_subscription(const char *const jid, const jabber_subscr_t action)
xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
xmpp_stanza_set_type(presence, type);
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, jidp->barejid);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
xmpp_stanza_release(presence);
jid_destroy(jidp);
@@ -239,7 +243,7 @@ presence_send(const resource_presence_t presence_type, const char *const msg, co
stanza_attach_last_activity(ctx, presence, idle);
}
stanza_attach_caps(ctx, presence);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
_send_room_presence(conn, presence);
xmpp_stanza_release(presence);
@@ -269,7 +273,7 @@ _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence)
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
log_debug("Sending presence to room: %s", full_room_jid);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
free(full_room_jid);
}
@@ -302,7 +306,7 @@ presence_join_room(char *room, char *nick, char * passwd)
stanza_attach_priority(ctx, presence, pri);
stanza_attach_caps(ctx, presence);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
xmpp_stanza_release(presence);
jid_destroy(jid);
@@ -332,7 +336,7 @@ presence_change_room_nick(const char *const room, const char *const nick)
stanza_attach_priority(ctx, presence, pri);
stanza_attach_caps(ctx, presence);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
xmpp_stanza_release(presence);
free(full_room_jid);
@@ -351,7 +355,7 @@ presence_leave_chat_room(const char *const room_jid)
if (nick) {
xmpp_stanza_t *presence = stanza_create_room_leave_presence(ctx, room_jid,
nick);
xmpp_send(conn, presence);
_send_presence_stanza(conn, presence);
xmpp_stanza_release(presence);
}
}
@@ -649,7 +653,7 @@ _send_caps_request(char *node, char *caps_key, char *id, char *from)
if (!caps_contains(caps_key)) {
log_debug("Capabilities not cached for '%s', sending discovery IQ.", from);
xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, from, node);
xmpp_send(conn, iq);
_send_iq_stanza(conn, iq);
xmpp_stanza_release(iq);
} else {
log_debug("Capabilities already cached, for %s", caps_key);
@@ -811,3 +815,33 @@ _muc_user_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *co
return 1;
}
static void
_send_presence_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_presence_stanza_send(text);
if (plugin_text) {
xmpp_send_raw(conn, plugin_text, strlen(plugin_text));
} else {
xmpp_send_raw(conn, text, text_size);
}
}
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(conn, plugin_text, strlen(plugin_text));
} else {
xmpp_send_raw(conn, text, text_size);
}
}