1 /******************************************************************************
2
3 Fiber Select Protocol I/O Exception Classes
4
5 Copyright:
6 Copyright (c) 2009-2016 dunnhumby Germany GmbH.
7 All rights reserved.
8
9 License:
10 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
11 Alternatively, this file may be distributed under the terms of the Tango
12 3-Clause BSD License (see LICENSE_BSD.txt for details).
13
14 ******************************************************************************/
15
16 module ocean.io.select.protocol.generic.ErrnoIOException;
17
18
19 import ocean.meta.types.Qualifiers;
20
21 import ocean.sys.ErrnoException;
22
23 import ocean.io.model.IConduit: ISelectable;
24
25 import core.stdc.errno: errno;
26
27 /******************************************************************************
28
29 IOWarning class; to be thrown on end-of-flow conditions where neither errno
30 nor getsockopt() indicate an error.
31
32 ******************************************************************************/
33
34 class IOWarning : ErrnoException
35 {
36 /**************************************************************************
37
38 File handle of I/O device
39
40 **************************************************************************/
41
42 public int handle ()
43 {
44 return this.conduit.fileHandle;
45 }
46
47 /**************************************************************************
48
49 Select client hosting the I/O device
50
51 **************************************************************************/
52
53 protected ISelectable conduit;
54
55 /**************************************************************************
56
57 Constructor
58
59 Params:
60 conduit = Select client hosting the I/O device
61
62 **************************************************************************/
63
64 this ( ISelectable conduit )
65 {
66 this.conduit = conduit;
67 }
68 }
69
70 class IOError : IOWarning
71 {
72 /**************************************************************************
73
74 Constructor
75
76 Params:
77 client = Select client hosting the I/O device
78
79 **************************************************************************/
80
81 this ( ISelectable conduit )
82 {
83 super(conduit);
84 }
85
86 /**************************************************************************
87
88 Obtains the current error code of the underlying device of the conduit.
89
90 To be overridden by a subclass for I/O devices that support querying a
91 device specific error status (e.g. sockets with getsockopt()).
92
93 Returns:
94 the current error code of the underlying device of the conduit.
95
96 **************************************************************************/
97
98 public int error_code ( )
99 {
100 return 0;
101 }
102
103 /**************************************************************************
104
105 Checks the error state of the underlying device of the conduit and
106 throws this instance on error.
107
108 This will in fact only happen if a subclass overrides error_code().
109
110 Params:
111 msg = message
112 file = source code file name
113 line = source code line
114
115 Throws:
116 this instance if an error is reported for the underlying device of
117 the conduit.
118
119 **************************************************************************/
120
121 public void checkDeviceError ( istring msg, istring file = __FILE__,
122 int line = __LINE__ )
123 {
124 int device_errnum = this.error_code;
125
126 if (device_errnum)
127 {
128 throw this.set(device_errnum, msg, file, line);
129 }
130 }
131 }
132
133 class SocketError : IOError
134 {
135 import ocean.io.device.Conduit : ISelectable;
136 import ocean.sys.socket.model.ISocket;
137
138 /**************************************************************************
139
140 Constructor
141
142 Params:
143 conduit = I/O device, the file descriptor is expected to be
144 associated with a socket.
145
146 **************************************************************************/
147
148 this ( ISelectable conduit )
149 {
150 super(conduit);
151 }
152
153 /**************************************************************************
154
155 Returns:
156 the current socket error code.
157
158 **************************************************************************/
159
160 override int error_code ( )
161 {
162 return ISocket.error(this.conduit);
163 }
164
165
166 /**************************************************************************
167
168 Throws this instance if ok is false.
169
170 Params:
171 ok = condition that should not be false
172 msg = message
173 file = source code file name
174 line = source code line
175
176 Throws:
177 this instance if ok is false, 0 or null
178
179 **************************************************************************/
180
181 void assertExSock ( bool ok, istring msg, istring file = __FILE__,
182 int line = __LINE__ )
183 {
184 if (!ok) throw this.setSock(msg, file, line);
185 }
186
187 /**************************************************************************
188
189 Queries and resets errno and sets the exception parameters.
190
191 Params:
192 msg = message
193 file = source code file name
194 line = source code line
195
196 Returns:
197 this instance
198
199 **************************************************************************/
200
201 public typeof (this) setSock ( lazy int errnum, istring msg,
202 istring file = __FILE__,
203 int line = __LINE__ )
204 {
205 int socket_errnum = this.error_code;
206
207 this.set(socket_errnum? socket_errnum : errnum, msg, file, line);
208
209 return this;
210 }
211
212 /**************************************************************************
213
214 Queries and resets errno and sets the exception parameters.
215
216 Params:
217 msg = message
218 file = source code file name
219 line = source code line
220
221 Returns:
222 this instance
223
224 **************************************************************************/
225
226 public typeof (this) setSock ( istring msg, istring file = __FILE__,
227 int line = __LINE__ )
228 {
229 return this.setSock(.errno, msg, file, line);
230 }
231 }