xmpp-parsers: Add support for Jingle Grouping Framework (XEP-0338).

Emmanuel Gil Peyrot created

Change summary

xmpp-parsers/doap.xml               |  8 ++
xmpp-parsers/src/jingle_grouping.rs | 91 +++++++++++++++++++++++++++++++
xmpp-parsers/src/lib.rs             |  3 +
xmpp-parsers/src/ns.rs              |  3 +
4 files changed, 105 insertions(+)

Detailed changes

xmpp-parsers/doap.xml 🔗

@@ -435,6 +435,14 @@
             <xmpp:since>0.16.0</xmpp:since>
         </xmpp:SupportedXep>
     </implements>
+    <implements>
+        <xmpp:SupportedXep>
+            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0338.html"/>
+            <xmpp:status>complete</xmpp:status>
+            <xmpp:version>1.0.0</xmpp:version>
+            <xmpp:since>NEXT</xmpp:since>
+        </xmpp:SupportedXep>
+    </implements>
     <implements>
         <xmpp:SupportedXep>
             <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0339.html"/>

xmpp-parsers/src/jingle_grouping.rs 🔗

@@ -0,0 +1,91 @@
+// Copyright (c) 2020 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use crate::jingle::ContentId;
+
+generate_attribute!(
+    /// The semantics of the grouping.
+    Semantics, "semantics", {
+        /// Lip synchronsation.
+        Ls => "LS",
+
+        /// Bundle.
+        Bundle => "BUNDLE",
+    }
+);
+
+generate_element!(
+    #[derive(PartialEq)]
+    /// Describes a content that should be grouped with other ones.
+    Content, "content", JINGLE_GROUPING,
+    attributes: [
+        /// The name of the matching [`Content`](crate::jingle::Content).
+        name: Required<ContentId> = "name",
+    ]
+);
+
+impl Content {
+    /// Creates a new <content/> element.
+    pub fn new(name: &str) -> Content {
+        Content {
+            name: ContentId(name.to_string()),
+        }
+    }
+}
+
+generate_element!(
+    /// A semantic group of contents.
+    Group, "group", JINGLE_GROUPING,
+    attributes: [
+        /// Semantics of the grouping.
+        semantics: Required<Semantics> = "semantics",
+    ],
+    children: [
+        /// List of contents that should be grouped with each other.
+        contents: Vec<Content> = ("content", JINGLE_GROUPING) => Content
+    ]
+);
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::Element;
+    use std::convert::TryFrom;
+
+    #[cfg(target_pointer_width = "32")]
+    #[test]
+    fn test_size() {
+        assert_size!(Semantics, 1);
+        assert_size!(Content, 12);
+        assert_size!(Group, 16);
+    }
+
+    #[cfg(target_pointer_width = "64")]
+    #[test]
+    fn test_size() {
+        assert_size!(Semantics, 1);
+        assert_size!(Content, 24);
+        assert_size!(Group, 32);
+    }
+
+    #[test]
+    fn parse_group() {
+        let elem: Element = "
+        <group xmlns='urn:xmpp:jingle:apps:grouping:0' semantics='BUNDLE'>
+            <content name='voice'/>
+            <content name='webcam'/>
+        </group>"
+            .parse()
+            .unwrap();
+        let group = Group::try_from(elem).unwrap();
+        assert_eq!(group.semantics, Semantics::Bundle);
+        assert_eq!(group.contents.len(), 2);
+        assert_eq!(
+            group.contents,
+            &[Content::new("voice"), Content::new("webcam")]
+        );
+    }
+}

xmpp-parsers/src/lib.rs 🔗

@@ -189,6 +189,9 @@ pub mod jingle_dtls_srtp;
 /// XEP-0328: JID Prep
 pub mod jid_prep;
 
+/// XEP-0338: Jingle Grouping Framework
+pub mod jingle_grouping;
+
 /// XEP-0339: Source-Specific Media Attributes in Jingle
 pub mod jingle_ssma;
 

xmpp-parsers/src/ns.rs 🔗

@@ -198,6 +198,9 @@ pub const JINGLE_DTLS: &str = "urn:xmpp:jingle:apps:dtls:0";
 /// XEP-0328: JID Prep
 pub const JID_PREP: &str = "urn:xmpp:jidprep:0";
 
+/// XEP-0338: Jingle Grouping Framework
+pub const JINGLE_GROUPING: &str = "urn:xmpp:jingle:apps:grouping:0";
+
 /// XEP-0339: Source-Specific Media Attributes in Jingle
 pub const JINGLE_SSMA: &str = "urn:xmpp:jingle:apps:rtp:ssma:0";