annotate dreactor/transport/AsyncSocketConduit.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 /*******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
5 license: BSD style: $(LICENSE)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
7 version: Mar 2004 : Initial release
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8 version: Jan 2005 : RedShodan patch for timeout query
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
9 version: Dec 2006 : Outback release
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11 author: Kris, modified by Rick Richardson (May 2008)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
12
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
13 *******************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15 module dreactor.transport.AsyncSocketConduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17 private import tango.time.Time;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 public import tango.io.Conduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 private import tango.net.Socket;
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 A wrapper around the bare Socket to implement the IConduit abstraction
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26 and add socket-specific functionality specifically for multiplexing via
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
27 poll and the ilk.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
28
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
29 AsyncSocketConduit data-transfer is typically performed in conjunction with
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30 an IBuffer, but can happily be handled directly using void array where
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
31 preferred
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
32
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
33 *******************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35 class AsyncSocketConduit : Conduit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
36 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37 package Socket socket_;
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41 Create a streaming Internet Socket
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
43 ***********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 /* overriding the enum from the IConduit interface */
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
45 enum : uint
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
46 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
47 Eof = uint.max, /// the End-of-Flow identifer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 Err = uint.max -1 // some error ocurred, Should disconnect
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 this ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
52 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53 this (SocketType.STREAM, ProtocolType.TCP);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
54 }
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 Create an Internet Socket. Used by subclasses and by
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59 ServerSocket; the latter via method allocate() below
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61 ***********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63 protected this (SocketType type, ProtocolType protocol, bool create=true)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 socket_ = new Socket (AddressFamily.INET, type, protocol, create);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67
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 Return the name of this device
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 override char[] toString()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76 return socket.toString;
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 /***********************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81 Return the socket wrapper
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82
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 Socket socket ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87 return socket_;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88 }
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92 Return a preferred size for buffering conduit I/O
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96 override uint bufferSize ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98 return 1024 * 8;
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 /***********************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 Models a handle-oriented device.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105 TODO: figure out how to avoid exposing this in the general
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
106 case
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110 override Handle fileHandle ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
111 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112 return cast(Handle) socket_.fileHandle;
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 Is this socket still alive?
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 override bool isAlive ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 return socket_.isAlive;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125
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 Connect to the provided endpoint
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
132 AsyncSocketConduit connect (Address addr)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
133 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
134 socket_.connect (addr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
135 return this;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
136 }
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
140 Bind the socket. This is typically used to configure a
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
141 listening socket (such as a server or multicast socket).
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
142 The address given should describe a local adapter, or
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
143 specify the port alone (ADDR_ANY) to have the OS assign
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
144 a local adapter address.
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
148 AsyncSocketConduit bind (Address address)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
149 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
150 socket_.bind (address);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
151 return this;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
152 }
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
156 Inform other end of a connected socket that we're no longer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
157 available. In general, this should be invoked before close()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
158 is invoked
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
159
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
160 The shutdown function shuts down the connection of the socket:
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
161
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
162 - stops receiving data for this socket. If further data
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
163 arrives, it is rejected.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
164
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
165 - stops trying to transmit data from this socket. Also
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
166 discards any data waiting to be sent. Stop looking for
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
167 acknowledgement of data already sent; don't retransmit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
168 if any data is lost.
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 AsyncSocketConduit shutdown ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
173 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
174 socket_.shutdown (SocketShutdown.BOTH);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
175 return this;
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 Release this AsyncSocketConduit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
181
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
182 Note that one should always disconnect a AsyncSocketConduit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
183 under normal conditions, and generally invoke shutdown
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
184 on all connected sockets beforehand
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
185
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
186 ***********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
187
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
188 override void detach ()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
189 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
190 socket_.detach;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
191
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
192 // deallocate if this came from the free-list,
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
193 // otherwise just wait for the GC to handle it
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
194 if (fromList)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
195 deallocate (this);
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
200 Read content from the socket.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
201
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
202 Returns the number of bytes read from the socket, or
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
203 IConduit.Eof where there's no more content available
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
204
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
205 Note that a timeout is equivalent to Eof. Isolating
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
206 a timeout condition can be achieved via hadTimeout()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
207
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
208 Note also that a zero return value is not legitimate;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
209 such a value indicates Eof
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
210
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
211 ***********************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
212
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
213 override uint read (void[] dst)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
214 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
215 return read (dst, (void[] dst){return socket_.receive(dst);});
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
216 }
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 Callback routine to write the provided content to the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
221 socket. This will stall until the socket responds in
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
222 some manner. Returns the number of bytes sent to the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
223 output, or IConduit.Eof if the socket cannot write.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
224
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 override uint write (void[] src)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
228 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
229 int count = socket_.send (src);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
230 if (count == 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
231 count = Eof;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
232 else if (count < 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
233 count = Err;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
234 return count;
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 /***********************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
238
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
239 Internal routine to handle socket read under a timeout.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
240 Note that this is synchronized, in order to serialize
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
241 socket access
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
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
245 package final uint read (void[] dst, int delegate(void[]) dg)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
246 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
247 // invoke the actual read op
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
248 int count = dg (dst);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
249 if (count == 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
250 return Eof;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
251 else if (count < 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
252 return Err;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
253
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
254 return count;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
255 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
256
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
257 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
258