annotate dreactor/core/ConnectionHandler.d @ 2:d3374d553986

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