aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2025-06-14 17:06:45 +0200
committerfiaxh <git@lightrise.org>2025-06-14 17:06:45 +0200
commit1dae4e1abd2b49fdfb64eecf068d1085dcd7e125 (patch)
tree01c8c0d8ae4ea01598fff336368a3fd88c374e0f
parent1254a753eb3c85f35e5bc322dbe4a3f177e79c88 (diff)
Support media elements in data forms
-rw-r--r--main/src/ui/conversation_content_view/file_image_widget.vala35
-rw-r--r--xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala19
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");