comparison dreactor/protocol/RawUdp.d @ 4:f8b01c9f7114

adding basic protocols
author rick@minifunk
date Tue, 08 Jul 2008 11:22:39 -0400
parents
children
comparison
equal deleted inserted replaced
3:e3dbc9208822 4:f8b01c9f7114
1 module dreactor.protocol.Raw;
2
3 import tango.io.Conduit;
4 import tango.io.selector.model.ISelector;
5 import dreactor.core.AsyncConduit;
6 import dreactor.core.SelectLoop;
7 import dreactor.core.ConnectionHandler;
8 import tango.util.collection.CircularSeq;
9 import tango.util.log.Log;
10 import tango.util.log.Configurator;
11
12 Logger log = Log.getLogger("dreactor.core.SelectLoop");
13
14 /******************************************************************************
15
16 Basic TCP server or client routines for sending raw data.
17
18 ******************************************************************************/
19 class RawListener
20 {
21 public
22
23 this(ConnectionHandler mgr, SelectLoop sel)
24 {
25 manager = mgr;
26 mgr.events(Event.Read);
27 sel.addConnection(mgr);
28 select = sel;
29 children = CircularSeq!(ConnectionHandler);
30 Configurator();
31 }
32
33 int accept(Conduit cond)
34 {
35 AsyncConduit newcond = new AsyncConduit;
36 cond.socket().accept(newcond.socket);
37 ConnectionHandler h = ConnectionHandler.New(manager);
38 mgr.events(Event.Read);
39 select.addConnection(mgr);
40 children.append(mgr);
41 }
42
43 bool broadcast(char[] outbuf)
44 {
45 foreach(ConnectionHandler h; children)
46 {
47 if (h.appendBuffer(outbuf))
48 {
49 h.addEvent(Event.Write);
50 select.addConnection(h);
51 }
52 }
53 }
54
55 void close()
56 {
57
58 }
59
60 /**************************************************************************
61
62 send
63 OutgoingHandlerD
64 To be registered as the response to socket writable event.
65 Sends data, returns amount sent. Unregisters Handler for sending
66 if there is no more data left to send.
67
68 ***************************************************************************/
69 int send(ConnectionHandler h, RegisterD reg)
70 {
71 char[] outbuf = h.nextBuffer();
72 if (!outbuf is null)
73 {
74 int sent = h.transport.write(outbuf);
75 if (sent > 0)
76 {
77 if (! h.addOffset(sent))
78 {
79 h.removeEvent(Event.write);
80 reg(h);
81 }
82 }
83 else if (sent == EOF)
84 {
85 // EAGAIN ? probably shouldn't have happened.
86 }
87 else
88 {
89 log.error("Socket send return ERR");
90 }
91 return sent;
92 }
93 return 0;
94 }
95
96 /**************************************************************************
97
98 receive
99 IncomingHandlerD
100 Default incoming data handler. Should be replaced with something useful.
101
102 **************************************************************************/
103 int receive(ConnectionHandler h, RegisterD reg)
104 {
105 char inbuf[8192];
106 auto format = Log.format;
107 if(h.transport.read(inbuf) > 0)
108 log.info(format("Received Buffer: {}", inbuf));
109 }
110
111 private
112 ConnectionHandler manager;
113 SelectLoop select;
114 CircularSeq!(ConnectionHandler) children;
115 }
116
117 class RawClient
118 {
119 public
120 this(ConnectionHandler mgr, SelectLoop sel)
121 {
122 manager = mgr;
123 mgr.events(Event.Read);
124 sel.addConnection(mgr);
125 select = sel;
126 }
127
128
129
130 private
131 ConnectionHandler manager;
132 SelectLoop select;
133 }