aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/module/xep/0446_file_metadata_element.vala
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/module/xep/0446_file_metadata_element.vala')
-rw-r--r--xmpp-vala/src/module/xep/0446_file_metadata_element.vala120
1 files changed, 120 insertions, 0 deletions
diff --git a/xmpp-vala/src/module/xep/0446_file_metadata_element.vala b/xmpp-vala/src/module/xep/0446_file_metadata_element.vala
new file mode 100644
index 00000000..d7fbb06f
--- /dev/null
+++ b/xmpp-vala/src/module/xep/0446_file_metadata_element.vala
@@ -0,0 +1,120 @@
+using Xmpp.Xep.CryptographicHashes;
+
+namespace Xmpp.Xep.FileMetadataElement {
+ public const string NS_URI = "urn:xmpp:file:metadata:0";
+
+ public class FileMetadata {
+ public string name { get; set; }
+ public string? mime_type { get; set; }
+ public int64 size { get; set; default=-1; }
+ public string? desc { get; set; }
+ public DateTime? date { get; set; }
+ public int width { get; set; default=-1; } // Width of image in pixels
+ public int height { get; set; default=-1; } // Height of image in pixels
+ public CryptographicHashes.Hashes hashes = new CryptographicHashes.Hashes();
+ public int64 length { get; set; default=-1; } // Length of audio/video in milliseconds
+ public Gee.List<Xep.JingleContentThumbnails.Thumbnail> thumbnails = new Gee.ArrayList<Xep.JingleContentThumbnails.Thumbnail>();
+
+ public StanzaNode to_stanza_node() {
+ StanzaNode node = new StanzaNode.build("file", NS_URI).add_self_xmlns()
+ .put_node(new StanzaNode.build("name", NS_URI).put_node(new StanzaNode.text(this.name)));
+ if (this.mime_type != null) {
+ node.put_node(new StanzaNode.build("media_type", NS_URI).put_node(new StanzaNode.text(this.mime_type)));
+ }
+ if (this.size != -1) {
+ node.put_node(new StanzaNode.build("size", NS_URI).put_node(new StanzaNode.text(this.size.to_string())));
+ }
+ if (this.date != null) {
+ node.put_node(new StanzaNode.build("date", NS_URI).put_node(new StanzaNode.text(this.date.to_string())));
+ }
+ if (this.desc != null) {
+ node.put_node(new StanzaNode.build("desc", NS_URI).put_node(new StanzaNode.text(this.desc)));
+ }
+ if (this.width != -1) {
+ node.put_node(new StanzaNode.build("width", NS_URI).put_node(new StanzaNode.text(this.width.to_string())));
+ }
+ if (this.height != -1) {
+ node.put_node(new StanzaNode.build("height", NS_URI).put_node(new StanzaNode.text(this.height.to_string())));
+ }
+ if (this.length != -1) {
+ node.put_node(new StanzaNode.build("length", NS_URI).put_node(new StanzaNode.text(this.length.to_string())));
+ }
+ node.sub_nodes.add_all(this.hashes.to_stanza_nodes());
+ foreach (Xep.JingleContentThumbnails.Thumbnail thumbnail in this.thumbnails) {
+ node.put_node(thumbnail.to_stanza_node());
+ }
+ return node;
+ }
+
+ public void add_to_message(MessageStanza message) {
+ StanzaNode node = this.to_stanza_node();
+ printerr("Attaching file metadata:\n");
+ printerr("%s\n", node.to_ansi_string(true));
+ message.stanza.put_node(node);
+ }
+
+ public static FileMetadata? from_stanza_node(StanzaNode node) {
+ FileMetadata metadata = new FileMetadata();
+ // TODO: null checks on final values
+ StanzaNode? name_node = node.get_subnode("name");
+ if (name_node == null || name_node.get_string_content() == null) {
+ return null;
+ } else {
+ metadata.name = name_node.get_string_content();
+ }
+ StanzaNode? desc_node = node.get_subnode("desc");
+ if (desc_node != null && desc_node.get_string_content() != null) {
+ metadata.desc = desc_node.get_string_content();
+ }
+ StanzaNode? mime_node = node.get_subnode("media_type");
+ if (mime_node != null && mime_node.get_string_content() != null) {
+ metadata.mime_type = mime_node.get_string_content();
+ }
+ StanzaNode? size_node = node.get_subnode("size");
+ if (size_node != null && size_node.get_string_content() != null) {
+ metadata.size = int64.parse(size_node.get_string_content());
+ }
+ StanzaNode? date_node = node.get_subnode("date");
+ if (date_node != null && date_node.get_string_content() != null) {
+ metadata.date = new DateTime.from_iso8601(date_node.get_string_content(), null);
+ }
+ StanzaNode? width_node = node.get_subnode("width");
+ if (width_node != null && width_node.get_string_content() != null) {
+ metadata.width = int.parse(width_node.get_string_content());
+ }
+ StanzaNode? height_node = node.get_subnode("height");
+ if (height_node != null && height_node.get_string_content() != null) {
+ metadata.height = int.parse(height_node.get_string_content());
+ }
+ StanzaNode? length_node = node.get_subnode("length");
+ if (length_node != null && length_node.get_string_content() != null) {
+ metadata.length = int.parse(length_node.get_string_content());
+ }
+ foreach (StanzaNode thumbnail_node in node.get_subnodes(Xep.JingleContentThumbnails.STANZA_NAME, Xep.JingleContentThumbnails.NS_URI)) {
+ Xep.JingleContentThumbnails.Thumbnail? thumbnail = Xep.JingleContentThumbnails.Thumbnail.from_stanza_node(thumbnail_node);
+ if (thumbnail != null) {
+ metadata.thumbnails.add(thumbnail);
+ }
+ }
+ metadata.hashes = new CryptographicHashes.Hashes.from_stanza_subnodes(node);
+ return metadata;
+ }
+
+ public static FileMetadata? from_message(MessageStanza message) {
+ StanzaNode? node = message.stanza.get_subnode("file", NS_URI);
+ if (node == null) {
+ return null;
+ }
+ printerr("Parsing metadata from message:\n");
+ printerr("%s\n", node.to_xml());
+ FileMetadata metadata = FileMetadata.from_stanza_node(node);
+ if (metadata != null) {
+ printerr("Parsed metadata:\n");
+ printerr("%s\n", metadata.to_stanza_node().to_ansi_string(true));
+ } else {
+ printerr("Failed to parse metadata!\n");
+ }
+ return FileMetadata.from_stanza_node(node);
+ }
+ }
+}