/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