connection.rs

 1use transport::Transport;
 2use error::Error;
 3use ns;
 4
 5use quick_xml::events::{Event as WriterEvent, BytesStart, BytesEnd};
 6
 7pub trait Connection {
 8    type InitError;
 9    type CloseError;
10
11    fn namespace() -> &'static str;
12
13    fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Self::InitError>;
14    fn close<T: Transport>(transport: &mut T) -> Result<(), Self::CloseError>;
15}
16
17pub struct C2S;
18
19impl Connection for C2S {
20    type InitError = Error;
21    type CloseError = Error;
22
23    fn namespace() -> &'static str { ns::CLIENT }
24
25    fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Error> {
26        let name = "stream:stream";
27        let mut elem = BytesStart::borrowed(name.as_bytes(), name.len());
28        elem.push_attribute(("to", domain));
29        elem.push_attribute(("id", id));
30        elem.push_attribute(("xmlns", ns::CLIENT));
31        elem.push_attribute(("xmlns:stream", ns::STREAM));
32        transport.write_event(WriterEvent::Start(elem))?;
33        Ok(())
34    }
35
36    fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
37        let name = "stream:stream";
38        let elem = BytesEnd::borrowed(name.as_bytes());
39        transport.write_event(WriterEvent::End(elem))?;
40        Ok(())
41    }
42}
43
44pub struct Component2S;
45
46impl Connection for Component2S {
47    type InitError = Error;
48    type CloseError = Error;
49
50    fn namespace() -> &'static str { ns::COMPONENT_ACCEPT }
51
52    fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Error> {
53        let name = "stream:stream";
54        let mut elem = BytesStart::borrowed(name.as_bytes(), name.len());
55        elem.push_attribute(("to", domain));
56        elem.push_attribute(("id", id));
57        elem.push_attribute(("xmlns", ns::COMPONENT_ACCEPT));
58        elem.push_attribute(("xmlns:stream", ns::STREAM));
59        transport.write_event(WriterEvent::Start(elem))?;
60        Ok(())
61    }
62
63    fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
64        let name = "stream:stream";
65        let elem = BytesEnd::borrowed(name.as_bytes());
66        transport.write_event(WriterEvent::End(elem))?;
67        Ok(())
68    }
69}