/soc/2015/jgeboski/facebook: 3ee1b27dacc4: facebook: added debug...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 3ee1b27dacc44931489bfdb71aa507ac29364aa8
Author:	 James Geboski <[email protected]>
Date:	 2015-06-27 00:56 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/3ee1b27dacc4

Description:

facebook: added debugging utilities and messages

diffstat:

 libpurple/protocols/facebook/api.c  |   15 +++-
 libpurple/protocols/facebook/mqtt.c |   17 ++++
 libpurple/protocols/facebook/util.c |  144 ++++++++++++++++++++++++++++++++++++
 libpurple/protocols/facebook/util.h |   46 +++++++++++
 4 files changed, 221 insertions(+), 1 deletions(-)

diffs (truncated from 323 to 300 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
@@ -312,6 +312,9 @@ fb_api_json_chk(FbApi *api, gconstpointe
 	g_return_val_if_fail(FB_IS_API(api), FALSE);
 	priv = api->priv;
 
+	fb_util_debug(FB_UTIL_DEBUG_INFO, "Parsing JSON: %.*s",
+	              (gint) size, (const gchar *) data);
+
 	root = fb_json_node_new(data, size, &err);
 	FB_API_ERROR_CHK(api, err, return FALSE);
 
@@ -777,6 +780,8 @@ fb_api_cb_publish_p(FbApi *api, const GB
 
 		mptr = fb_api_presence_dup(&pres);
 		press = g_slist_prepend(press, mptr);
+		fb_util_debug_info("Presence: %" FB_ID_FORMAT " (%d)",
+		                   i64, i32 != 0);
 
 		/* Skip the last active timestamp field */
 		if (!fb_thrift_read_field(thft, &type, NULL)) {
@@ -837,6 +842,10 @@ fb_api_cb_mqtt_publish(FbMqtt *mqtt, con
 		bytes = (GByteArray*) pload;
 	}
 
+	fb_util_debug_hexdump(FB_UTIL_DEBUG_INFO, bytes,
+	                      "Reading message (topic: %s)",
+			      topic);
+
 	if (g_ascii_strcasecmp(topic, "/orca_typing_notifications") == 0) {
 		fb_api_cb_publish_tn(api, bytes);
 	} else if (g_ascii_strcasecmp(topic, "/t_ms") == 0) {
@@ -1120,8 +1129,12 @@ fb_api_publish(FbApi *api, const gchar *
 
 	bytes = g_byte_array_new_take((guint8*) msg, strlen(msg));
 	cytes = fb_util_zcompress(bytes);
+
+	fb_util_debug_hexdump(FB_UTIL_DEBUG_INFO, bytes,
+	                      "Writing message (topic: %s)",
+			      topic);
+
 	fb_mqtt_publish(priv->mqtt, topic, cytes);
-
 	g_byte_array_free(cytes, TRUE);
 	g_byte_array_free(bytes, TRUE);
 }
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
@@ -30,6 +30,7 @@
 
 #include "marshal.h"
 #include "mqtt.h"
+#include "util.h"
 
 struct _FbMqttPrivate
 {
@@ -211,6 +212,10 @@ fb_mqtt_close(FbMqtt *mqtt)
 		priv->gsc = NULL;
 	}
 
+	if (priv->wbuf->len > 0) {
+		fb_util_debug_warning("Closing with unwritten data");
+	}
+
 	priv->connected = FALSE;
 	g_byte_array_set_size(priv->rbuf, 0);
 	g_byte_array_set_size(priv->wbuf, 0);
@@ -383,6 +388,10 @@ fb_mqtt_read(FbMqtt *mqtt, FbMqttMessage
 	priv = mqtt->priv;
 	mriv = msg->priv;
 
+	fb_util_debug_hexdump(FB_UTIL_DEBUG_INFO, mriv->bytes,
+	                      "Reading %d (flags: 0x%0X)",
+			      mriv->type, mriv->flags);
+
 	switch (mriv->type) {
 	case FB_MQTT_MESSAGE_TYPE_CONNACK:
 		if (!fb_mqtt_message_read_byte(msg, NULL) ||
@@ -493,10 +502,14 @@ void
 fb_mqtt_write(FbMqtt *mqtt, FbMqttMessage *msg)
 {
 	const GByteArray *bytes;
+	FbMqttMessagePrivate *mriv;
 	FbMqttPrivate *priv;
 
 	g_return_if_fail(FB_IS_MQTT(mqtt));
+	g_return_if_fail(FB_IS_MQTT_MESSAGE(msg));
 	priv = mqtt->priv;
+	mriv = msg->priv;
+
 	bytes = fb_mqtt_message_bytes(msg);
 
 	if (G_UNLIKELY(bytes == NULL)) {
@@ -505,6 +518,10 @@ fb_mqtt_write(FbMqtt *mqtt, FbMqttMessag
 		return;
 	}
 
+	fb_util_debug_hexdump(FB_UTIL_DEBUG_INFO, mriv->bytes,
+	                      "Writing %d (flags: 0x%0X)",
+		              mriv->type, mriv->flags);
+
 	g_byte_array_append(priv->wbuf, bytes->data, bytes->len);
 	fb_mqtt_cb_write(mqtt, priv->gsc->fd, PURPLE_INPUT_WRITE);
 
diff --git a/libpurple/protocols/facebook/util.c b/libpurple/protocols/facebook/util.c
--- a/libpurple/protocols/facebook/util.c
+++ b/libpurple/protocols/facebook/util.c
@@ -21,11 +21,155 @@
 
 #include "internal.h"
 
+#include <stdarg.h>
 #include <string.h>
 #include <zlib.h>
 
 #include "util.h"
 
+void
+fb_util_debug(PurpleDebugLevel level, const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(level, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_vdebug(PurpleDebugLevel level, const gchar *format, va_list ap)
+{
+	gboolean unsafe;
+	gboolean verbose;
+	gchar *str;
+
+	g_return_if_fail(format != NULL);
+
+	unsafe = (level & FB_UTIL_DEBUG_FLAG_UNSAFE) != 0;
+	verbose = (level & FB_UTIL_DEBUG_FLAG_VERBOSE) != 0;
+
+	if ((unsafe && !purple_debug_is_unsafe()) ||
+	    (verbose && !purple_debug_is_verbose()))
+	{
+		return;
+	}
+
+	str = g_strdup_vprintf(format, ap);
+	purple_debug(level, "facebook", "%s", str);
+	g_free(str);
+}
+
+void
+fb_util_debug_misc(const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(PURPLE_DEBUG_MISC, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_debug_info(const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(PURPLE_DEBUG_INFO, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_debug_warning(const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(PURPLE_DEBUG_WARNING, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_debug_error(const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(PURPLE_DEBUG_ERROR, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_debug_fatal(const gchar *format, ...)
+{
+	va_list ap;
+
+	va_start(ap, format);
+	fb_util_vdebug(PURPLE_DEBUG_FATAL, format, ap);
+	va_end(ap);
+}
+
+void
+fb_util_debug_hexdump(PurpleDebugLevel level, const GByteArray *bytes,
+                      const gchar *format, ...)
+{
+	gchar c;
+	guint i;
+	guint j;
+	GString *gstr;
+	va_list ap;
+
+	static const gchar *indent = "  ";
+
+	g_return_if_fail(bytes != NULL);
+
+	if (format != NULL) {
+		va_start(ap, format);
+		fb_util_vdebug(level, format, ap);
+		va_end(ap);
+	}
+
+	gstr = g_string_sized_new(80);
+
+	for (i = 0; i < bytes->len; i += 16) {
+		g_string_append_printf(gstr, "%s%08x  ", indent, i);
+
+		for (j = 0; j < 16; j++) {
+			if ((i + j) < bytes->len) {
+				g_string_append_printf(gstr, "%02x ",
+				                       bytes->data[i + j]);
+			} else {
+				g_string_append(gstr, "   ");
+			}
+
+			if (j == 7) {
+				g_string_append_c(gstr, ' ');
+			}
+		}
+
+		g_string_append(gstr, " |");
+
+		for (j = 0; (j < 16) && ((i + j) < bytes->len); j++) {
+			c = bytes->data[i + j];
+
+			if (!g_ascii_isprint(c) || g_ascii_isspace(c)) {
+				c = '.';
+			}
+
+			g_string_append_c(gstr, c);
+		}
+
+		g_string_append_c(gstr, '|');
+		fb_util_debug(level, "%s", gstr->str);
+		g_string_erase(gstr, 0, -1);
+	}
+
+	g_string_append_printf(gstr, "%s%08x", indent, i);
+	fb_util_debug(level, "%s", gstr->str);
+	g_string_free(gstr, TRUE);
+}
+
 gchar *
 fb_util_locale_str(void)
 {
diff --git a/libpurple/protocols/facebook/util.h b/libpurple/protocols/facebook/util.h
--- a/libpurple/protocols/facebook/util.h
+++ b/libpurple/protocols/facebook/util.h
@@ -25,8 +25,54 @@
 #include "connection.h"
 #include "glibcompat.h"
 
+#define FB_UTIL_DEBUG_INFO (        \
+		PURPLE_DEBUG_INFO |         \
+		FB_UTIL_DEBUG_FLAG_UNSAFE | \
+		FB_UTIL_DEBUG_FLAG_VERBOSE  \
+	)
+
+typedef enum _FbUtilDebugFlags FbUtilDebugFlags;
+
 typedef void (*FbUtilRequestBuddyFunc) (GSList *buddies, gpointer data);
 
+enum _FbUtilDebugFlags
+{
+	FB_UTIL_DEBUG_FLAG_UNSAFE  = 1 << 25,
+	FB_UTIL_DEBUG_FLAG_VERBOSE = 1 << 26
+};
+
+void
+fb_util_debug(PurpleDebugLevel level, const gchar *format, ...)
+              G_GNUC_PRINTF(2, 3);
+
+void
+fb_util_vdebug(PurpleDebugLevel level, const gchar *format, va_list ap);
+
+void
+fb_util_debug_misc(const gchar *format, ...)
+                   G_GNUC_PRINTF(1, 2);
+
+void

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