From 40d397c1fe32dd929998b22ad97be798ff97d0ed Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 27 Feb 2019 18:13:06 +0100 Subject: [PATCH] jingle_rtp: Add a new parser/serialiser for XEP-0167. --- src/jingle_rtp.rs | 141 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 + src/ns.rs | 7 +++ 3 files changed, 151 insertions(+) create mode 100644 src/jingle_rtp.rs diff --git a/src/jingle_rtp.rs b/src/jingle_rtp.rs new file mode 100644 index 0000000..1ab50d4 --- /dev/null +++ b/src/jingle_rtp.rs @@ -0,0 +1,141 @@ +// Copyright (c) 2019 Emmanuel Gil Peyrot +// +// 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 std::num::ParseIntError; +use std::str::FromStr; +use minidom::IntoAttributeValue; + +generate_element!( + /// Wrapper element describing an RTP session. + Description, "description", JINGLE_RTP, + attributes: [ + /// Namespace of the encryption scheme used. + media: Required = "media", + + /// User-friendly name for the encryption scheme, should be `None` for OTR, + /// legacy OpenPGP and OX. + // XXX: is this a String or an u32?! Refer to RFC 3550. + ssrc: Option = "ssrc", + ], + children: [ + /// List of encodings that can be used for this RTP stream. + payload_types: Vec = ("payload-type", JINGLE_RTP) => PayloadType + + // TODO: Add support for and . + ] +); + +/// The number of channels. +#[derive(Debug, Clone)] +pub struct Channels(pub u8); + +impl Default for Channels { + fn default() -> Channels { + Channels(1) + } +} + +impl FromStr for Channels { + type Err = ParseIntError; + + fn from_str(s: &str) -> Result { + Ok(Channels(u8::from_str(s)?)) + } +} + +impl IntoAttributeValue for Channels { + fn into_attribute_value(self) -> Option { + if self.0 == 1 { + None + } else { + Some(format!("{}", self.0)) + } + } +} + +generate_element!( + /// An encoding that can be used for an RTP stream. + PayloadType, "payload-type", JINGLE_RTP, + attributes: [ + /// The number of channels. + channels: Default = "channels", + + /// The sampling frequency in Hertz. + clockrate: Option = "clockrate", + + /// The payload identifier. + id: Required = "id", + + /// Maximum packet time as specified in RFC 4566. + maxptime: Option = "maxptime", + + /// The appropriate subtype of the MIME type. + name: Option = "name", + + /// Packet time as specified in RFC 4566. + ptime: Option = "ptime", + ], + children: [ + /// List of parameters specifying this payload-type. + /// + /// Their order MUST be ignored. + parameters: Vec = ("parameter", JINGLE_RTP) => Parameter + ] +); + +generate_element!( + /// Parameter related to a payload. + Parameter, "parameter", JINGLE_RTP, + attributes: [ + /// The name of the parameter, from the list at + /// https://www.iana.org/assignments/sdp-parameters/sdp-parameters.xhtml + name: Required = "name", + + /// The value of this parameter. + value: Required = "value", + ] +); + +#[cfg(test)] +mod tests { + use super::*; + use minidom::Element; + use try_from::TryFrom; + + #[test] + fn test_simple() { + let elem: Element = " + + + + + + + + + + + + + + + + + + + + + + + +" + .parse() + .unwrap(); + let desc = Description::try_from(elem).unwrap(); + assert_eq!(desc.media, "audio"); + assert_eq!(desc.ssrc, None); + } +} diff --git a/src/lib.rs b/src/lib.rs index 765c9a1..773c120 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,6 +104,9 @@ pub mod caps; /// XEP-0166: Jingle pub mod jingle; +/// XEP-0167: Jingle RTP Sessions +pub mod jingle_rtp; + /// XEP-0172: User Nickname pub mod nick; diff --git a/src/ns.rs b/src/ns.rs index 7aa4768..f825d4d 100644 --- a/src/ns.rs +++ b/src/ns.rs @@ -82,6 +82,13 @@ pub const CAPS: &str = "http://jabber.org/protocol/caps"; /// XEP-0166: Jingle pub const JINGLE: &str = "urn:xmpp:jingle:1"; +/// XEP-0167: Jingle RTP Sessions +pub const JINGLE_RTP: &str = "urn:xmpp:jingle:apps:rtp:1"; +/// XEP-0167: Jingle RTP Sessions +pub const JINGLE_RTP_AUDIO: &str = "urn:xmpp:jingle:apps:rtp:audio"; +/// XEP-0167: Jingle RTP Sessions +pub const JINGLE_RTP_VIDEO: &str = "urn:xmpp:jingle:apps:rtp:video"; + /// XEP-0172: User Nickname pub const NICK: &str = "http://jabber.org/protocol/nick";