xmpp-parsers: Implement XEP-0507: Jingle Content Category
This gives the semantic of each video contents in a Jingle session.
This commit is contained in:
parent
628c2113d0
commit
4f11d2fe5c
5 changed files with 102 additions and 0 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
Version NEXT:
|
Version NEXT:
|
||||||
XXXX-YY-ZZ RELEASER <admin@example.com>
|
XXXX-YY-ZZ RELEASER <admin@example.com>
|
||||||
|
* New parsers/serialisers:
|
||||||
|
- Jingle Content Category (XEP-0507)
|
||||||
* Breaking
|
* Breaking
|
||||||
- The type of jingle_rtp::Description::ssrc has been changed from
|
- The type of jingle_rtp::Description::ssrc has been changed from
|
||||||
Option<String> to Option<u32>, in accordance with XEP-0167 version
|
Option<String> to Option<u32>, in accordance with XEP-0167 version
|
||||||
|
|
|
||||||
|
|
@ -706,6 +706,14 @@
|
||||||
<xmpp:since>0.22.0</xmpp:since>
|
<xmpp:since>0.22.0</xmpp:since>
|
||||||
</xmpp:SupportedXep>
|
</xmpp:SupportedXep>
|
||||||
</implements>
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0507.html"/>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:version>0.1.0</xmpp:version>
|
||||||
|
<xmpp:since>NEXT</xmpp:since>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
|
||||||
<release>
|
<release>
|
||||||
<Version>
|
<Version>
|
||||||
|
|
|
||||||
86
parsers/src/jingle_content.rs
Normal file
86
parsers/src/jingle_content.rs
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
// Copyright (c) 2026 Link Mauve <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 xso::{AsXml, FromXml};
|
||||||
|
|
||||||
|
use crate::ns;
|
||||||
|
|
||||||
|
generate_attribute!(
|
||||||
|
/// The RFC4796 SDP 'content' attribute.
|
||||||
|
Name, "name", {
|
||||||
|
/// The media stream includes presentation slides.
|
||||||
|
Slides => "slides",
|
||||||
|
|
||||||
|
/// The media stream contains the image of the speaker.
|
||||||
|
Speaker => "speaker",
|
||||||
|
|
||||||
|
/// The media stream contains sign language.
|
||||||
|
Sl => "sl",
|
||||||
|
|
||||||
|
/// The media stream is taken from the main source.
|
||||||
|
Main => "main",
|
||||||
|
|
||||||
|
/// The media stream is taken from the alternative source.
|
||||||
|
Alt => "alt",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Wrapper element around the Jingle content category.
|
||||||
|
#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
|
||||||
|
#[xml(namespace = ns::JINGLE_CONTENT, name = "category")]
|
||||||
|
pub struct Category {
|
||||||
|
/// The actual category being specified.
|
||||||
|
#[xml(attribute)]
|
||||||
|
name: Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use minidom::Element;
|
||||||
|
use xso::error::{Error, FromElementError};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_size() {
|
||||||
|
assert_size!(Category, 1);
|
||||||
|
assert_size!(Name, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_category() {
|
||||||
|
let elem: Element = "<category xmlns='urn:xmpp:jingle:apps:category:0' name='slides'/>"
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
let category = Category::try_from(elem).unwrap();
|
||||||
|
assert_eq!(category.name, Name::Slides);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invalid_category() {
|
||||||
|
let elem: Element = "<category xmlns='urn:xmpp:jingle:apps:category:0'/>"
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
let error = Category::try_from(elem).unwrap_err();
|
||||||
|
let message = match error {
|
||||||
|
FromElementError::Invalid(Error::Other(string)) => string,
|
||||||
|
_ => panic!(),
|
||||||
|
};
|
||||||
|
assert_eq!(
|
||||||
|
message,
|
||||||
|
"Required attribute field 'name' on Category element missing."
|
||||||
|
);
|
||||||
|
|
||||||
|
let elem: Element = "<category xmlns='urn:xmpp:jingle:apps:category:0' name='anime'/>"
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
let error = Category::try_from(elem).unwrap_err();
|
||||||
|
let message = match error {
|
||||||
|
FromElementError::Invalid(Error::TextParseError(string)) => string,
|
||||||
|
_ => panic!(),
|
||||||
|
};
|
||||||
|
assert_eq!(message.to_string(), "Unknown value for 'name' attribute.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -314,6 +314,9 @@ pub mod fast;
|
||||||
/// XEP-0490: Message Displayed Synchronization
|
/// XEP-0490: Message Displayed Synchronization
|
||||||
pub mod message_displayed;
|
pub mod message_displayed;
|
||||||
|
|
||||||
|
/// XEP-0507: Jingle Content Category
|
||||||
|
pub mod jingle_content;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
|
|
@ -310,6 +310,9 @@ pub const FAST: &str = "urn:xmpp:fast:0";
|
||||||
/// XEP-0490: Message Displayed Synchronization
|
/// XEP-0490: Message Displayed Synchronization
|
||||||
pub const MDS: &str = "urn:xmpp:mds:displayed:0";
|
pub const MDS: &str = "urn:xmpp:mds:displayed:0";
|
||||||
|
|
||||||
|
/// XEP-0507: Jingle Content Category
|
||||||
|
pub const JINGLE_CONTENT: &str = "urn:xmpp:jingle:apps:category:0";
|
||||||
|
|
||||||
/// Alias for the main namespace of the stream, that is "jabber:client" when
|
/// Alias for the main namespace of the stream, that is "jabber:client" when
|
||||||
/// the component feature isn’t enabled.
|
/// the component feature isn’t enabled.
|
||||||
#[cfg(not(feature = "component"))]
|
#[cfg(not(feature = "component"))]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue