/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