diff --git a/xmpp-parsers/src/jingle.rs b/xmpp-parsers/src/jingle.rs index 1e357f30..78888769 100644 --- a/xmpp-parsers/src/jingle.rs +++ b/xmpp-parsers/src/jingle.rs @@ -5,6 +5,7 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. use crate::iq::IqSetPayload; +use crate::jingle_grouping::Group; use crate::jingle_ibb::Transport as IbbTransport; use crate::jingle_ice_udp::Transport as IceUdpTransport; use crate::jingle_rtp::Description as RtpDescription; @@ -560,6 +561,9 @@ pub struct Jingle { /// An optional reason. pub reason: Option, + /// An optional grouping. + pub group: Option, + /// Payloads to be included. pub other: Vec, } @@ -576,6 +580,7 @@ impl Jingle { responder: None, contents: Vec::new(), reason: None, + group: None, other: Vec::new(), } } @@ -603,6 +608,12 @@ impl Jingle { self.reason = Some(reason); self } + + /// Set the grouping in this Jingle container. + pub fn set_group(mut self, group: Group) -> Jingle { + self.group = Some(group); + self + } } impl TryFrom for Jingle { @@ -619,6 +630,7 @@ impl TryFrom for Jingle { sid: get_attr!(root, "sid", Required), contents: vec![], reason: None, + group: None, other: vec![], }; @@ -634,6 +646,14 @@ impl TryFrom for Jingle { } let reason = ReasonElement::try_from(child)?; jingle.reason = Some(reason); + } else if child.is("group", ns::JINGLE_GROUPING) { + if jingle.group.is_some() { + return Err(Error::ParseError( + "Jingle must not have more than one grouping.", + )); + } + let group = Group::try_from(child)?; + jingle.group = Some(group); } else { jingle.other.push(child); } @@ -652,6 +672,7 @@ impl From for Element { .attr("sid", jingle.sid) .append_all(jingle.contents) .append_all(jingle.reason.map(Element::from)) + .append_all(jingle.group.map(Element::from)) .build() } } @@ -672,7 +693,7 @@ mod tests { assert_size!(Reason, 1); assert_size!(ReasonElement, 16); assert_size!(SessionId, 12); - assert_size!(Jingle, 136); + assert_size!(Jingle, 152); } #[cfg(target_pointer_width = "64")] @@ -687,7 +708,7 @@ mod tests { assert_size!(Reason, 1); assert_size!(ReasonElement, 32); assert_size!(SessionId, 24); - assert_size!(Jingle, 272); + assert_size!(Jingle, 304); } #[test] @@ -876,6 +897,7 @@ mod tests { security: None, }], reason: None, + group: None, other: vec![], }; let serialized: Element = jingle.into();