mirror of
https://gitlab.com/xmpp-rs/xmpp-rs.git
synced 2024-07-12 22:21:53 +00:00
jingle: Make description and transport optional in content.
This commit is contained in:
parent
8fbda37f6b
commit
f99c667eab
1 changed files with 13 additions and 54 deletions
|
@ -150,9 +150,9 @@ pub struct Content {
|
||||||
pub disposition: String,
|
pub disposition: String,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub senders: Senders,
|
pub senders: Senders,
|
||||||
pub description: (String, Element),
|
pub description: Option<Element>,
|
||||||
pub transport: (String, Element),
|
pub transport: Option<Element>,
|
||||||
pub security: Option<(String, Element)>,
|
pub security: Option<Element>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
@ -287,48 +287,19 @@ impl<'a> TryFrom<&'a Element> for Jingle {
|
||||||
if description.is_some() {
|
if description.is_some() {
|
||||||
return Err(Error::ParseError("Content must not have more than one description."));
|
return Err(Error::ParseError("Content must not have more than one description."));
|
||||||
}
|
}
|
||||||
let namespace = stuff.ns()
|
description = Some(stuff.clone());
|
||||||
.and_then(|ns| ns.parse().ok())
|
|
||||||
// TODO: is this even reachable?
|
|
||||||
.ok_or(Error::ParseError("Invalid namespace on description element."))?;
|
|
||||||
description = Some((
|
|
||||||
namespace,
|
|
||||||
stuff.clone(),
|
|
||||||
));
|
|
||||||
} else if stuff.name() == "transport" {
|
} else if stuff.name() == "transport" {
|
||||||
if transport.is_some() {
|
if transport.is_some() {
|
||||||
return Err(Error::ParseError("Content must not have more than one transport."));
|
return Err(Error::ParseError("Content must not have more than one transport."));
|
||||||
}
|
}
|
||||||
let namespace = stuff.ns()
|
transport = Some(stuff.clone());
|
||||||
.and_then(|ns| ns.parse().ok())
|
|
||||||
// TODO: is this even reachable?
|
|
||||||
.ok_or(Error::ParseError("Invalid namespace on transport element."))?;
|
|
||||||
transport = Some((
|
|
||||||
namespace,
|
|
||||||
stuff.clone(),
|
|
||||||
));
|
|
||||||
} else if stuff.name() == "security" {
|
} else if stuff.name() == "security" {
|
||||||
if security.is_some() {
|
if security.is_some() {
|
||||||
return Err(Error::ParseError("Content must not have more than one security."));
|
return Err(Error::ParseError("Content must not have more than one security."));
|
||||||
}
|
}
|
||||||
let namespace = stuff.ns()
|
security = Some(stuff.clone());
|
||||||
.and_then(|ns| ns.parse().ok())
|
|
||||||
// TODO: is this even reachable?
|
|
||||||
.ok_or(Error::ParseError("Invalid namespace on security element."))?;
|
|
||||||
security = Some((
|
|
||||||
namespace,
|
|
||||||
stuff.clone(),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if description.is_none() {
|
|
||||||
return Err(Error::ParseError("Content must have one description."));
|
|
||||||
}
|
|
||||||
if transport.is_none() {
|
|
||||||
return Err(Error::ParseError("Content must have one transport."));
|
|
||||||
}
|
|
||||||
let description = description.unwrap().to_owned();
|
|
||||||
let transport = transport.unwrap().to_owned();
|
|
||||||
contents.push(Content {
|
contents.push(Content {
|
||||||
creator: creator,
|
creator: creator,
|
||||||
disposition: disposition.to_owned(),
|
disposition: disposition.to_owned(),
|
||||||
|
@ -391,10 +362,14 @@ impl<'a> Into<Element> for &'a Content {
|
||||||
.attr("name", self.name.clone())
|
.attr("name", self.name.clone())
|
||||||
.attr("senders", String::from(self.senders.clone()))
|
.attr("senders", String::from(self.senders.clone()))
|
||||||
.build();
|
.build();
|
||||||
root.append_child(self.description.1.clone());
|
if let Some(description) = self.description.clone() {
|
||||||
root.append_child(self.transport.1.clone());
|
root.append_child(description);
|
||||||
|
}
|
||||||
|
if let Some(transport) = self.transport.clone() {
|
||||||
|
root.append_child(transport);
|
||||||
|
}
|
||||||
if let Some(security) = self.security.clone() {
|
if let Some(security) = self.security.clone() {
|
||||||
root.append_child(security.1.clone());
|
root.append_child(security);
|
||||||
}
|
}
|
||||||
root
|
root
|
||||||
}
|
}
|
||||||
|
@ -529,22 +504,6 @@ mod tests {
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
};
|
};
|
||||||
assert_eq!(message, "Unknown senders.");
|
assert_eq!(message, "Unknown senders.");
|
||||||
|
|
||||||
let elem: Element = "<jingle xmlns='urn:xmpp:jingle:1' action='session-initiate' sid='coucou'><content creator='initiator' name='coucou'/></jingle>".parse().unwrap();
|
|
||||||
let error = Jingle::try_from(&elem).unwrap_err();
|
|
||||||
let message = match error {
|
|
||||||
Error::ParseError(string) => string,
|
|
||||||
_ => panic!(),
|
|
||||||
};
|
|
||||||
assert_eq!(message, "Content must have one description.");
|
|
||||||
|
|
||||||
let elem: Element = "<jingle xmlns='urn:xmpp:jingle:1' action='session-initiate' sid='coucou'><content creator='initiator' name='coucou'><description/></content></jingle>".parse().unwrap();
|
|
||||||
let error = Jingle::try_from(&elem).unwrap_err();
|
|
||||||
let message = match error {
|
|
||||||
Error::ParseError(string) => string,
|
|
||||||
_ => panic!(),
|
|
||||||
};
|
|
||||||
assert_eq!(message, "Content must have one transport.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue