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    }
34
35    fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
36        let name = "stream:stream";
37        let elem = BytesEnd::borrowed(name.as_bytes());
38        transport.write_event(WriterEvent::End(elem))
39    }
40}
41
42pub struct Component2S;
43
44impl Connection for Component2S {
45    type InitError = Error;
46    type CloseError = Error;
47
48    fn namespace() -> &'static str { ns::COMPONENT_ACCEPT }
49
50    fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Error> {
51        let name = "stream:stream";
52        let mut elem = BytesStart::borrowed(name.as_bytes(), name.len());
53        elem.push_attribute(("to", domain));
54        elem.push_attribute(("id", id));
55        elem.push_attribute(("xmlns", ns::COMPONENT_ACCEPT));
56        elem.push_attribute(("xmlns:stream", ns::STREAM));
57        transport.write_event(WriterEvent::Start(elem))
58    }
59
60    fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
61        let name = "stream:stream";
62        let elem = BytesEnd::borrowed(name.as_bytes());
63        transport.write_event(WriterEvent::End(elem))
64    }
65}