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}