libpurple/protocols/jabber/message.c

changeset 38282
be08ec8b8628
parent 38281
df274be2afa2
child 38287
24f9c5a4baff
--- 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",

mercurial