From 1dae4e1abd2b49fdfb64eecf068d1085dcd7e125 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sat, 14 Jun 2025 17:06:45 +0200 Subject: Support media elements in data forms --- .../file_image_widget.vala | 35 ++++------------------ .../module/xep/0264_jingle_content_thumbnails.vala | 19 +++++++++--- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/main/src/ui/conversation_content_view/file_image_widget.vala b/main/src/ui/conversation_content_view/file_image_widget.vala index f95620b9..fa848c6d 100644 --- a/main/src/ui/conversation_content_view/file_image_widget.vala +++ b/main/src/ui/conversation_content_view/file_image_widget.vala @@ -217,37 +217,12 @@ public class FileImageWidget : Widget { } public static Pixbuf? parse_thumbnail(Xep.JingleContentThumbnails.Thumbnail thumbnail) { - string[] splits = thumbnail.uri.split(":", 2); - if (splits.length != 2) { - warning("Thumbnail parsing error: ':' not found"); - return null; + Bytes? data = Xep.BitsOfBinary.get_data_for_uri(thumbnail.uri); + if (data == null) { + warning("Couldn't parse data from uri: %s", thumbnail.uri); } - if (splits[0] != "data") { - warning("Unsupported thumbnail: unimplemented uri type\n"); - return null; - } - splits = splits[1].split(";", 2); - if (splits.length != 2) { - warning("Thumbnail parsing error: ';' not found"); - return null; - } - if (splits[0] != "image/png") { - warning("Unsupported thumbnail: unsupported mime-type\n"); - return null; - } - splits = splits[1].split(",", 2); - if (splits.length != 2) { - warning("Thumbnail parsing error: ',' not found"); - return null; - } - if (splits[0] != "base64") { - warning("Unsupported thumbnail: data is not base64 encoded\n"); - return null; - } - uint8[] data = Base64.decode(splits[1]); - MemoryInputStream input_stream = new MemoryInputStream.from_data(data); - Pixbuf pixbuf = new Pixbuf.from_stream(input_stream); - return pixbuf; + MemoryInputStream input_stream = new MemoryInputStream.from_data(data.get_data()); + return new Pixbuf.from_stream(input_stream); } public static bool can_display(FileTransfer file_transfer) { diff --git a/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala b/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala index 053fb7d5..5dba0c6d 100644 --- a/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala +++ b/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala @@ -14,6 +14,7 @@ namespace Xmpp.Xep.JingleContentThumbnails { public class Thumbnail { public string uri; + public Bytes data; public string? media_type; public int width; public int height; @@ -34,11 +35,21 @@ namespace Xmpp.Xep.JingleContentThumbnails { } public static Thumbnail? from_stanza_node(StanzaNode node) { - Thumbnail thumbnail = new Thumbnail(); - thumbnail.uri = node.get_attribute("uri"); - if (thumbnail.uri == null) { - return null; + string uri = node.get_attribute("uri"); + if (uri == null) return null; + + string? data_uri = null; + Bytes data = BitsOfBinary.get_data_for_uri(uri); + + if (uri.has_suffix("@bob.xmpp.org")) { + data_uri = "data:image/png;base64," + Base64.encode(data.get_data()); + } else if (uri.has_prefix("data:image/png;base64,")) { + data_uri = uri; } + + Thumbnail thumbnail = new Thumbnail(); + thumbnail.uri = data_uri; + thumbnail.data = data; thumbnail.media_type = node.get_attribute("media-type"); thumbnail.width = node.get_attribute_int("width"); thumbnail.height = node.get_attribute_int("height"); -- cgit v1.3