annotate asyncdreactor/protocol/RawTcp.d @ 11:5836613d16ac

reorg! reorg!
author rick@minifunk
date Tue, 12 Aug 2008 16:59:56 -0400
parents dreactor/protocol/RawTcp.d@e75a2e506b1d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
1 module dreactor.protocol.RawTcp;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
2
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
3 import tango.io.Conduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
4 import tango.io.selector.model.ISelector;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
5 import tango.net.Socket;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
6 import tango.util.collection.CircularSeq;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
7 import tango.util.log.Log;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
8 import tango.util.log.Config;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
9
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
10 import dreactor.transport.AsyncSocketConduit;
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
11 import dreactor.core.Vat;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
12 import dreactor.core.Dispatcher;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
13
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
14 /******************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
15
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
16 Basic TCP server or client routines for sending raw data.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
17
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
18 ******************************************************************************/
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
19 class RawTCPListener
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
20 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
21 public
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
22 this(Dispatcher mgr, Vat sel, IPv4Address addr)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
23 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
24 manager = mgr;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
25 mgr.events(Event.Read);
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
26 mgr.setOutgoingHandler(&RawTCPHandler.onSend);
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
27 mgr.setIncomingHandler(&onReceive);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
28 mgr.setConnectHandler(&accept);
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
29 mgr.setErrorHandler(&RawTCPHandler.onError);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
30 mgr.setDisconnectHandler(&RawTCPHandler.onHangup);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
31 mgr.listen(addr);
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
32
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
33 sel.addConnection(mgr);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
34 vat = sel;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
35 log = Log.lookup("dreactor.protocol.RawTcpServer");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
36 log.info("log initialized");
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
37 children = new CircularSeq!(Dispatcher);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
38 }
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
39 this(Vat sel, IPv4Address addr)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
40 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
41 AsyncSocketConduit cond = new AsyncSocketConduit;
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
42 cond.socket().setAddressReuse(true);
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
43 Dispatcher lh = new Dispatcher(cond, true);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
44 this(lh, sel, addr);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
45 }
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
46
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
47 ~this()
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
48 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
49 close();
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
50 }
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
51
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
52 int accept(Conduit cond, RegisterD reg)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
53 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
54 AsyncSocketConduit newcond = new AsyncSocketConduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
55 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket);
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
56 Dispatcher h = Dispatcher.New(newcond, manager);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
57 h.events(Event.Read);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
58 vat.addConnection(h);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
59 children.append(h);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
60 log.info("accepted new connection");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
61 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
62 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
63
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
64 int broadcast(char[] outbuf, Dispatcher[] excluded = null)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
65 {
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
66 foreach(Dispatcher h; children)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
67 {
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
68 if (excluded && excluded.includes(h))
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
69 continue;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
70 if (h.appendOutBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
71 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
72 h.addEvent(Event.Write);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
73 vat.addConnection(h);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
74 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
75 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
76 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
77 }
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
78
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
79 /**************************************************************************
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
80
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
81 send
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
82 User-called function to send data to the counterpart at the other
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
83 end of the connection. This sets up the connection manager to send
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
84 data as the socket becomes free.
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
85
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
86 **************************************************************************/
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
87 int send(Dispatcher d, char[] outbuf, IPv4Address addr = null)
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
88 {
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
89 if (d.appendOutBuffer(outbuf))
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
90 {
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
91 d.addEvent(Event.Write);
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
92 if (!vat.addConnection(d))
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
93 {
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
94 log.error("unable to register mgr");
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
95 }
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
96 }
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
97 return 0;
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
98 }
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
99
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
100 /**************************************************************************
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
101
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
102 receive
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
103 IncomingHandlerD
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
104 Default incoming data handler. Should be replaced with something useful.
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
105
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
106 **************************************************************************/
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
107 int onReceive(Dispatcher h)
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
108 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
109 Logger log = Log.lookup("Handlers.onReceive");
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
110
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
111 char inbuf[8192];
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
112 int amt;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
113 if((amt = h.transport.read(inbuf)) > 0)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
114 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
115 if (dataHandler)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
116 dataHandler(inbuf[0 .. amt], h);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
117 else
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
118 log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
119 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
120 else
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
121 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
122 if (amt == 0)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
123 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
124 children.remove(h);
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
125 (cast(AsyncSocketConduit) h.transport).shutdown();
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
126 return CLOSE;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
127 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
128 log.error("Received no data, err = {}", amt);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
129 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
130 return REMAIN;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
131 }
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
132
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
133 void close()
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
134 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
135 foreach(Dispatcher d; children)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
136 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
137 (cast(AsyncSocketConduit)d.transport).shutdown();
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
138 (cast(AsyncSocketConduit)d.transport).detach();
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
139 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
140 (cast(AsyncSocketConduit)manager.transport).shutdown();
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
141 (cast(AsyncSocketConduit)manager.transport).detach();
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
142
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
143 }
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
144
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
145 void setDataHandler(void delegate(char[], Dispatcher) h)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
146 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
147 dataHandler = h;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
148 }
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
149
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
150 private
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
151 Vat vat;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
152 CircularSeq!(Dispatcher) children;
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
153 Dispatcher manager;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
154 Logger log;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
155 RawTCPHandler h;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
156 void delegate(char[], Dispatcher) dataHandler;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
157 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
158
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
159 class RawTCPClient
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
160 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
161
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
162 public
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
163 this(Dispatcher mgr, Vat sel, Event evts = Event.Read)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
164 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
165 manager = mgr;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
166 manager.events(evts);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
167 connected = false;
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
168 mgr.setOutgoingHandler(&RawTCPHandler.onSend);
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
169 mgr.setIncomingHandler(&onReceive);
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
170 mgr.setErrorHandler(&RawTCPHandler.onError);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
171 mgr.setDisconnectHandler(&RawTCPHandler.onHangup);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
172 vat = sel;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
173 log = Log.lookup("dreactor.protocol.RawTcpClient");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
174 }
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
175
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
176 this(Vat sel, Event evts = Event.Read)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
177 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
178 AsyncSocketConduit clcond = new AsyncSocketConduit;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
179 Dispatcher ch = new Dispatcher(clcond);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
180 this(ch, sel, evts);
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
181 }
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
182
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
183 ~this()
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
184 {
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
185 (cast(AsyncSocketConduit)manager.transport).shutdown();
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
186 (cast(AsyncSocketConduit)manager.transport).detach();
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
187 }
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
188
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
189 int connect(IPv4Address addr)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
190 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
191 (cast(AsyncSocketConduit) manager.transport()).connect(addr);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
192 vat.addConnection(manager);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
193 connected = true;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
194 log.info("connected to {}", addr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
195 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
196 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
197
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
198 /**************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
199
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
200 send
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
201 User-called function to send data to the counterpart at the other
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
202 end of the connection. This sets up the connection manager to send
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
203 data as the socket becomes free.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
204
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
205 **************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
206 int send(char[] outbuf, IPv4Address addr = null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
207 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
208 if (!connected)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
209 {
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
210 log.info("send: not connected, connecting");
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
211 if (addr !is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
212 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
213 if (0 > connect(addr))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
214 {
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
215 log.error("send: unable to connect");
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
216 return -1;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
217 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
218 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
219 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
220 if (manager.appendOutBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
221 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
222 manager.addEvent(Event.Write);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
223 if (!vat.addConnection(manager))
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
224 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
225 log.error("unable to register mgr");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
226 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
227 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
228 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
229 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
230
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
231 /**************************************************************************
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
232
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
233 receive
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
234 IncomingHandlerD
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
235 Default incoming data handler. Should be replaced with something useful.
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
236
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
237 **************************************************************************/
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
238 public int onReceive(Dispatcher h)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
239 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
240 Logger log = Log.lookup("Handlers.onReceive");
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
241
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
242 char inbuf[8192];
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
243 int amt;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
244 if((amt = h.transport.read(inbuf)) > 0)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
245 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
246 if (dataHandler)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
247 dataHandler(inbuf[0 .. amt], h);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
248 else
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
249 log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
250 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
251 else
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
252 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
253 if (amt == 0)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
254 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
255 return CLOSE;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
256 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
257 log.error("Received no data, err = {}", amt);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
258 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
259 return REMAIN;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
260 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
261
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
262 void setDataHandler(void delegate(char[], Dispatcher) h)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
263 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
264 dataHandler = h;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
265 }
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
266 private
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
267 void delegate(char[], Dispatcher) dataHandler;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
268 Dispatcher manager;
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
269 Vat vat;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
270 bool connected;
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
271 Logger log;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
272 RawTCPHandler h;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
273 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
274
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
275
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
276 /******************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
277
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
278 Default Event handlers common to both listener/clients
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
279
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
280 ******************************************************************************/
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
281 struct RawTCPHandler
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
282 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
283 /**************************************************************************
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
284
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
285 onSend
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
286 OutgoingHandlerD
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
287 To be registered as the response to socket writable event.
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
288 Sends data, returns amount sent. Unregisters Handler for sending
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
289 if there is no more data left to send.
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
290
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
291 ***************************************************************************/
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
292 public static int onSend(Dispatcher h)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
293 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
294 Logger log = Log.lookup("Handlers.onSend");
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
295
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
296 char[] outbuf = h.nextBuffer();
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
297 if (outbuf !is null)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
298 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
299 int sent = h.transport.write(outbuf);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
300 if (sent > 0)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
301 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
302 if (! h.addOffset(sent))
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
303 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
304 h.remEvent(Event.Write);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
305 return REREGISTER;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
306 }
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
307 }
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
308 else if (sent == AsyncSocketConduit.Eof)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
309 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
310 log.error("Select said socket was writable, but sent 0 bytes");
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
311 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
312 else
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
313 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
314 log.error("Socket send return ERR");
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
315 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
316 return REMAIN;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
317 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
318 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
319 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
320 h.remEvent(Event.Write);
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
321 return REREGISTER;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
322 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
323 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
324
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
325 static int onHangup(Dispatcher d)
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
326 {
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
327 return UNREGISTER;
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
328 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
329
10
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
330 static int onError(Dispatcher d, RegisterD unreg)
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
331 {
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
332 return CLOSE;
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
333 }
e75a2e506b1d housekeeping
rick@minifunk
parents: 9
diff changeset
334
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
335 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
336
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
337 bool includes(Dispatcher[] haystack, Dispatcher needle)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
338 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
339 foreach(Dispatcher h; haystack)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
340 {
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
341 if (h is needle)
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
342 return true;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
343 }
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
344 return false;
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
345 }