--- a/libpurple/protocols/jabber/message.c Sat Sep 17 14:47:33 2016 -0500 +++ b/libpurple/protocols/jabber/message.c Sun Sep 18 18:45:19 2016 -0500 @@ -41,6 +41,11 @@ #include <string.h> +typedef struct { + PurpleConversation *conv; + gchar *shortcut; +} JabberMessageRemoteSmileyAddData; + void jabber_message_free(JabberMessage *jm) { g_free(jm->from); @@ -487,24 +492,31 @@ } static void -jabber_message_remote_smiley_got(JabberData *data, gchar *alt, gpointer _smiley) -{ - PurpleSmiley *smiley = _smiley; +jabber_message_remote_smiley_got(JabberData *jdata, gchar *alt, gpointer d) { + JabberMessageRemoteSmileyAddData *data = (JabberMessageRemoteSmileyAddData *)d; - g_free(alt); /* we really don't need it */ + if (jdata) { + PurpleSmiley *smiley = NULL; - if (data) { purple_debug_info("jabber", "smiley data retrieved successfully"); - purple_image_transfer_write(image, jabber_data_get_data(data), - jabber_data_get_size(data)); - purple_image_transfer_close(image); + + smiley = purple_smiley_new_from_data( + data->shortcut, + jabber_data_get_data(jdata), + jabber_data_get_size(jdata) + ); + + purple_conversation_add_smiley(data->conv, smiley); + + g_object_unref(G_OBJECT(smiley)); } else { purple_debug_error("jabber", "failed retrieving smiley data"); - purple_image_transfer_failed(image); } - g_object_unref(smiley); + g_object_unref(G_OBJECT(data->conv)); + g_free(data->shortcut); + g_slice_free(JabberMessageRemoteSmileyAddData, data); } static void @@ -526,22 +538,29 @@ /* TODO: cache lookup by "cid" */ jdata = jabber_data_find_remote_by_cid(js, from, cid); if (jdata) { - PurpleImage *image = purple_smiley_get_image(smiley); - purple_debug_info("jabber", "smiley data is already known"); - purple_image_transfer_write(image, jabber_data_get_data(jdata), - jabber_data_get_size(jdata)); - purple_image_transfer_close(image); + smiley = purple_smiley_new_from_data( + shortcut, + jabber_data_get_data(jdata), + jabber_data_get_size(jdata) + ); + + purple_conversation_add_smiley(conv, smiley); + + g_object_unref(G_OBJECT(smiley)); } else { - gchar *alt = g_strdup(shortcut); /* it it really necessary? */ + JabberMessageRemoteSmileyAddData *data = NULL; + + data = g_slice_new(JabberMessageRemoteSmileyAddData); + data->conv = g_object_ref(G_OBJECT(conv)); + data->shortcut = g_strdup(shortcut); purple_debug_info("jabber", "smiley data is unknown, " "need to request it"); - g_object_ref(smiley); - jabber_data_request(js, cid, from, alt, FALSE, - jabber_message_remote_smiley_got, smiley); + jabber_data_request(js, cid, from, NULL, FALSE, + jabber_message_remote_smiley_got, data); } } @@ -912,19 +931,11 @@ for (it = found_smileys; it; it = it_next) { PurpleSmiley *smiley = it->data; - PurpleImage *smiley_image; gboolean valid = TRUE; it_next = g_list_next(it); - smiley_image = purple_smiley_get_image(smiley); - if (!smiley_image) { - valid = FALSE; - purple_debug_warning("jabber", "broken smiley %s", - purple_smiley_get_shortcut(smiley)); - } else if (purple_image_get_size(smiley_image) > - JABBER_DATA_MAX_SIZE) - { + if (purple_image_get_size(PURPLE_IMAGE(smiley)) > JABBER_DATA_MAX_SIZE) { has_too_large_smiley = TRUE; valid = FALSE; purple_debug_warning("jabber", "Refusing to send " @@ -957,10 +968,7 @@ if (jabber_data_find_local_by_alt(shortcut)) continue; - smiley_image = purple_smiley_get_image(smiley); - g_assert(smiley_image != NULL); - - mimetype = purple_image_get_mimetype(smiley_image); + mimetype = purple_image_get_mimetype(PURPLE_IMAGE(smiley)); if (!mimetype) { purple_debug_error("jabber", "unknown mime type for image"); @@ -968,8 +976,8 @@ } jdata = jabber_data_create_from_data( - purple_image_get_data(smiley_image), - purple_image_get_size(smiley_image), + purple_image_get_data(PURPLE_IMAGE(smiley)), + purple_image_get_size(PURPLE_IMAGE(smiley)), mimetype, FALSE, jm->js); purple_debug_info("jabber", "cache local smiley alt=%s, cid=%s",