Prepare for merge: Move all xmpp-parsers files into xmpp-parsers/
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
parent
8a13d7f010
commit
dc76f296de
79 changed files with 0 additions and 0 deletions
227
xmpp-parsers/src/sm.rs
Normal file
227
xmpp-parsers/src/sm.rs
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
// Copyright (c) 2018 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::stanza_error::DefinedCondition;
|
||||
|
||||
generate_element!(
|
||||
/// Acknowledgement of the currently received stanzas.
|
||||
A, "a", SM,
|
||||
attributes: [
|
||||
/// The last handled stanza.
|
||||
h: Required<u32> = "h",
|
||||
]
|
||||
);
|
||||
|
||||
impl A {
|
||||
/// Generates a new `<a/>` element.
|
||||
pub fn new(h: u32) -> A {
|
||||
A { h }
|
||||
}
|
||||
}
|
||||
|
||||
generate_attribute!(
|
||||
/// Whether to allow resumption of a previous stream.
|
||||
ResumeAttr,
|
||||
"resume",
|
||||
bool
|
||||
);
|
||||
|
||||
generate_element!(
|
||||
/// Client request for enabling stream management.
|
||||
#[derive(Default)]
|
||||
Enable, "enable", SM,
|
||||
attributes: [
|
||||
/// The preferred resumption time in seconds by the client.
|
||||
// TODO: should be the infinite integer set ≥ 1.
|
||||
max: Option<u32> = "max",
|
||||
|
||||
/// Whether the client wants to be allowed to resume the stream.
|
||||
resume: Default<ResumeAttr> = "resume",
|
||||
]
|
||||
);
|
||||
|
||||
impl Enable {
|
||||
/// Generates a new `<enable/>` element.
|
||||
pub fn new() -> Self {
|
||||
Enable::default()
|
||||
}
|
||||
|
||||
/// Sets the preferred resumption time in seconds.
|
||||
pub fn with_max(mut self, max: u32) -> Self {
|
||||
self.max = Some(max);
|
||||
self
|
||||
}
|
||||
|
||||
/// Asks for resumption to be possible.
|
||||
pub fn with_resume(mut self) -> Self {
|
||||
self.resume = ResumeAttr::True;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
generate_id!(
|
||||
/// A random identifier used for stream resumption.
|
||||
StreamId
|
||||
);
|
||||
|
||||
generate_element!(
|
||||
/// Server response once stream management is enabled.
|
||||
Enabled, "enabled", SM,
|
||||
attributes: [
|
||||
/// A random identifier used for stream resumption.
|
||||
id: Option<StreamId> = "id",
|
||||
|
||||
/// The preferred IP, domain, IP:port or domain:port location for
|
||||
/// resumption.
|
||||
location: Option<String> = "location",
|
||||
|
||||
/// The preferred resumption time in seconds by the server.
|
||||
// TODO: should be the infinite integer set ≥ 1.
|
||||
max: Option<u32> = "max",
|
||||
|
||||
/// Whether stream resumption is allowed.
|
||||
resume: Default<ResumeAttr> = "resume",
|
||||
]
|
||||
);
|
||||
|
||||
generate_element!(
|
||||
/// A stream management error happened.
|
||||
Failed, "failed", SM,
|
||||
attributes: [
|
||||
/// The last handled stanza.
|
||||
h: Option<u32> = "h",
|
||||
],
|
||||
children: [
|
||||
/// The error returned.
|
||||
// XXX: implement the * handling.
|
||||
error: Option<DefinedCondition> = ("*", XMPP_STANZAS) => DefinedCondition
|
||||
]
|
||||
);
|
||||
|
||||
generate_empty_element!(
|
||||
/// Requests the currently received stanzas by the other party.
|
||||
R,
|
||||
"r",
|
||||
SM
|
||||
);
|
||||
|
||||
generate_element!(
|
||||
/// Requests a stream resumption.
|
||||
Resume, "resume", SM,
|
||||
attributes: [
|
||||
/// The last handled stanza.
|
||||
h: Required<u32> = "h",
|
||||
|
||||
/// The previous id given by the server on
|
||||
/// [enabled](struct.Enabled.html).
|
||||
previd: Required<StreamId> = "previd",
|
||||
]
|
||||
);
|
||||
|
||||
generate_element!(
|
||||
/// The response by the server for a successfully resumed stream.
|
||||
Resumed, "resumed", SM,
|
||||
attributes: [
|
||||
/// The last handled stanza.
|
||||
h: Required<u32> = "h",
|
||||
|
||||
/// The previous id given by the server on
|
||||
/// [enabled](struct.Enabled.html).
|
||||
previd: Required<StreamId> = "previd",
|
||||
]
|
||||
);
|
||||
|
||||
// TODO: add support for optional and required.
|
||||
generate_empty_element!(
|
||||
/// Represents availability of Stream Management in `<stream:features/>`.
|
||||
StreamManagement,
|
||||
"sm",
|
||||
SM
|
||||
);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::Element;
|
||||
use std::convert::TryFrom;
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
#[test]
|
||||
fn test_size() {
|
||||
assert_size!(A, 4);
|
||||
assert_size!(ResumeAttr, 1);
|
||||
assert_size!(Enable, 12);
|
||||
assert_size!(StreamId, 12);
|
||||
assert_size!(Enabled, 36);
|
||||
assert_size!(Failed, 12);
|
||||
assert_size!(R, 0);
|
||||
assert_size!(Resume, 16);
|
||||
assert_size!(Resumed, 16);
|
||||
assert_size!(StreamManagement, 0);
|
||||
}
|
||||
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
#[test]
|
||||
fn test_size() {
|
||||
assert_size!(A, 4);
|
||||
assert_size!(ResumeAttr, 1);
|
||||
assert_size!(Enable, 12);
|
||||
assert_size!(StreamId, 24);
|
||||
assert_size!(Enabled, 64);
|
||||
assert_size!(Failed, 12);
|
||||
assert_size!(R, 0);
|
||||
assert_size!(Resume, 32);
|
||||
assert_size!(Resumed, 32);
|
||||
assert_size!(StreamManagement, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a() {
|
||||
let elem: Element = "<a xmlns='urn:xmpp:sm:3' h='5'".parse().unwrap();
|
||||
let a = A::try_from(elem).unwrap();
|
||||
assert_eq!(a.h, 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stream_feature() {
|
||||
let elem: Element = "<sm xmlns='urn:xmpp:sm:3'/>".parse().unwrap();
|
||||
StreamManagement::try_from(elem).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn resume() {
|
||||
let elem: Element = "<enable xmlns='urn:xmpp:sm:3' resume='true'/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let enable = Enable::try_from(elem).unwrap();
|
||||
assert_eq!(enable.max, None);
|
||||
assert_eq!(enable.resume, ResumeAttr::True);
|
||||
|
||||
let elem: Element = "<enabled xmlns='urn:xmpp:sm:3' resume='true' id='coucou' max='600'/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let enabled = Enabled::try_from(elem).unwrap();
|
||||
let previd = enabled.id.unwrap();
|
||||
assert_eq!(enabled.resume, ResumeAttr::True);
|
||||
assert_eq!(previd, StreamId(String::from("coucou")));
|
||||
assert_eq!(enabled.max, Some(600));
|
||||
assert_eq!(enabled.location, None);
|
||||
|
||||
let elem: Element = "<resume xmlns='urn:xmpp:sm:3' h='5' previd='coucou'/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let resume = Resume::try_from(elem).unwrap();
|
||||
assert_eq!(resume.h, 5);
|
||||
assert_eq!(resume.previd, previd);
|
||||
|
||||
let elem: Element = "<resumed xmlns='urn:xmpp:sm:3' h='5' previd='coucou'/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let resumed = Resumed::try_from(elem).unwrap();
|
||||
assert_eq!(resumed.h, 5);
|
||||
assert_eq!(resumed.previd, previd);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue