summaryrefslogtreecommitdiff
path: root/libpurple/ft.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/ft.c')
-rw-r--r--libpurple/ft.c120
1 files changed, 110 insertions, 10 deletions
diff --git a/libpurple/ft.c b/libpurple/ft.c
index a62a77e6d9..d5711b28eb 100644
--- a/libpurple/ft.c
+++ b/libpurple/ft.c
@@ -60,6 +60,10 @@ typedef struct _PurpleXferPrivData {
/* TODO: Should really use a PurpleCircBuffer for this. */
GByteArray *buffer;
+
+ gpointer thumbnail_data; /**< thumbnail image */
+ gsize thumbnail_size;
+ gchar *thumbnail_mimetype;
} PurpleXferPrivData;
static int purple_xfer_choose_file(PurpleXfer *xfer);
@@ -72,6 +76,10 @@ purple_xfer_priv_data_destroy(gpointer data)
if (priv->buffer)
g_byte_array_free(priv->buffer, TRUE);
+ g_free(priv->thumbnail_data);
+
+ g_free(priv->thumbnail_mimetype);
+
g_free(priv);
}
@@ -266,15 +274,21 @@ purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatusType status)
}
}
-void purple_xfer_conversation_write(PurpleXfer *xfer, char *message, gboolean is_error)
+static void
+purple_xfer_conversation_write_internal(PurpleXfer *xfer,
+ const char *message, gboolean is_error, gboolean print_thumbnail)
{
PurpleConversation *conv = NULL;
PurpleMessageFlags flags = PURPLE_MESSAGE_SYSTEM;
char *escaped;
+ gconstpointer thumbnail_data;
+ gsize size;
g_return_if_fail(xfer != NULL);
g_return_if_fail(message != NULL);
+ thumbnail_data = purple_xfer_get_thumbnail(xfer, &size);
+
conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, xfer->who,
purple_xfer_get_account(xfer));
@@ -286,10 +300,39 @@ void purple_xfer_conversation_write(PurpleXfer *xfer, char *message, gboolean is
if (is_error)
flags |= PURPLE_MESSAGE_ERROR;
- purple_conversation_write(conv, NULL, escaped, flags, time(NULL));
+ if (print_thumbnail && thumbnail_data) {
+ gchar *message_with_img;
+ gpointer data = g_memdup(thumbnail_data, size);
+ int id = purple_imgstore_add_with_id(data, size, NULL);
+
+ message_with_img =
+ g_strdup_printf("<img id='%d'> %s", id, escaped);
+ purple_conversation_write(conv, NULL, message_with_img, flags,
+ time(NULL));
+ purple_imgstore_unref_by_id(id);
+ g_free(message_with_img);
+ } else {
+ purple_conversation_write(conv, NULL, escaped, flags, time(NULL));
+ }
g_free(escaped);
}
+void
+purple_xfer_conversation_write(PurpleXfer *xfer, gchar *message,
+ gboolean is_error)
+{
+ purple_xfer_conversation_write_internal(xfer, message, is_error, FALSE);
+}
+
+/* maybe this one should be exported publically? */
+static void
+purple_xfer_conversation_write_with_thumbnail(PurpleXfer *xfer,
+ const gchar *message)
+{
+ purple_xfer_conversation_write_internal(xfer, message, FALSE, TRUE);
+}
+
+
static void purple_xfer_show_file_error(PurpleXfer *xfer, const char *filename)
{
int err = errno;
@@ -448,6 +491,8 @@ purple_xfer_ask_recv(PurpleXfer *xfer)
{
char *buf, *size_buf;
size_t size;
+ gconstpointer thumb;
+ gsize thumb_size;
/* If we have already accepted the request, ask the destination file
name directly */
@@ -473,13 +518,19 @@ purple_xfer_ask_recv(PurpleXfer *xfer)
serv_got_im(purple_account_get_connection(xfer->account),
xfer->who, xfer->message, 0, time(NULL));
- purple_request_accept_cancel(xfer, NULL, buf, NULL,
- PURPLE_DEFAULT_ACTION_NONE,
- xfer->account, xfer->who, NULL,
- xfer,
- G_CALLBACK(purple_xfer_choose_file),
- G_CALLBACK(cancel_recv_cb));
-
+ if ((thumb = purple_xfer_get_thumbnail(xfer, &thumb_size))) {
+ purple_request_accept_cancel_with_icon(xfer, NULL, buf, NULL,
+ PURPLE_DEFAULT_ACTION_NONE, xfer->account, xfer->who, NULL,
+ thumb, thumb_size, xfer,
+ G_CALLBACK(purple_xfer_choose_file),
+ G_CALLBACK(cancel_recv_cb));
+ } else {
+ purple_request_accept_cancel(xfer, NULL, buf, NULL,
+ PURPLE_DEFAULT_ACTION_NONE, xfer->account, xfer->who, NULL,
+ xfer, G_CALLBACK(purple_xfer_choose_file),
+ G_CALLBACK(cancel_recv_cb));
+ }
+
g_free(buf);
} else
purple_xfer_choose_file(xfer);
@@ -547,10 +598,12 @@ purple_xfer_request(PurpleXfer *xfer)
{
gchar* message = NULL;
PurpleBuddy *buddy = purple_find_buddy(xfer->account, xfer->who);
+
message = g_strdup_printf(_("%s is offering to send file %s"),
buddy ? purple_buddy_get_alias(buddy) : xfer->who, purple_xfer_get_filename(xfer));
- purple_xfer_conversation_write(xfer, message, FALSE);
+ purple_xfer_conversation_write_with_thumbnail(xfer, message);
g_free(message);
+
/* Ask for a filename to save to if it's not already given by a plugin */
if (xfer->local_filename == NULL)
purple_xfer_ask_recv(xfer);
@@ -699,6 +752,7 @@ purple_xfer_get_status(const PurpleXfer *xfer)
return xfer->status;
}
+/* FIXME: Rename with cancelled for 3.0.0. */
gboolean
purple_xfer_is_canceled(const PurpleXfer *xfer)
{
@@ -1580,6 +1634,52 @@ purple_xfer_update_progress(PurpleXfer *xfer)
ui_ops->update_progress(xfer, purple_xfer_get_progress(xfer));
}
+gconstpointer
+purple_xfer_get_thumbnail(const PurpleXfer *xfer, gsize *len)
+{
+ PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer);
+
+ if (len)
+ *len = priv->thumbnail_size;
+
+ return priv->thumbnail_data;
+}
+
+const gchar *
+purple_xfer_get_thumbnail_mimetype(const PurpleXfer *xfer)
+{
+ PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer);
+
+ return priv->thumbnail_mimetype;
+}
+
+void
+purple_xfer_set_thumbnail(PurpleXfer *xfer, gconstpointer thumbnail,
+ gsize size, const gchar *mimetype)
+{
+ PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer);
+
+ g_free(priv->thumbnail_data);
+ g_free(priv->thumbnail_mimetype);
+
+ if (thumbnail && size > 0) {
+ priv->thumbnail_data = g_memdup(thumbnail, size);
+ priv->thumbnail_size = size;
+ priv->thumbnail_mimetype = g_strdup(mimetype);
+ } else {
+ priv->thumbnail_data = NULL;
+ priv->thumbnail_size = 0;
+ priv->thumbnail_mimetype = NULL;
+ }
+}
+
+void
+purple_xfer_prepare_thumbnail(PurpleXfer *xfer, const gchar *formats)
+{
+ if (xfer->ui_ops->add_thumbnail) {
+ xfer->ui_ops->add_thumbnail(xfer, formats);
+ }
+}
/**************************************************************************
* File Transfer Subsystem API