aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2025-06-14 17:50:07 +0200
committerfiaxh <git@lightrise.org>2025-06-14 17:50:07 +0200
commitbd8f277b9129a48a95ee19a2a3ec41d13aa66d4a (patch)
treed3538411c045c8245e81a32237039e924dd4efa4
parent1dae4e1abd2b49fdfb64eecf068d1085dcd7e125 (diff)
Add basic support for BOB thumbnails in SFS
-rw-r--r--libdino/src/entity/file_transfer.vala6
-rw-r--r--libdino/src/service/database.vala1
-rw-r--r--libdino/src/service/sfs_metadata.vala6
-rw-r--r--main/src/ui/conversation_content_view/file_image_widget.vala6
-rw-r--r--main/src/ui/util/preference_group.vala2
-rw-r--r--xmpp-vala/src/module/util.vala12
-rw-r--r--xmpp-vala/src/module/xep/0231_bits_of_binary.vala10
-rw-r--r--xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala15
8 files changed, 25 insertions, 33 deletions
diff --git a/libdino/src/entity/file_transfer.vala b/libdino/src/entity/file_transfer.vala
index 52347028..7b146c9a 100644
--- a/libdino/src/entity/file_transfer.vala
+++ b/libdino/src/entity/file_transfer.vala
@@ -160,7 +160,7 @@ public class FileTransfer : Object {
foreach(var thumbnail_row in db.file_thumbnails.select().with(db.file_thumbnails.id, "=", id)) {
Xep.JingleContentThumbnails.Thumbnail thumbnail = new Xep.JingleContentThumbnails.Thumbnail();
- thumbnail.uri = thumbnail_row[db.file_thumbnails.uri];
+ thumbnail.data = Xmpp.get_data_for_uri(thumbnail_row[db.file_thumbnails.uri]);
thumbnail.media_type = thumbnail_row[db.file_thumbnails.mime_type];
thumbnail.width = thumbnail_row[db.file_thumbnails.width];
thumbnail.height = thumbnail_row[db.file_thumbnails.height];
@@ -214,9 +214,11 @@ public class FileTransfer : Object {
.perform();
}
foreach (Xep.JingleContentThumbnails.Thumbnail thumbnail in thumbnails) {
+ string data_uri = "data:image/png;base64," + Base64.encode(thumbnail.data.get_data());
+
db.file_thumbnails.insert()
.value(db.file_thumbnails.id, id)
- .value(db.file_thumbnails.uri, thumbnail.uri)
+ .value(db.file_thumbnails.uri, data_uri)
.value(db.file_thumbnails.mime_type, thumbnail.media_type)
.value(db.file_thumbnails.width, thumbnail.width)
.value(db.file_thumbnails.height, thumbnail.height)
diff --git a/libdino/src/service/database.vala b/libdino/src/service/database.vala
index 06676951..e47e24e9 100644
--- a/libdino/src/service/database.vala
+++ b/libdino/src/service/database.vala
@@ -223,6 +223,7 @@ public class Database : Qlite.Database {
public class FileThumbnailsTable : Table {
public Column<int> id = new Column.Integer("id");
+ // TODO store data as bytes, not as data uri
public Column<string> uri = new Column.Text("uri") { not_null = true };
public Column<string> mime_type = new Column.Text("mime_type");
public Column<int> width = new Column.Integer("width");
diff --git a/libdino/src/service/sfs_metadata.vala b/libdino/src/service/sfs_metadata.vala
index dff6f7bf..f0058c4e 100644
--- a/libdino/src/service/sfs_metadata.vala
+++ b/libdino/src/service/sfs_metadata.vala
@@ -68,10 +68,8 @@ namespace Dino {
Pixbuf thumbnail_pixbuf = pixbuf.scale_simple(thumbnail_width, thumbnail_height, InterpType.BILINEAR);
uint8[] buffer;
thumbnail_pixbuf.save_to_buffer(out buffer, IMAGE_TYPE);
- string base_64 = GLib.Base64.encode(buffer);
- string uri = @"data:$MIME_TYPE;base64,$base_64";
- Xep.JingleContentThumbnails.Thumbnail thumbnail = new Xep.JingleContentThumbnails.Thumbnail();
- thumbnail.uri = uri;
+ var thumbnail = new Xep.JingleContentThumbnails.Thumbnail();
+ thumbnail.data = new Bytes.take(buffer);
thumbnail.media_type = MIME_TYPE;
thumbnail.width = thumbnail_width;
thumbnail.height = thumbnail_height;
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 fa848c6d..dae245e4 100644
--- a/main/src/ui/conversation_content_view/file_image_widget.vala
+++ b/main/src/ui/conversation_content_view/file_image_widget.vala
@@ -217,11 +217,7 @@ public class FileImageWidget : Widget {
}
public static Pixbuf? parse_thumbnail(Xep.JingleContentThumbnails.Thumbnail thumbnail) {
- Bytes? data = Xep.BitsOfBinary.get_data_for_uri(thumbnail.uri);
- if (data == null) {
- warning("Couldn't parse data from uri: %s", thumbnail.uri);
- }
- MemoryInputStream input_stream = new MemoryInputStream.from_data(data.get_data());
+ MemoryInputStream input_stream = new MemoryInputStream.from_data(thumbnail.data.get_data());
return new Pixbuf.from_stream(input_stream);
}
diff --git a/main/src/ui/util/preference_group.vala b/main/src/ui/util/preference_group.vala
index 0a8e37c7..6056f2c8 100644
--- a/main/src/ui/util/preference_group.vala
+++ b/main/src/ui/util/preference_group.vala
@@ -26,7 +26,7 @@ namespace Dino.Ui.Util {
if (entry_view_model != null) {
Adw.EntryRow view = new Adw.EntryRow() { title = entry_view_model.title, show_apply_button=true };
if (preferences_row.media_uri != null) {
- var bytes = BitsOfBinary.get_data_for_uri(preferences_row.media_uri);
+ var bytes = Xmpp.get_data_for_uri(preferences_row.media_uri);
Picture picture = new Picture.for_paintable(Texture.from_bytes(bytes));
view.add_suffix(picture);
}
diff --git a/xmpp-vala/src/module/util.vala b/xmpp-vala/src/module/util.vala
index 28f1a5f8..076c327f 100644
--- a/xmpp-vala/src/module/util.vala
+++ b/xmpp-vala/src/module/util.vala
@@ -12,6 +12,18 @@ public string random_uuid() {
return "%08x-%04x-%04x-%04x-%04x%08x".printf(b1, b2, b3, b4, b5_1, b5_2);
}
+public Bytes? get_data_for_uri(string uri) {
+ if (uri.has_suffix("@bob.xmpp.org")) {
+ string cid = uri.replace("cid:", "");
+ return Xep.BitsOfBinary.known_bobs[cid];
+ } else if (uri.has_prefix("data:image/png;base64,")) {
+ return new Bytes.take(Base64.decode(uri.replace("data:image/png;base64,", "")));
+ } else {
+ warning("Couldn't parse data from uri %s", uri);
+ return null;
+ }
+}
+
public abstract class StanzaListener<T> : OrderedListener {
public abstract async bool run(XmppStream stream, T stanza);
diff --git a/xmpp-vala/src/module/xep/0231_bits_of_binary.vala b/xmpp-vala/src/module/xep/0231_bits_of_binary.vala
index cd756b5e..7e811045 100644
--- a/xmpp-vala/src/module/xep/0231_bits_of_binary.vala
+++ b/xmpp-vala/src/module/xep/0231_bits_of_binary.vala
@@ -6,16 +6,6 @@ namespace Xmpp.Xep.BitsOfBinary {
public static HashMap<string, Bytes> known_bobs = null;
- public Bytes? get_data_for_uri(string uri) {
- if (uri.has_suffix("@bob.xmpp.org")) {
- string cid = uri.replace("cid:", "");
- return BitsOfBinary.known_bobs[cid];
- } else if (uri.has_prefix("data:image/png;base64,")) {
- return new Bytes.take(Base64.decode(uri.replace("data:image/png;base64,", "")));
- }
- return null;
- }
-
public class Module : XmppStreamModule {
public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "bits_of_binary");
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 5dba0c6d..d408e94b 100644
--- a/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala
+++ b/xmpp-vala/src/module/xep/0264_jingle_content_thumbnails.vala
@@ -13,15 +13,16 @@ namespace Xmpp.Xep.JingleContentThumbnails {
}
public class Thumbnail {
- public string uri;
public Bytes data;
public string? media_type;
public int width;
public int height;
public StanzaNode to_stanza_node() {
+ string data_uri = "data:image/png;base64," + Base64.encode(data.get_data());
+
StanzaNode node = new StanzaNode.build("thumbnail", NS_URI).add_self_xmlns()
- .put_attribute("uri", this.uri);
+ .put_attribute("uri", data_uri);
if (this.media_type != null) {
node.put_attribute("media-type", this.media_type);
}
@@ -38,17 +39,9 @@ namespace Xmpp.Xep.JingleContentThumbnails {
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;
- }
+ Bytes data = Xmpp.get_data_for_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");