grim/pidgin

db5b4c0dfb74
Parents b1a13e0b7296
Children 5f0f9375f8cc
Send acks to server when receiving requests for acks
--- 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 @@
name = (*packet)->name;
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)
+ js->stanzas_recvd = 0;
+ else
+ js->stanzas_recvd++;
+ }
+
if (purple_strequal(name, "iq")) {
jabber_iq_parse(js, *packet);
} else if (purple_strequal(name, "presence")) {
@@ -424,8 +436,10 @@
tls_init(js);
/* TODO: Handle <failure/>, I guess? */
}
+ } else if (purple_strequal(name, "r") && purple_strequal(xmlns, NS_XMPP_SM)) {
+ jabber_send_stream_ack(js);
} else {
- purple_debug_warning("jabber", "Unknown packet: %s\n", (*packet)->name);
+ purple_debug_warning("jabber", "Unknown packet: %s\n", name);
}
}
@@ -667,6 +681,20 @@
g_free(txt);
}
+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);
+
+ jabber_send(js, ack);
+ g_free(h);
+ 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;
js->sessions = NULL;
+ js->stanzas_recvd = 0;
js->stun_ip = NULL;
js->stun_port = 0;
js->stun_query = NULL;
--- 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 @@
time_t idle;
time_t old_idle;
+ guint32 stanzas_recvd;
+
/** 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,
gpointer unused);