--- a/libpurple/protocols/jabber/jabber.c Mon Aug 10 02:00:17 2015 +0200
+++ b/libpurple/protocols/jabber/jabber.c Mon Aug 10 16:04:05 2015 +0200
@@ -392,6 +392,18 @@
xmlns = purple_xmlnode_get_namespace(*packet);
+ /* Count received stanzas to include when acking + * via <a/> (stream management) to the server */ + if (purple_strequal(name, "iq") || + purple_strequal(name, "presence") || + purple_strequal(name, "message")) + if (G_MAXUINT32 == js->stanzas_recvd) if (purple_strequal(name, "iq")) {
jabber_iq_parse(js, *packet);
} else if (purple_strequal(name, "presence")) {
@@ -424,8 +436,10 @@
/* TODO: Handle <failure/>, I guess? */
+ } else if (purple_strequal(name, "r") && purple_strequal(xmlns, NS_XMPP_SM)) { + jabber_send_stream_ack(js); - purple_debug_warning("jabber", "Unknown packet: %s\n", (*packet)->name);
+ purple_debug_warning("jabber", "Unknown packet: %s\n", name); @@ -667,6 +681,20 @@
+void jabber_send_stream_ack(JabberStream *js) + PurpleXmlNode *ack = purple_xmlnode_new("a"); + gchar *h = g_strdup_printf("%d", js->stanzas_recvd); + purple_xmlnode_set_attrib(ack, "h", h); + purple_xmlnode_set_namespace(ack, NS_XMPP_SM); + purple_debug_info("jabber", "Sending ack (<a/>) with h='%d'\n", js->stanzas_recvd); + purple_xmlnode_free(ack); void jabber_send(JabberStream *js, PurpleXmlNode *packet)
purple_signal_emit(purple_connection_get_protocol(js->gc), "jabber-sending-xmlnode", js->gc, &packet);
@@ -1049,6 +1077,7 @@
js->protocol_version.major = 1;
js->protocol_version.minor = 0;
--- a/libpurple/protocols/jabber/jabber.h Mon Aug 10 02:00:17 2015 +0200
+++ b/libpurple/protocols/jabber/jabber.h Mon Aug 10 16:04:05 2015 +0200
@@ -195,6 +195,8 @@
/** When we last pinged the server, so we don't ping more
* often than once every minute.
@@ -345,6 +347,7 @@
void jabber_stream_management_parse(JabberStream *js, PurpleXmlNode *packet);
void jabber_process_packet(JabberStream *js, PurpleXmlNode **packet);
void jabber_send(JabberStream *js, PurpleXmlNode *data);
+void jabber_send_stream_ack(JabberStream *js); void jabber_send_raw(JabberStream *js, const char *data, int len);
void jabber_send_signal_cb(PurpleConnection *pc, PurpleXmlNode **packet,