annotate dreactor/core/ConnectionHandler.d @ 0:7a315154bf5e

Initial commit
author rick@minifunk
date Sun, 08 Jun 2008 01:45:38 -0400
parents
children d3374d553986
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 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
40 this (Conduit trans, bool islistener = false)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42 state = State.init;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
43 transport = trans;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 ibuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
45 obuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
46 i_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
47 o_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 isListener = islistener;
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
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 Setters for the handlers. These are set by the Protocols as well
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
55
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 void setIncomingHandler(IncomingHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 inD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61 inF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64 void setIncomingHandler(IncomingHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66 inF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67 inD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
69
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70 void setOutgoingHandler(OutgoingHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
72 outD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73 outF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76 void setOutgoingHandler(OutgoingHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 outF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 outD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82 void setErrorHandler(ErrorHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 errD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
85 errF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88 void setErrorHandler(ErrorHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
89 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90 errF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
91 errD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
93
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
94 void setDisconnectHandler(DisconnectHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
95 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96 disD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97 disF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
99
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
100 void setDisconnectHandler(DisconnectHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
101 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102 disF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 disD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
106 void setConnectHandler(ConnectHandlerD hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
108 conD = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109 conF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
111
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112 void setConnectHandler(ConnectHandlerF hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
113 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
114 conF = hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115 conD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
116 }
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 Handlers to be called by the SelectLoop when events occur
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
121
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122 **********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 void handleIncoming(Conduit cond)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125 if (!inD is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
126 return inD(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
127 else if (!inF is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
128 return inF(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
129 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
130
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
131 void handleOutgoing(Conduit cond)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
132 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
133 if (!outD is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
134 return outD(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
135 else if (!outF is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
136 return outF(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
137 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
138
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
139 int handleError(Conduit cond)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
140 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
141 if (!errD is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
142 return errD(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
143 else if (!errF is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
144 return errF(cond);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
145 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
146
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
147 int handleDisconnect(Conduit cond)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
148 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
149 if (!disD is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
150 return disD(addr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
151 else if (!disF is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
152 return disF(addr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
153 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
154
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
155 int handleConnection(Address addr)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
156 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
157 if (!conD is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
158 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
159 return conD(addr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
160 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
161 else if (!conF is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
162 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
163 return conF(addr);
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
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 Sending / Receiving helpers
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
175 appendOutBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
176
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
177 Adds an outgoing buffer to the list. This returns true if the list
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
178 was empty, indicating that the handler should be registered with the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
179 SelectLoop. If it returns false, it was probably already registered.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
180
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
181 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
182 synchronized void appendOutBuffer(char[] outbuf)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
183 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
184 out_buffers.append(outbuf);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
185 out_buffers_len++;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
186 if (out_buffers_len == 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
187 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
188 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
189 return false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
190 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
191
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
192 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
193
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
194 addOffset
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
195 Use this function to update the offset position after a successful data
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
196 send. This not only manages the current offset, but will update the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
197 out buffer chain if necessary.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
198
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
199 Returns: false if there is nothing left to send, true if there is.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
200
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
201 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
202 synchronized bool addOffset(int off)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
203 in
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
204 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
205 assert(out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
206 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
207 body
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
208 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
209 char[] hd = out_buffers.head();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
210 if ((off + o_offset) >= hd.length)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
211 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
212 out_buffers.removeHead();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
213 o_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
214 out_buffers_len--;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
215 return (out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
216 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
217 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
218 o_offset += off;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
219 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
220 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
221
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
222 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
223
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
224 char[] nextBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
225
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
226 Returns a slice of the current outbound buffer, returns a char[] pointing
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
227 to null if there is no current outbound buffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
228
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
229 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
230 synchronized char[] nextBuffer()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
231 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
232 if (out_buffers_len < 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
233 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
234 return null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
235 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
236
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
237 return out_buffers.head()[o_offset .. $];
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
238 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
239 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
240
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
241 Configuration functions
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
242
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
243 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
244 Event events()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
245 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
246 return events_;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
247 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
248 void events(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
249 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
250 events_ = e;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
251 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
252 void addEvent(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
253 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
254 events_ |= e;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
255 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
256 void remEvent(Event e)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
257 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
258 events_ &= ^e;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
259 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
260
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
261 State getState() {return state;}
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 connection handlers are left out of this because
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
265 this method is used by the listener socket to pass
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
266 on its handlers to the accepted socket. An accepted
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
267 socket will generally do different things onConnection
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
268 */
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
269 void setHandlers(ConnectionHandler other)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
270 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
271 inD = other.inD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
272 outD = other.outD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
273 errD = other.errD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
274 disD = other.disD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
275 inF = other.inF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
276 outF = other.outF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
277 errF = other.errF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
278 disF = other.disF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
279 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
280
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
281 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
282
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
283 Freelist allocators and deallocators
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
284
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
285 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
286 static synchronized ConnectionHandler New(Conduit tran, ConnectionHandler other = null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
287 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
288 ConnectionHandler hand;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
289 if (freelist)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
290 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
291 hand = freelist;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
292 freelist = hand.next;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
293 hand.transport = tran;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
294 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
295 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
296 hand = new ConnectionHandler(tran);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
297
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
298 if (!other is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
299 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
300 hand.setHandlers(other);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
301 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
302 return hand;
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 static synchronized void Delete(ConnectionHandler hand)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
306 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
307 hand.next = freelist;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
308 freelist = hand.init();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
309 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
310
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
311 private
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
312
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
313 char[SZ] in_buffer;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
314 CircularSeq!(char[]) out_buffers;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
315 int ibuf_len;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
316 int i_offset;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
317 int o_offset;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
318
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
319 package Conduit transport;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
320 State state;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
321 Event events;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
322 IncomingHandlerD inD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
323 OutgoingHandlerD outD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
324 ErrorHandlerD errD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
325 DisconnectHandlerD disD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
326 ConnectHandlerD conD;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
327
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
328 IncomingHandlerF inF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
329 OutgoingHandlerF outF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
330 ErrorHandlerF errF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
331 DisconnectHandlerF disF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
332 ConnectHandlerF conF;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
333
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
334 static ConnectionHandler freelist;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
335 ConnectionHandler next;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
336
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
337 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
338 Copy ctor, creates a new ConnectionHandler using the settings
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
339 of an existing handler.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
340 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
341 void init()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
342 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
343 transport = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
344 state = State.init;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
345 ibuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
346 obuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
347 i_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
348 o_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
349 out_buffer = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
350 inD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
351 outD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
352 errD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
353 disD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
354 conD = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
355 inF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
356 outF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
357 errF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
358 disF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
359 conF = null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
360 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
361 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
362