# HG changeset patch # User Paul Aurich # Date 1244011525 0 # Node ID d31af94a715db5ab25aa027f24a5d747af2e0302 # Parent 8502d69e45ed9bc642585bdf00651683c928af68 Use the jabber-sending-xmlnode signal to send all XMPP stanzas. Allows plugins to send stanzas instead of stringifying+send_raw; allows other plugins to see the sending stanzas. This may be a little hacky; I'm on the fence. diff -r 8502d69e45ed -r d31af94a715d ChangeLog.API --- a/ChangeLog.API Wed Jun 03 06:03:22 2009 +0000 +++ b/ChangeLog.API Wed Jun 03 06:45:25 2009 +0000 @@ -16,6 +16,9 @@ * blist-node-added and blist-node-removed signals (see blist-signals.dox) * Jabber plugin signals (see jabber-signals.dox) + * Plugins may now emit the jabber-sending-xmlnode signal in order + to send stanzas; this method is preferred to the prpl send_raw + function as other plugins listening to the signal see them. * purple_buddy_destroy * purple_buddy_get_protocol_data * purple_buddy_set_protocol_data diff -r 8502d69e45ed -r d31af94a715d libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Wed Jun 03 06:03:22 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Wed Jun 03 06:45:25 2009 +0000 @@ -449,22 +449,25 @@ return len; } -void jabber_send(JabberStream *js, xmlnode *packet) +void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet, + gpointer unused) { char *txt; int len; - purple_signal_emit(jabber_plugin, "jabber-sending-xmlnode", js->gc, &packet); - - /* if we get NULL back, we're done processing */ - if(NULL == packet) + if (NULL == packet) return; - txt = xmlnode_to_str(packet, &len); - jabber_send_raw(js, txt, len); + txt = xmlnode_to_str(*packet, &len); + jabber_send_raw(purple_connection_get_protocol_data(pc), txt, len); g_free(txt); } +void jabber_send(JabberStream *js, xmlnode *packet) +{ + purple_signal_emit(jabber_plugin, "jabber-sending-xmlnode", js->gc, &packet); +} + static gboolean jabber_keepalive_timeout(PurpleConnection *gc) { JabberStream *js = gc->proto_data; diff -r 8502d69e45ed -r d31af94a715d libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Wed Jun 03 06:03:22 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Wed Jun 03 06:45:25 2009 +0000 @@ -302,6 +302,8 @@ void jabber_process_packet(JabberStream *js, xmlnode **packet); void jabber_send(JabberStream *js, xmlnode *data); void jabber_send_raw(JabberStream *js, const char *data, int len); +void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet, + gpointer unused); void jabber_stream_set_state(JabberStream *js, JabberStreamState state); diff -r 8502d69e45ed -r d31af94a715d libpurple/protocols/jabber/libxmpp.c --- a/libpurple/protocols/jabber/libxmpp.c Wed Jun 03 06:03:22 2009 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Wed Jun 03 06:45:25 2009 +0000 @@ -137,6 +137,14 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); + /* + * Do not remove this or the plugin will fail. Completely. You have been + * warned! + */ + purple_signal_connect_priority(plugin, "jabber-sending-xmlnode", + plugin, PURPLE_CALLBACK(jabber_send_signal_cb), + NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST); + purple_signal_register(plugin, "jabber-sending-text", purple_marshal_VOID__POINTER_POINTER, NULL, 2, purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),