/soc/2015/jgeboski/facebook: d8e50d403e82: facebook: display ima...

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

Description:

facebook: display images in-line

diffstat:

 libpurple/protocols/facebook/api.c      |   6 ++
 libpurple/protocols/facebook/api.h      |   6 ++-
 libpurple/protocols/facebook/data.c     |  11 +++++
 libpurple/protocols/facebook/data.h     |  10 ++++
 libpurple/protocols/facebook/facebook.c |  69 ++++++++++++++++++++++++++++++--
 5 files changed, 96 insertions(+), 6 deletions(-)

diffs (207 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
@@ -1236,8 +1236,11 @@ fb_api_message_parse_attach(FbApi *api, 
 		url = fb_json_values_next_str(values, NULL);
 
 		if ((str != NULL) && g_str_has_prefix(str, "image/")) {
+			msg->flags |= FB_API_MESSAGE_FLAG_IMAGE;
 			msg->text = g_strdup(url);
 			mptr = fb_api_message_dup(msg, FALSE);
+
+			msg->flags &= ~FB_API_MESSAGE_FLAG_IMAGE;
 			msgs = g_slist_prepend(msgs, mptr);
 			continue;
 		}
@@ -2080,8 +2083,11 @@ fb_api_cb_unread_parse_attach(FbApi *api
 		url = fb_json_values_next_str(values, NULL);
 
 		if ((str != NULL) && g_str_has_prefix(str, "image/")) {
+			msg->flags |= FB_API_MESSAGE_FLAG_IMAGE;
 			msg->text = g_strdup(url);
 			mptr = fb_api_message_dup(msg, FALSE);
+
+			msg->flags &= ~FB_API_MESSAGE_FLAG_IMAGE;
 			msgs = g_slist_prepend(msgs, mptr);
 			continue;
 		}
diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h
--- a/libpurple/protocols/facebook/api.h
+++ b/libpurple/protocols/facebook/api.h
@@ -265,13 +265,17 @@ typedef enum
 
 /**
  * FbApiMessageFlags:
+ * @FB_API_MESSAGE_FLAG_DONE: The text has been processed.
+ * @FB_API_MESSAGE_FLAG_IMAGE: The text is a URL to an image.
  * @FB_API_MESSAGE_FLAG_SELF: The text is from the #FbApi user.
  *
  * The #FbApiMessage flags.
  */
 typedef enum
 {
-	FB_API_MESSAGE_FLAG_SELF = 1 << 0
+	FB_API_MESSAGE_FLAG_DONE = 1 << 0,
+	FB_API_MESSAGE_FLAG_IMAGE = 1 << 1,
+	FB_API_MESSAGE_FLAG_SELF = 1 << 2
 } FbApiMessageFlags;
 
 /**
diff --git a/libpurple/protocols/facebook/data.c b/libpurple/protocols/facebook/data.c
--- a/libpurple/protocols/facebook/data.c
+++ b/libpurple/protocols/facebook/data.c
@@ -382,6 +382,17 @@ fb_data_add_message(FbData *fata, FbApiM
 	g_queue_push_tail(priv->msgs, msg);
 }
 
+void
+fb_data_remove_message(FbData *fata, FbApiMessage *msg)
+{
+	FbDataPrivate *priv;
+
+	g_return_if_fail(FB_IS_DATA(fata));
+	priv = fata->priv;
+
+	g_queue_remove(priv->msgs, msg);
+}
+
 GSList *
 fb_data_take_messages(FbData *fata, FbId uid)
 {
diff --git a/libpurple/protocols/facebook/data.h b/libpurple/protocols/facebook/data.h
--- a/libpurple/protocols/facebook/data.h
+++ b/libpurple/protocols/facebook/data.h
@@ -278,6 +278,16 @@ void
 fb_data_add_message(FbData *fata, FbApiMessage *msg);
 
 /**
+ * fb_data_remove_message:
+ * @fata: The #FbData.
+ * @msg: The #FbApiMessage.
+ *
+ * Removes an #FbApiMessage from the #FbData.
+ */
+void
+fb_data_remove_message(FbData *fata, FbApiMessage *msg);
+
+/**
  * fb_data_take_messages:
  * @fata: The #FbData.
  * @uid: The user #FbId.
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -33,6 +33,8 @@
 #include "conversations.h"
 #include "conversationtypes.h"
 #include "glibcompat.h"
+#include "image.h"
+#include "image-store.h"
 #include "message.h"
 #include "notify.h"
 #include "plugins.h"
@@ -405,8 +407,49 @@ fb_cb_api_events(FbApi *api, GSList *eve
 }
 
 static void
+fb_cb_image(FbDataImage *img, GError *error)
+{
+	const gchar *url;
+	FbApi *api;
+	FbApiMessage *msg;
+	FbData *fata;
+	gsize size;
+	GSList *msgs = NULL;
+	guint id;
+	guint8 *image;
+	PurpleImage *pimg;
+
+	fata = fb_data_image_get_fata(img);
+	msg = fb_data_image_get_data(img);
+	fb_data_remove_message(fata, msg);
+
+	if (G_UNLIKELY(error != NULL)) {
+		url = fb_data_image_get_url(img);
+		fb_util_debug_warning("Failed to retrieve image %s: %s",
+		                      url, error->message);
+		return;
+	}
+
+	api = fb_data_get_api(fata);
+	image = fb_data_image_dup_image(img, &size);
+	pimg = purple_image_new_from_data(image, size);
+	id = purple_image_store_add_weak(pimg);
+
+	g_free(msg->text);
+	msg->text = g_strdup_printf("<img src=\""
+	                            PURPLE_IMAGE_STORE_PROTOCOL
+	                            "%u\">", id);
+	msg->flags |= FB_API_MESSAGE_FLAG_DONE;
+
+	msgs = g_slist_prepend(msgs, msg);
+	fb_cb_api_messages(api, msgs, fata);
+	g_slist_free_full(msgs, (GDestroyNotify) fb_api_message_free);
+}
+
+static void
 fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data)
 {
+	const gchar *text;
 	FbApiMessage *msg;
 	FbData *fata = data;
 	gboolean mark;
@@ -429,12 +472,10 @@ fb_cb_api_messages(FbApi *api, GSList *m
 
 	for (l = msgs; l != NULL; l = l->next) {
 		msg = l->data;
-		html = purple_markup_escape_text(msg->text, -1);
 		FB_ID_TO_STR(msg->uid, uid);
 
 		if (purple_blist_find_buddy(acct, uid) == NULL) {
-			msg = fb_api_message_dup(msg, FALSE);
-			msg->text = html;
+			msg = fb_api_message_dup(msg, TRUE);
 			fb_data_add_message(fata, msg);
 			fb_api_contact(api, msg->uid);
 			continue;
@@ -443,12 +484,30 @@ fb_cb_api_messages(FbApi *api, GSList *m
 		self = (msg->flags & FB_API_MESSAGE_FLAG_SELF) != 0;
 		flags = self ? PURPLE_MESSAGE_SEND : PURPLE_MESSAGE_RECV;
 
+		if (msg->flags & FB_API_MESSAGE_FLAG_IMAGE) {
+			if (!(msg->flags & FB_API_MESSAGE_FLAG_DONE)) {
+				msg = fb_api_message_dup(msg, TRUE);
+				fb_data_image_add(fata, msg->text,
+				                  fb_cb_image, msg);
+				fb_data_add_message(fata, msg);
+				fb_data_image_queue(fata);
+				continue;
+			}
+
+			flags |= PURPLE_MESSAGE_IMAGES;
+			text = msg->text;
+			html = NULL;
+		} else {
+			html = purple_markup_escape_text(msg->text, -1);
+			text = html;
+		}
+
 		if (msg->tid == 0) {
 			if (mark && !self) {
 				fb_data_set_unread(fata, msg->uid, TRUE);
 			}
 
-			fb_util_serv_got_im(gc, uid, html, flags, time(NULL));
+			fb_util_serv_got_im(gc, uid, text, flags, time(NULL));
 			g_free(html);
 			continue;
 		}
@@ -473,7 +532,7 @@ fb_cb_api_messages(FbApi *api, GSList *m
 			fb_data_set_unread(fata, msg->tid, TRUE);
 		}
 
-		fb_util_serv_got_chat_in(gc, id, uid, html, flags, time(NULL));
+		fb_util_serv_got_chat_in(gc, id, uid, text, flags, time(NULL));
 		g_free(html);
 	}
 }

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