git » sdk » commit bf8d3cb

Parse name, size, and hashes from SIMS

author Stephen Paul Weber
2023-11-29 16:40:01 UTC
committer Stephen Paul Weber
2023-12-11 15:59:51 UTC
parent 3123e9bb88cc2214baa203a4dae72b795a0fd1db

Parse name, size, and hashes from SIMS

xmpp/ChatMessage.hx +18 -3

diff --git a/xmpp/ChatMessage.hx b/xmpp/ChatMessage.hx
index eb7b777..bc5a07d 100644
--- a/xmpp/ChatMessage.hx
+++ b/xmpp/ChatMessage.hx
@@ -1,5 +1,8 @@
 package xmpp;
 
+import haxe.crypto.Base64;
+import haxe.io.Bytes;
+import haxe.io.BytesData;
 import haxe.Exception;
 using Lambda;
 
@@ -21,12 +24,18 @@ enum MessageStatus {
 }
 
 class ChatAttachment {
+	public final name: Null<String>;
 	public final mime: String;
+	public final size: Null<Int>;
 	public final uris: Array<String>;
+	public final hashes: Array<{algo:String, hash:BytesData}>;
 
-	public function new(mime: String, uris: Array<String>) {
+	public function new(name: Null<String>, mime: String, size: Null<Int>, uris: Array<String>, hashes: Array<{algo:String, hash:BytesData}>) {
+		this.name = name;
 		this.mime = mime;
+		this.size = size;
 		this.uris = uris;
+		this.hashes = hashes;
 	}
 }
 
@@ -188,11 +197,17 @@ class ChatMessage {
 
 	public function attachSims(sims: Stanza) {
 		var mime = sims.findText("{urn:xmpp:jingle:apps:file-transfer:5}/media-type#");
-		if (mime == null) sims.findText("{urn:xmpp:jingle:apps:file-transfer:3}/media-type#");
+		if (mime == null) mime = sims.findText("{urn:xmpp:jingle:apps:file-transfer:3}/media-type#");
 		if (mime == null) mime = "application/octet-stream";
+		var name = sims.findText("{urn:xmpp:jingle:apps:file-transfer:5}/name#");
+		if (name == null) name = sims.findText("{urn:xmpp:jingle:apps:file-transfer:3}/name#");
+		var size = sims.findText("{urn:xmpp:jingle:apps:file-transfer:5}/size#");
+		if (size == null) size = sims.findText("{urn:xmpp:jingle:apps:file-transfer:3}/size#");
+		final hashes = ((sims.getChild("file", "urn:xmpp:jingle:apps:file-transfer:5") ?? sims.getChild("file", "urn:xmpp:jingle:apps:file-transfer:3"))
+			?.allTags("hash", "urn:xmpp:hashes:2") ?? []).map((hash) -> { algo: hash.attr.get("algo") ?? "", hash: Base64.decode(hash.getText()).getData() });
 		final sources = sims.getChild("sources");
 		final uris = (sources?.allTags("reference", "urn:xmpp:reference:0") ?? []).map((ref) -> ref.attr.get("uri") ?? "").filter((uri) -> uri != "");
-		if (uris.length > 0) attachments.push(new ChatAttachment(mime, uris));
+		if (uris.length > 0) attachments.push(new ChatAttachment(name, mime, size == null ? null : Std.parseInt(size), uris, hashes));
 	}
 
 	public function set_localId(localId:String):String {