/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
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.