jingle: Accept any unknown child, as per the specification.

Emmanuel Gil Peyrot created

Change summary

src/jingle.rs | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)

Detailed changes

src/jingle.rs 🔗

@@ -239,7 +239,7 @@ pub struct Jingle {
     pub sid: String,
     pub contents: Vec<Content>,
     pub reason: Option<ReasonElement>,
-    //pub other: Vec<Element>,
+    pub other: Vec<Element>,
 }
 
 pub fn parse_jingle(root: &Element) -> Result<Jingle, Error> {
@@ -259,6 +259,7 @@ pub fn parse_jingle(root: &Element) -> Result<Jingle, Error> {
     let sid = root.attr("sid")
                   .ok_or(Error::ParseError("Jingle must have a 'sid' attribute."))?;
     let mut reason_element = None;
+    let mut other = vec!();
 
     for child in root.children() {
         if child.is("content", ns::JINGLE) {
@@ -359,7 +360,7 @@ pub fn parse_jingle(root: &Element) -> Result<Jingle, Error> {
                 text: text,
             });
         } else {
-            return Err(Error::ParseError("Unknown element in jingle."));
+            other.push(child.clone());
         }
     }
 
@@ -370,6 +371,7 @@ pub fn parse_jingle(root: &Element) -> Result<Jingle, Error> {
         sid: sid.to_owned(),
         contents: contents,
         reason: reason_element,
+        other: other,
     })
 }
 
@@ -451,14 +453,6 @@ mod tests {
             _ => panic!(),
         };
         assert_eq!(message, "Unknown action.");
-
-        let elem: Element = "<jingle xmlns='urn:xmpp:jingle:1' action='session-accept' sid='coucou'><coucou/></jingle>".parse().unwrap();
-        let error = jingle::parse_jingle(&elem).unwrap_err();
-        let message = match error {
-            Error::ParseError(string) => string,
-            _ => panic!(),
-        };
-        assert_eq!(message, "Unknown element in jingle.");
     }
 
     #[test]