/soc/2015/jgeboski/facebook: 68220e4ccb15: facebook: upgraded MQ...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 68220e4ccb15f8a63f69c006dddfee13ccca22a7
Author:	 James Geboski <[email protected]>
Date:	 2015-08-08 19:43 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/68220e4ccb15

Description:

facebook: upgraded MQTT version to MQTToT

diffstat:

 libpurple/protocols/facebook/api.c    |  102 ++++++++++++++++++++++++++-------
 libpurple/protocols/facebook/mqtt.c   |   26 +++-----
 libpurple/protocols/facebook/mqtt.h   |   13 ++--
 libpurple/protocols/facebook/thrift.c |   22 ++++++-
 libpurple/protocols/facebook/thrift.h |    3 +
 5 files changed, 115 insertions(+), 51 deletions(-)

diffs (272 lines):

diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -577,36 +577,92 @@ fb_api_cb_mqtt_error(FbMqtt *mqtt, GErro
 static void
 fb_api_cb_mqtt_open(FbMqtt *mqtt, gpointer data)
 {
+	const GByteArray *bytes;
 	FbApi *api = data;
 	FbApiPrivate *priv = api->priv;
-	gchar *json;
-	JsonBuilder *bldr;
+	FbThrift *thft;
+	GByteArray *cytes;
 
 	static guint8 flags = FB_MQTT_CONNECT_FLAG_USER |
 	                      FB_MQTT_CONNECT_FLAG_PASS |
 	                      FB_MQTT_CONNECT_FLAG_CLR;
 
-	bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
-	fb_json_bldr_add_bool(bldr, "chat_on", TRUE);
-	fb_json_bldr_add_bool(bldr, "fg", FALSE);
-	fb_json_bldr_add_bool(bldr, "no_auto_fg", TRUE);
-	fb_json_bldr_add_int(bldr, "mqtt_sid", priv->mid);
-	fb_json_bldr_add_int(bldr, "nwt", 1);
-	fb_json_bldr_add_int(bldr, "nwst", 0);
-	fb_json_bldr_add_str(bldr, "a", FB_API_AGENT);
-	fb_json_bldr_add_str(bldr, "d", priv->did);
-	fb_json_bldr_add_str(bldr, "pf", "jz");
-	fb_json_bldr_add_strf(bldr, "u", "%" FB_ID_FORMAT, priv->uid);
-
-	json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL);
-	fb_mqtt_connect(mqtt,
-		flags,       /* Flags */
-		priv->cid,   /* Client identifier */
-		json,        /* Will message */
-		priv->token, /* Username */
-		NULL);
-
-	g_free(json);
+	thft = fb_thrift_new(NULL, 0, TRUE);
+
+	/* Write the client identifier */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 1);
+	fb_thrift_write_str(thft, priv->cid);
+
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRUCT, 4);
+
+	/* Write the user identifier */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 5);
+	fb_thrift_write_i64(thft, priv->uid);
+
+	/* Write the information string */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 6);
+	fb_thrift_write_str(thft, "");
+
+	/* Write the UNKNOWN ("cp"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 7);
+	fb_thrift_write_i64(thft, 23);
+
+	/* Write the UNKNOWN ("ecp"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 8);
+	fb_thrift_write_i64(thft, 26);
+
+	/* Write the UNKNOWN */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I32, 9);
+	fb_thrift_write_i32(thft, 1);
+
+	/* Write the UNKNOWN ("chat_on"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 10);
+	fb_thrift_write_bool(thft, TRUE);
+
+	/* Write the UNKNOWN ("no_auto_fg"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 11);
+	fb_thrift_write_bool(thft, TRUE);
+
+	/* Write the device identifier */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 12);
+	fb_thrift_write_str(thft, priv->did);
+
+	/* Write the UNKNOWN ("fg"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 13);
+	fb_thrift_write_bool(thft, TRUE);
+
+	/* Write the UNKNOWN ("nwt"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I32, 14);
+	fb_thrift_write_i32(thft, 1);
+
+	/* Write the UNKNOWN ("nwst"?) */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I32, 15);
+	fb_thrift_write_i32(thft, 0);
+
+	/* Write the MQTT identifier */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 16);
+	fb_thrift_write_i64(thft, priv->mid);
+
+	/* Write the UNKNOWN */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_LIST, 18);
+	fb_thrift_write_list(thft, FB_THRIFT_TYPE_I32, 0);
+	fb_thrift_write_stop(thft);
+
+	/* Write the token */
+	fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 19);
+	fb_thrift_write_str(thft, priv->token);
+
+	/* Write the STOP for the struct */
+	fb_thrift_write_stop(thft);
+
+	bytes = fb_thrift_get_bytes(thft);
+	cytes = fb_util_zcompress(bytes);
+
+	fb_util_debug_hexdump(FB_UTIL_DEBUG_INFO, bytes, "Writing connect");
+	fb_mqtt_connect(mqtt, flags, cytes);
+
+	g_byte_array_free(cytes, TRUE);
+	g_object_unref(thft);
 }
 
 static void
diff --git a/libpurple/protocols/facebook/mqtt.c b/libpurple/protocols/facebook/mqtt.c
--- a/libpurple/protocols/facebook/mqtt.c
+++ b/libpurple/protocols/facebook/mqtt.c
@@ -598,35 +598,27 @@ fb_mqtt_open(FbMqtt *mqtt, const gchar *
 }
 
 void
-fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const gchar *cid, ...)
+fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const GByteArray *pload)
 {
-	const gchar *str;
 	FbMqttMessage *msg;
-	va_list ap;
 
-	g_return_if_fail(cid != NULL);
 	g_return_if_fail(!fb_mqtt_connected(mqtt, FALSE));
+	g_return_if_fail(pload != NULL);
 
 	/* Facebook always sends a CONNACK, use QoS1 */
 	flags |= FB_MQTT_CONNECT_FLAG_QOS1;
 
 	msg = fb_mqtt_message_new(FB_MQTT_MESSAGE_TYPE_CONNECT, 0);
-	fb_mqtt_message_write_str(msg, FB_MQTT_NAME);  /* Protocol name */
-	fb_mqtt_message_write_byte(msg, FB_MQTT_VERS); /* Protocol version */
-	fb_mqtt_message_write_byte(msg, flags);        /* Flags */
-	fb_mqtt_message_write_u16(msg, FB_MQTT_KA);    /* Keep alive */
-	fb_mqtt_message_write_str(msg, cid);           /* Client identifier */
+	fb_mqtt_message_write_str(msg, FB_MQTT_NAME);   /* Protocol name */
+	fb_mqtt_message_write_byte(msg, FB_MQTT_LEVEL); /* Protocol level */
+	fb_mqtt_message_write_byte(msg, flags);         /* Flags */
+	fb_mqtt_message_write_u16(msg, FB_MQTT_KA);     /* Keep alive */
 
-	va_start(ap, cid);
+	fb_mqtt_message_write(msg, pload->data, pload->len);
+	fb_mqtt_write(mqtt, msg);
 
-	while ((str = va_arg(ap, const gchar*)) != NULL) {
-		fb_mqtt_message_write_str(msg, str);
-	}
-
-	va_end(ap);
-	fb_mqtt_write(mqtt, msg);
+	fb_mqtt_timeout(mqtt);
 	g_object_unref(msg);
-	fb_mqtt_timeout(mqtt);
 }
 
 gboolean
diff --git a/libpurple/protocols/facebook/mqtt.h b/libpurple/protocols/facebook/mqtt.h
--- a/libpurple/protocols/facebook/mqtt.h
+++ b/libpurple/protocols/facebook/mqtt.h
@@ -27,11 +27,11 @@
 
 #include "connection.h"
 
-#define FB_MQTT_NAME "MQIsdp"
-#define FB_MQTT_VERS 3
-#define FB_MQTT_KA   60
-#define FB_MQTT_HOST "mqtt.facebook.com"
-#define FB_MQTT_PORT 443
+#define FB_MQTT_NAME  "MQTToT"
+#define FB_MQTT_LEVEL 3
+#define FB_MQTT_KA    60
+#define FB_MQTT_HOST  "mqtt.facebook.com"
+#define FB_MQTT_PORT  443
 
 #define FB_MQTT_TIMEOUT_CONN (FB_MQTT_KA * 1500)
 #define FB_MQTT_TIMEOUT_PING (FB_MQTT_KA * 1000)
@@ -171,8 +171,7 @@ void
 fb_mqtt_open(FbMqtt *mqtt, const gchar *host, gint port);
 
 void
-fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const gchar *cid, ...)
-                G_GNUC_NULL_TERMINATED;
+fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const GByteArray *pload);
 
 gboolean
 fb_mqtt_connected(FbMqtt *mqtt, gboolean error);
diff --git a/libpurple/protocols/facebook/thrift.c b/libpurple/protocols/facebook/thrift.c
--- a/libpurple/protocols/facebook/thrift.c
+++ b/libpurple/protocols/facebook/thrift.c
@@ -77,6 +77,7 @@ fb_thrift_new(GByteArray *bytes, guint o
 		priv->bytes  = bytes;
 		priv->offset = offset;
 	} else {
+		priv->bytes  = g_byte_array_new();
 		priv->flags |= FB_THRIFT_FLAG_INTERNAL;
 	}
 
@@ -88,6 +89,16 @@ fb_thrift_new(GByteArray *bytes, guint o
 	return thft;
 }
 
+const GByteArray *
+fb_thrift_get_bytes(FbThrift *thft)
+{
+	FbThriftPrivate *priv;
+
+	g_return_val_if_fail(FB_IS_THRIFT(thft), NULL);
+	priv = thft->priv;
+	return priv->bytes;
+}
+
 guint
 fb_thrift_get_pos(FbThrift *thft)
 {
@@ -728,7 +739,7 @@ fb_thrift_write_i16(FbThrift *thft, gint
 void
 fb_thrift_write_vi16(FbThrift *thft, guint16 u16)
 {
-	fb_thrift_write_vi32(thft, u16);
+	fb_thrift_write_vi64(thft, u16);
 }
 
 void
@@ -755,7 +766,6 @@ fb_thrift_write_vi32(FbThrift *thft, gui
 	fb_thrift_write_vi64(thft, u32);
 }
 
-
 void
 fb_thrift_write_i64(FbThrift *thft, gint64 i64)
 {
@@ -790,10 +800,14 @@ fb_thrift_write_vi64(FbThrift *thft, gui
 
 	do {
 		last = (u64 & ~0x7F) == 0;
-		byte = !last ? ((u64 & 0x7F) | 0x80) : (u64 & 0x0F);
+		byte = u64 & 0x7F;
+
+		if (!last) {
+			byte |= 0x80;
+			u64 >>= 7;
+		}
 
 		fb_thrift_write_byte(thft, byte);
-		u64 >>= 7;
 	} while (!last);
 }
 
diff --git a/libpurple/protocols/facebook/thrift.h b/libpurple/protocols/facebook/thrift.h
--- a/libpurple/protocols/facebook/thrift.h
+++ b/libpurple/protocols/facebook/thrift.h
@@ -84,6 +84,9 @@ fb_thrift_get_type(void);
 FbThrift *
 fb_thrift_new(GByteArray *bytes, guint offset, gboolean compact);
 
+const GByteArray *
+fb_thrift_get_bytes(FbThrift *thft);
+
 guint
 fb_thrift_get_pos(FbThrift *thft);
 

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