/soc/2015/koosha/main: db5b4c0dfb74: Send acks to server when re...

Koosha Khajehmoogahi <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: db5b4c0dfb74dc93dbffd1432563ffb8de3ee2f9
Author:	 Koosha Khajehmoogahi <[email protected]>
Date:	 2015-08-10 16:04 +0200
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/koosha/main/rev/db5b4c0dfb74

Description:

Send acks to server when receiving requests for acks

diffstat:

 libpurple/protocols/jabber/jabber.c |  31 ++++++++++++++++++++++++++++++-
 libpurple/protocols/jabber/jabber.h |   3 +++
 2 files changed, 33 insertions(+), 1 deletions(-)

diffs (83 lines):

diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -392,6 +392,18 @@ void jabber_process_packet(JabberStream 
 	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 @@ void jabber_process_packet(JabberStream 
 				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 @@ void jabber_send_signal_cb(PurpleConnect
 	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 @@ jabber_stream_new(PurpleAccount *account
 	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;
diff --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h
--- a/libpurple/protocols/jabber/jabber.h
+++ b/libpurple/protocols/jabber/jabber.h
@@ -195,6 +195,8 @@ struct _JabberStream
 	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_features_parse(Jabber
 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);

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.