/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