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}