/soc/2015/koosha/main: c10fa2e7a6ba: XEP-0198: initial parser fo...
Koosha Khajehmoogahi <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: c10fa2e7a6bab5b1fe521e83a471e5387af48320 Author: Koosha Khajehmoogahi <[email protected]> Date: 2015-08-10 01:26 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/koosha/main/rev/c10fa2e7a6ba Description: XEP-0198: initial parser for <enabled> packets diffstat: libpurple/protocols/jabber/jabber.c | 38 +++++++++++++++++++++++++++++++++++++ libpurple/protocols/jabber/jabber.h | 1 + 2 files changed, 39 insertions(+), 0 deletions(-) diffs (80 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 @@ -138,6 +138,7 @@ jabber_session_initialized_cb(JabberStre static void jabber_session_init(JabberStream *js) { + char *sm; JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET); PurpleXmlNode *session; @@ -147,6 +148,13 @@ static void jabber_session_init(JabberSt purple_xmlnode_set_namespace(session, NS_XMPP_SESSION); jabber_iq_send(iq); + + /* Enable stream management with resumptions */ + if (js->server_caps & JABBER_CAP_SM) { + sm = g_strdup_printf("<enable xmlns='" NS_XMPP_SM "' resume='true' />"); + jabber_send_raw(js, sm, -1); + g_free(sm); + } } static void jabber_bind_result_cb(JabberStream *js, const char *from, @@ -340,6 +348,34 @@ static void jabber_stream_handle_error(J g_free(msg); } +/* + * TODO: parse the 'location' attribute as well + */ +void jabber_stream_management_parse(JabberStream *js, PurpleXmlNode *packet) +{ + const char *resume, *id, *max; + PurpleAccount *account; + gboolean resume_enabled; + resume = purple_xmlnode_get_attrib(packet, "resume"); + account = purple_connection_get_account(js->gc); + + resume_enabled = resume && (purple_strequal(resume, "1") || purple_strequal(resume, "true")); + + purple_debug_info( "jabber", "Stream management %s resumption is enabled.\n", + resume_enabled ? "with" : "without" ); + + if (resume_enabled) { + id = purple_xmlnode_get_attrib(packet, "id"); + purple_account_set_string(account, "sm_id", id); + + /* max means the maximum possible resumption time in seconds + * supported by server */ + max = purple_xmlnode_get_attrib(packet, "max"); + if (max) + purple_account_set_string(account, "sm_max", max); + } +} + static void tls_init(JabberStream *js); void jabber_process_packet(JabberStream *js, PurpleXmlNode **packet) @@ -362,6 +398,8 @@ void jabber_process_packet(JabberStream jabber_presence_parse(js, *packet); } else if (purple_strequal(name, "message")) { jabber_message_parse(js, *packet); + } else if (purple_strequal(name, "enabled") && purple_strequal(xmlns, NS_XMPP_SM)) { + jabber_stream_management_parse(js, *packet); } else if (purple_strequal(xmlns, NS_XMPP_STREAMS)) { if (g_str_equal(name, "features")) jabber_stream_features_parse(js, *packet); 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 @@ -342,6 +342,7 @@ extern GList *jabber_identities; G_MODULE_EXPORT GType jabber_protocol_get_type(void); void jabber_stream_features_parse(JabberStream *js, PurpleXmlNode *packet); +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_raw(JabberStream *js, const char *data, int len); _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits