diff options
Diffstat (limited to 'libempathy-gtk/empathy-ui-utils.c')
-rw-r--r-- | libempathy-gtk/empathy-ui-utils.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c index ae3675145..bf391ccc2 100644 --- a/libempathy-gtk/empathy-ui-utils.c +++ b/libempathy-gtk/empathy-ui-utils.c @@ -245,11 +245,14 @@ empathy_icon_name_for_contact (EmpathyContact *contact) } GdkPixbuf * -empathy_pixbuf_from_data (gchar *data, - gsize data_size) +empathy_pixbuf_from_data (gchar *data, + gsize data_size, + gchar **mime_type) { GdkPixbufLoader *loader; + GdkPixbufFormat *format; GdkPixbuf *pixbuf = NULL; + gchar **mime_types; GError *error = NULL; if (!data) { @@ -260,23 +263,34 @@ empathy_pixbuf_from_data (gchar *data, if (!gdk_pixbuf_loader_write (loader, data, data_size, &error)) { DEBUG ("Failed to write to pixbuf loader: %s", error ? error->message : "No error given"); - g_clear_error (&error); - g_object_unref (loader); - return NULL; + goto out; } if (!gdk_pixbuf_loader_close (loader, &error)) { DEBUG ("Failed to close pixbuf loader: %s", error ? error->message : "No error given"); - g_clear_error (&error); - g_object_unref (loader); - return NULL; + goto out; } pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); if (pixbuf) { g_object_ref (pixbuf); + + if (mime_type != NULL) { + format = gdk_pixbuf_loader_get_format (loader); + mime_types = gdk_pixbuf_format_get_mime_types (format); + + *mime_type = g_strdup (*mime_types); + if (*(mime_types + 1) != NULL) { + DEBUG ("Loader supports more than one mime " + "type! Picking the first one, %s", + *mime_type); + } + g_strfreev (mime_types); + } } +out: + g_clear_error (&error); g_object_unref (loader); return pixbuf; |