Mercurial > projects > dreactor
comparison dreactor/protocol/RawTcp.d @ 11:5836613d16ac
reorg! reorg!
author | rick@minifunk |
---|---|
date | Tue, 12 Aug 2008 16:59:56 -0400 |
parents | e75a2e506b1d |
children |
comparison
equal
deleted
inserted
replaced
10:e75a2e506b1d | 11:5836613d16ac |
---|---|
17 | 17 |
18 ******************************************************************************/ | 18 ******************************************************************************/ |
19 class RawTCPListener | 19 class RawTCPListener |
20 { | 20 { |
21 public | 21 public |
22 this(Dispatcher mgr, Vat sel, IPv4Address addr) | 22 |
23 { | 23 this(AsyncSocketConduit cond) |
24 manager = mgr; | 24 { |
25 mgr.events(Event.Read); | |
26 mgr.setOutgoingHandler(&RawTCPHandler.onSend); | |
27 mgr.setIncomingHandler(&onReceive); | |
28 mgr.setConnectHandler(&accept); | |
29 mgr.setErrorHandler(&RawTCPHandler.onError); | |
30 mgr.setDisconnectHandler(&RawTCPHandler.onHangup); | |
31 mgr.listen(addr); | |
32 | |
33 sel.addConnection(mgr); | |
34 vat = sel; | |
35 log = Log.lookup("dreactor.protocol.RawTcpServer"); | 25 log = Log.lookup("dreactor.protocol.RawTcpServer"); |
36 log.info("log initialized"); | 26 log.info("log initialized"); |
37 children = new CircularSeq!(Dispatcher); | 27 children = new CircularSeq!(Dispatcher); |
38 } | 28 } |
29 | |
39 this(Vat sel, IPv4Address addr) | 30 this(Vat sel, IPv4Address addr) |
40 { | 31 { |
41 AsyncSocketConduit cond = new AsyncSocketConduit; | 32 AsyncSocketConduit cond = new AsyncSocketConduit; |
42 cond.socket().setAddressReuse(true); | 33 cond.socket().setAddressReuse(true); |
43 Dispatcher lh = new Dispatcher(cond, true); | 34 this(cond); |
44 this(lh, sel, addr); | |
45 } | 35 } |
46 | 36 |
47 ~this() | 37 ~this() |
48 { | 38 { |
49 close(); | 39 close(); |
50 } | 40 } |
51 | 41 |
52 int accept(Conduit cond, RegisterD reg) | 42 AsyncSocketConduit accept(Conduit cond, RegisterD reg) |
53 { | 43 { |
54 AsyncSocketConduit newcond = new AsyncSocketConduit; | 44 AsyncSocketConduit newcond = new AsyncSocketConduit; |
55 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket); | 45 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket); |
56 Dispatcher h = Dispatcher.New(newcond, manager); | |
57 h.events(Event.Read); | 46 h.events(Event.Read); |
58 vat.addConnection(h); | 47 vat.addConnection(h); |
59 children.append(h); | 48 children.append(h); |
60 log.info("accepted new connection"); | 49 log.info("accepted new connection"); |
61 return 0; | 50 return newcond; |
62 } | 51 } |
63 | 52 |
64 int broadcast(char[] outbuf, Dispatcher[] excluded = null) | 53 int broadcast(char[] outbuf, AsyncSocketConduit[] recips) |
65 { | 54 { |
66 foreach(Dispatcher h; children) | 55 foreach(AsyncSocketConduit c; recips) |
67 { | 56 { |
68 if (excluded && excluded.includes(h)) | 57 if (c.appendOutBuffer(outbuf)) |
69 continue; | |
70 if (h.appendOutBuffer(outbuf)) | |
71 { | 58 { |
72 h.addEvent(Event.Write); | 59 h.addEvent(Event.Write); |
73 vat.addConnection(h); | 60 vat.addConnection(h); |
74 } | 61 } |
75 } | 62 } |
261 | 248 |
262 void setDataHandler(void delegate(char[], Dispatcher) h) | 249 void setDataHandler(void delegate(char[], Dispatcher) h) |
263 { | 250 { |
264 dataHandler = h; | 251 dataHandler = h; |
265 } | 252 } |
253 | |
266 private | 254 private |
267 void delegate(char[], Dispatcher) dataHandler; | 255 void delegate(char[], Dispatcher) dataHandler; |
268 Dispatcher manager; | 256 Dispatcher manager; |
269 Vat vat; | 257 Vat vat; |
270 bool connected; | 258 bool connected; |