annotate dreactor/core/Dispatcher.d @ 9:5412a1ff2e49

adding chat client and more updates
author rick@minifunk
date Sat, 12 Jul 2008 10:42:41 -0400
parents 287ba7de97c4
children 5836613d16ac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
1 module dreactor.core.Dispatcher;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 import tango.io.selector.model.ISelector;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4 import tango.util.collection.CircularSeq;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
5 import tango.net.Socket;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
6 public import tango.core.Exception;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
7 import dreactor.transport.AsyncSocketConduit;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
9 import tango.util.log.Log;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
10 import tango.util.log.Config;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
12 alias bool delegate(Dispatcher) RegisterD;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
13
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
14 alias int delegate(Dispatcher) IncomingHandlerD;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
15 alias int delegate(Dispatcher) OutgoingHandlerD;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
16 alias int delegate(Dispatcher, RegisterD) ErrorHandlerD;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
17 alias int delegate(Dispatcher) DisconnectHandlerD;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
18 alias int delegate(Conduit, RegisterD) ConnectHandlerD;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
20 alias int function(Dispatcher) IncomingHandlerF;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
21 alias int function(Dispatcher) OutgoingHandlerF;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
22 alias int function(Dispatcher, RegisterD) ErrorHandlerF;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
23 alias int function(Dispatcher) DisconnectHandlerF;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
24 alias int function(Conduit, RegisterD) ConnectHandlerF;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
25
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
27 /******************************************************************************
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
28 Dispatcher object. To be used by the SelectLoop to manage callbacks
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
29 for events. It may also be used to buffer data inbetween requests.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30 These can be populated passed to a SelectLoop directly by the end user,
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
31 or may be managed by a chosen Protocol.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
32 ******************************************************************************/
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
33 class Dispatcher
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35 public
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
36 enum State { init, connected, listening, idle, closing };
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
39
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
40 Standard Ctor, takes a transport_
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42 **************************************************************************/
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
43 this (Conduit trans, bool listener = false)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
45 transport_ = trans;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
46 ibuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
47 i_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 o_offset = 0;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
49 out_buffers = new CircularSeq!(char[]);
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
50 log = Log.lookup("dreactor.core.Dispatcher");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
51 }
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 6
diff changeset
52
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53 /**********************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
54
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
55 Setters for the handlers. These are set by the Protocols as well
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
57 **********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59 void setIncomingHandler(IncomingHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61 inD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62 inF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 void setIncomingHandler(IncomingHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67 inF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68 inD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
69 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 void setOutgoingHandler(OutgoingHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
72 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73 outD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 outF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77 void setOutgoingHandler(OutgoingHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 outF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80 outD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83 void setErrorHandler(ErrorHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
85 errD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86 errF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
89 void setErrorHandler(ErrorHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
91 errF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92 errD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
93 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
94
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
95 void setDisconnectHandler(DisconnectHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97 disD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98 disF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
99 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
100
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
101 void setDisconnectHandler(DisconnectHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 disF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104 disD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
106
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107 void setConnectHandler(ConnectHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
108 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109 conD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110 conF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
111 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
113 void setConnectHandler(ConnectHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
114 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115 conF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
116 conD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
117 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
118
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
119 /**********************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
120
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
121 Handlers to be called by the SelectLoop when events occur
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 **********************************************************************/
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
124 int handleIncoming()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
126 if (inD !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
127 return inD(this);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
128 else if (inF !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
129 return inF(this);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
130 else
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
131 throw new Exception("no Incoming handler set");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
132 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
133
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
134 int handleOutgoing()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
135 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
136 if (outD !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
137 return outD(this);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
138 else if (outF !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
139 return outF(this);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
140 else
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
141 throw new Exception("no Outgoing handler set");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
142 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
143
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
144 int handleError(RegisterD reg)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
145 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
146 if (errD !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
147 return errD(this, reg);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
148 else if (errF !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
149 return errF(this, reg);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
150 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
151
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
152 int handleDisconnect()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
153 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
154 if (disD !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
155 return disD(this);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
156 else if (disF !is null)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
157 return disF(this);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
158 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
159
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
160 int handleConnection(Conduit cond, RegisterD reg )
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
161 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
162 if (conD !is null)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
163 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
164 return conD(cond, reg);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
165 }
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
166 else if (conF !is null)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
167 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
168 return conF(cond, reg);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
169 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
170 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
171
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
172 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
173
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
174 Sending / Receiving helpers
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
175
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
176 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
177
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
178 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
179
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
180 appendOutBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
181
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
182 Adds an outgoing buffer to the list. This returns true if the list
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
183 was empty, indicating that the handler should be registered with the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
184 SelectLoop. If it returns false, it was probably already registered.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
185
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
186 **************************************************************************/
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
187 synchronized bool appendOutBuffer(char[] outbuf)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
188 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
189 out_buffers.append(outbuf);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
190 out_buffers_len++;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
191 if (out_buffers_len == 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
192 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
193 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
194 return false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
195 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
196
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
197 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
198
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
199 addOffset
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
200 Use this function to update the offset position after a successful data
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
201 send. This not only manages the current offset, but will update the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
202 out buffer chain if necessary.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
203
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
204 Returns: false if there is nothing left to send, true if there is.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
205
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
206 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
207 synchronized bool addOffset(int off)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
208 in
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
209 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
210 assert(out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
211 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
212 body
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
213 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
214 char[] hd = out_buffers.head();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
215 if ((off + o_offset) >= hd.length)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
216 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
217 out_buffers.removeHead();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
218 o_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
219 out_buffers_len--;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
220 return (out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
221 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
222 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
223 o_offset += off;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
224 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
225 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
226
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
227 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
228
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
229 char[] nextBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
230
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
231 Returns a slice of the current outbound buffer, returns a char[] pointing
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
232 to null if there is no current outbound buffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
233
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
234 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
235 synchronized char[] nextBuffer()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
236 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
237 if (out_buffers_len < 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
238 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
239 return null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
240 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
241
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
242 return out_buffers.head()[o_offset .. $];
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
243 }
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
244
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
245 /**************************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
246
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
247 listen
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
248 Enable listening on the socket attached to this connectionhandler
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
249
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
250 **************************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
251 int listen(IPv4Address addr)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
252 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
253 (cast(AsyncSocketConduit)transport_).bind(addr).listen();
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
254 state_ = State.listening;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
255 return 0;
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
256 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
257
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
258 Conduit transport()
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
259 {
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
260 return transport_;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
261 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
262 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
263
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
264 Configuration functions
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
265
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
266 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
267 Event events()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
268 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
269 return events_;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
270 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
271 void events(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
272 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
273 events_ = e;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
274 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
275 void addEvent(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
276 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
277 events_ |= e;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
278 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
279 void remEvent(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
280 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
281 events_ &= ~e;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
282 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
283
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
284 State getState() {return state_;}
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
285
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
286 /*
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
287 connection handlers are left out of this because
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
288 this method is used by the listener socket to pass
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
289 on its handlers to the accepted socket. An accepted
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
290 socket will generally do different things onConnection
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
291 */
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
292 void setHandlers(Dispatcher other)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
293 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
294 inD = other.inD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
295 outD = other.outD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
296 errD = other.errD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
297 disD = other.disD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
298 inF = other.inF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
299 outF = other.outF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
300 errF = other.errF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
301 disF = other.disF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
302 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
303
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
304 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
305
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
306 Freelist allocators and deallocators
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
307
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
308 **************************************************************************/
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
309 static synchronized Dispatcher New(Conduit tran, Dispatcher other = null)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
310 {
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
311 Dispatcher hand;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
312 if (freelist)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
313 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
314 hand = freelist;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
315 freelist = hand.next;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
316 hand.transport_ = tran;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
317 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
318 else
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
319 hand = new Dispatcher(tran);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
320
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
321 if (!(other is null))
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
322 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
323 hand.setHandlers(other);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
324 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
325 return hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
326 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
327
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
328 static synchronized void Delete(Dispatcher hand)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
329 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
330 hand.next = freelist;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
331 freelist = hand.initialize();
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
332 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
333
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
334 private
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
335
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
336 char[] in_buffer;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
337 CircularSeq!(char[]) out_buffers;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
338 int out_buffers_len;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
339 int ibuf_len;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
340 int i_offset;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
341 int o_offset;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
342 Logger log;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
343
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
344 package Conduit transport_;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
345 State state_;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
346 Event events_;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
347 IncomingHandlerD inD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
348 OutgoingHandlerD outD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
349 ErrorHandlerD errD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
350 DisconnectHandlerD disD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
351 ConnectHandlerD conD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
352
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
353 IncomingHandlerF inF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
354 OutgoingHandlerF outF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
355 ErrorHandlerF errF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
356 DisconnectHandlerF disF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
357 ConnectHandlerF conF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
358
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
359 static Dispatcher freelist;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
360 Dispatcher next;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
361
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
362 /**************************************************************************
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
363 Copy ctor, creates a new Dispatcher using the settings
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
364 of an existing handler.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
365 **************************************************************************/
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
366 Dispatcher initialize()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
367 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
368 transport_ = null;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
369 state_ = State.init;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
370 ibuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
371 i_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
372 o_offset = 0;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
373 out_buffers.clear();
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
374 inD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
375 outD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
376 errD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
377 disD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
378 conD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
379 inF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
380 outF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
381 errF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
382 disF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
383 conF = null;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
384 return this;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
385 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
386 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
387