Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/network/socket/qnativesocketengine.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | - | |||||||
2 | - | |||||||
3 | - | |||||||
4 | - | |||||||
5 | - | |||||||
6 | - | |||||||
7 | - | |||||||
8 | QNativeSocketEnginePrivate::QNativeSocketEnginePrivate() : | - | ||||||
9 | socketDescriptor(-1), | - | ||||||
10 | readNotifier(0), | - | ||||||
11 | writeNotifier(0), | - | ||||||
12 | exceptNotifier(0) | - | ||||||
13 | { | - | ||||||
14 | - | |||||||
15 | - | |||||||
16 | - | |||||||
17 | } | - | ||||||
18 | - | |||||||
19 | - | |||||||
20 | - | |||||||
21 | - | |||||||
22 | QNativeSocketEnginePrivate::~QNativeSocketEnginePrivate() | - | ||||||
23 | { | - | ||||||
24 | } | - | ||||||
25 | - | |||||||
26 | - | |||||||
27 | - | |||||||
28 | - | |||||||
29 | - | |||||||
30 | - | |||||||
31 | - | |||||||
32 | void QNativeSocketEnginePrivate::setError(QAbstractSocket::SocketError error, ErrorString errorString) const | - | ||||||
33 | { | - | ||||||
34 | if (hasSetSocketError) { | - | ||||||
35 | - | |||||||
36 | - | |||||||
37 | - | |||||||
38 | - | |||||||
39 | - | |||||||
40 | - | |||||||
41 | - | |||||||
42 | return; | - | ||||||
43 | } | - | ||||||
44 | if (error != QAbstractSocket::SocketError(11)) | - | ||||||
45 | hasSetSocketError = true; | - | ||||||
46 | - | |||||||
47 | socketError = error; | - | ||||||
48 | - | |||||||
49 | switch (errorString) { | - | ||||||
50 | case NonBlockingInitFailedErrorString: | - | ||||||
51 | socketErrorString = QNativeSocketEngine::tr("Unable to initialize non-blocking socket"); | - | ||||||
52 | break; | - | ||||||
53 | case BroadcastingInitFailedErrorString: | - | ||||||
54 | socketErrorString = QNativeSocketEngine::tr("Unable to initialize broadcast socket"); | - | ||||||
55 | break; | - | ||||||
56 | - | |||||||
57 | case NoIpV6ErrorString: | - | ||||||
58 | socketErrorString = QNativeSocketEngine::tr("Attempt to use IPv6 socket on a platform with no IPv6 support"); | - | ||||||
59 | break; | - | ||||||
60 | case RemoteHostClosedErrorString: | - | ||||||
61 | socketErrorString = QNativeSocketEngine::tr("The remote host closed the connection"); | - | ||||||
62 | break; | - | ||||||
63 | case TimeOutErrorString: | - | ||||||
64 | socketErrorString = QNativeSocketEngine::tr("Network operation timed out"); | - | ||||||
65 | break; | - | ||||||
66 | case ResourceErrorString: | - | ||||||
67 | socketErrorString = QNativeSocketEngine::tr("Out of resources"); | - | ||||||
68 | break; | - | ||||||
69 | case OperationUnsupportedErrorString: | - | ||||||
70 | socketErrorString = QNativeSocketEngine::tr("Unsupported socket operation"); | - | ||||||
71 | break; | - | ||||||
72 | case ProtocolUnsupportedErrorString: | - | ||||||
73 | socketErrorString = QNativeSocketEngine::tr("Protocol type not supported"); | - | ||||||
74 | break; | - | ||||||
75 | case InvalidSocketErrorString: | - | ||||||
76 | socketErrorString = QNativeSocketEngine::tr("Invalid socket descriptor"); | - | ||||||
77 | break; | - | ||||||
78 | case HostUnreachableErrorString: | - | ||||||
79 | socketErrorString = QNativeSocketEngine::tr("Host unreachable"); | - | ||||||
80 | break; | - | ||||||
81 | case NetworkUnreachableErrorString: | - | ||||||
82 | socketErrorString = QNativeSocketEngine::tr("Network unreachable"); | - | ||||||
83 | break; | - | ||||||
84 | case AccessErrorString: | - | ||||||
85 | socketErrorString = QNativeSocketEngine::tr("Permission denied"); | - | ||||||
86 | break; | - | ||||||
87 | case ConnectionTimeOutErrorString: | - | ||||||
88 | socketErrorString = QNativeSocketEngine::tr("Connection timed out"); | - | ||||||
89 | break; | - | ||||||
90 | case ConnectionRefusedErrorString: | - | ||||||
91 | socketErrorString = QNativeSocketEngine::tr("Connection refused"); | - | ||||||
92 | break; | - | ||||||
93 | case AddressInuseErrorString: | - | ||||||
94 | socketErrorString = QNativeSocketEngine::tr("The bound address is already in use"); | - | ||||||
95 | break; | - | ||||||
96 | case AddressNotAvailableErrorString: | - | ||||||
97 | socketErrorString = QNativeSocketEngine::tr("The address is not available"); | - | ||||||
98 | break; | - | ||||||
99 | case AddressProtectedErrorString: | - | ||||||
100 | socketErrorString = QNativeSocketEngine::tr("The address is protected"); | - | ||||||
101 | break; | - | ||||||
102 | case DatagramTooLargeErrorString: | - | ||||||
103 | socketErrorString = QNativeSocketEngine::tr("Datagram was too large to send"); | - | ||||||
104 | break; | - | ||||||
105 | case SendDatagramErrorString: | - | ||||||
106 | socketErrorString = QNativeSocketEngine::tr("Unable to send a message"); | - | ||||||
107 | break; | - | ||||||
108 | case ReceiveDatagramErrorString: | - | ||||||
109 | socketErrorString = QNativeSocketEngine::tr("Unable to receive a message"); | - | ||||||
110 | break; | - | ||||||
111 | case WriteErrorString: | - | ||||||
112 | socketErrorString = QNativeSocketEngine::tr("Unable to write"); | - | ||||||
113 | break; | - | ||||||
114 | case ReadErrorString: | - | ||||||
115 | socketErrorString = QNativeSocketEngine::tr("Network error"); | - | ||||||
116 | break; | - | ||||||
117 | case PortInuseErrorString: | - | ||||||
118 | socketErrorString = QNativeSocketEngine::tr("Another socket is already listening on the same port"); | - | ||||||
119 | break; | - | ||||||
120 | case NotSocketErrorString: | - | ||||||
121 | socketErrorString = QNativeSocketEngine::tr("Operation on non-socket"); | - | ||||||
122 | break; | - | ||||||
123 | case InvalidProxyTypeString: | - | ||||||
124 | socketErrorString = QNativeSocketEngine::tr("The proxy type is invalid for this operation"); | - | ||||||
125 | break; | - | ||||||
126 | case TemporaryErrorString: | - | ||||||
127 | socketErrorString = QNativeSocketEngine::tr("Temporary error"); | - | ||||||
128 | break; | - | ||||||
129 | case NetworkDroppedConnectionErrorString: | - | ||||||
130 | socketErrorString = QNativeSocketEngine::tr("Network dropped connection on reset"); | - | ||||||
131 | break; | - | ||||||
132 | case ConnectionResetErrorString: | - | ||||||
133 | socketErrorString = QNativeSocketEngine::tr("Connection reset by peer"); | - | ||||||
134 | break; | - | ||||||
135 | case UnknownSocketErrorString: | - | ||||||
136 | socketErrorString = QNativeSocketEngine::tr("Unknown error"); | - | ||||||
137 | break; | - | ||||||
138 | } | - | ||||||
139 | } | - | ||||||
140 | QHostAddress QNativeSocketEnginePrivate::adjustAddressProtocol(const QHostAddress &address) const | - | ||||||
141 | { | - | ||||||
142 | QAbstractSocket::NetworkLayerProtocol targetProtocol = socketProtocol; | - | ||||||
143 | if (__builtin_expect(!!(targetProtocol == QAbstractSocket::UnknownNetworkLayerProtocol), true)) | - | ||||||
144 | return address; | - | ||||||
145 | - | |||||||
146 | QAbstractSocket::NetworkLayerProtocol sourceProtocol = address.protocol(); | - | ||||||
147 | - | |||||||
148 | if (targetProtocol == QAbstractSocket::AnyIPProtocol) | - | ||||||
149 | targetProtocol = QAbstractSocket::IPv6Protocol; | - | ||||||
150 | if (targetProtocol == QAbstractSocket::IPv6Protocol && sourceProtocol == QAbstractSocket::IPv4Protocol) { | - | ||||||
151 | - | |||||||
152 | return QHostAddress(address.toIPv6Address()); | - | ||||||
153 | } | - | ||||||
154 | - | |||||||
155 | if (targetProtocol == QAbstractSocket::IPv4Protocol && sourceProtocol == QAbstractSocket::IPv6Protocol) { | - | ||||||
156 | - | |||||||
157 | quint32 ip4 = address.toIPv4Address(); | - | ||||||
158 | if (ip4) | - | ||||||
159 | return QHostAddress(ip4); | - | ||||||
160 | } | - | ||||||
161 | - | |||||||
162 | return address; | - | ||||||
163 | } | - | ||||||
164 | - | |||||||
165 | bool QNativeSocketEnginePrivate::checkProxy(const QHostAddress &address) | - | ||||||
166 | { | - | ||||||
167 | if (address.isLoopback()) | - | ||||||
168 | return true; | - | ||||||
169 | - | |||||||
170 | - | |||||||
171 | QObject *parent = q_func()->parent(); | - | ||||||
172 | QNetworkProxy proxy; | - | ||||||
173 | if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) { | - | ||||||
174 | proxy = socket->proxy(); | - | ||||||
175 | } else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) { | - | ||||||
176 | proxy = server->proxy(); | - | ||||||
177 | } else { | - | ||||||
178 | - | |||||||
179 | return true; | - | ||||||
180 | } | - | ||||||
181 | - | |||||||
182 | if (proxy.type() == QNetworkProxy::DefaultProxy) | - | ||||||
183 | proxy = QNetworkProxy::applicationProxy(); | - | ||||||
184 | - | |||||||
185 | if (proxy.type() != QNetworkProxy::DefaultProxy && | - | ||||||
186 | proxy.type() != QNetworkProxy::NoProxy) { | - | ||||||
187 | - | |||||||
188 | setError(QAbstractSocket::UnsupportedSocketOperationError, | - | ||||||
189 | QNativeSocketEnginePrivate::InvalidProxyTypeString); | - | ||||||
190 | return false; | - | ||||||
191 | } | - | ||||||
192 | - | |||||||
193 | - | |||||||
194 | return true; | - | ||||||
195 | } | - | ||||||
196 | - | |||||||
197 | - | |||||||
198 | - | |||||||
199 | - | |||||||
200 | - | |||||||
201 | - | |||||||
202 | QNativeSocketEngine::QNativeSocketEngine(QObject *parent) | - | ||||||
203 | : QAbstractSocketEngine(*new QNativeSocketEnginePrivate(), parent) | - | ||||||
204 | { | - | ||||||
205 | } | - | ||||||
206 | - | |||||||
207 | - | |||||||
208 | - | |||||||
209 | - | |||||||
210 | QNativeSocketEngine::~QNativeSocketEngine() | - | ||||||
211 | { | - | ||||||
212 | close(); | - | ||||||
213 | } | - | ||||||
214 | bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol protocol) | - | ||||||
215 | { | - | ||||||
216 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
217 | if (isValid()) | - | ||||||
218 | close(); | - | ||||||
219 | - | |||||||
220 | - | |||||||
221 | if (!d->createNewSocket(socketType, protocol)) { | - | ||||||
222 | return false; | - | ||||||
223 | } | - | ||||||
224 | - | |||||||
225 | if (socketType == QAbstractSocket::UdpSocket) { | - | ||||||
226 | - | |||||||
227 | if (!setOption(BroadcastSocketOption, 1)) { | - | ||||||
228 | d->setError(QAbstractSocket::UnsupportedSocketOperationError, | - | ||||||
229 | QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString); | - | ||||||
230 | close(); | - | ||||||
231 | return false; | - | ||||||
232 | } | - | ||||||
233 | - | |||||||
234 | - | |||||||
235 | setOption(ReceivePacketInformation, 1); | - | ||||||
236 | setOption(ReceiveHopLimit, 1); | - | ||||||
237 | } | - | ||||||
238 | - | |||||||
239 | - | |||||||
240 | - | |||||||
241 | if (socketType == QAbstractSocket::TcpSocket | - | ||||||
242 | && !setOption(ReceiveOutOfBandData, 1)) { | - | ||||||
243 | QMessageLogger(__FILE__, 440447, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::initialize unable to inline out-of-band data"); | - | ||||||
244 | } | - | ||||||
245 | return true; | - | ||||||
246 | } | - | ||||||
247 | bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState) | - | ||||||
248 | { | - | ||||||
249 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
250 | - | |||||||
251 | if (isValid()) | - | ||||||
252 | close(); | - | ||||||
253 | - | |||||||
254 | d->socketDescriptor = socketDescriptor; | - | ||||||
255 | - | |||||||
256 | - | |||||||
257 | if (!d->fetchConnectionParameters()) { | - | ||||||
258 | - | |||||||
259 | - | |||||||
260 | - | |||||||
261 | - | |||||||
262 | d->socketDescriptor = -1; | - | ||||||
263 | return false; | - | ||||||
264 | } | - | ||||||
265 | - | |||||||
266 | if (d->socketType != QAbstractSocket::UnknownSocketType) { | - | ||||||
267 | - | |||||||
268 | if (!setOption(NonBlockingSocketOption, 1)) { | - | ||||||
269 | d->setError(QAbstractSocket::UnsupportedSocketOperationError, | - | ||||||
270 | QNativeSocketEnginePrivate::NonBlockingInitFailedErrorString); | - | ||||||
271 | close(); | - | ||||||
272 | return false; | - | ||||||
273 | } | - | ||||||
274 | - | |||||||
275 | - | |||||||
276 | if (d->socketType == QAbstractSocket::UdpSocket | - | ||||||
277 | && !setOption(BroadcastSocketOption, 1)) { | - | ||||||
278 | d->setError(QAbstractSocket::UnsupportedSocketOperationError, | - | ||||||
279 | QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString); | - | ||||||
280 | close(); | - | ||||||
281 | return false; | - | ||||||
282 | } | - | ||||||
283 | } | - | ||||||
284 | - | |||||||
285 | d->socketState = socketState; | - | ||||||
286 | return true; | - | ||||||
287 | } | - | ||||||
288 | - | |||||||
289 | - | |||||||
290 | - | |||||||
291 | - | |||||||
292 | - | |||||||
293 | - | |||||||
294 | bool QNativeSocketEngine::isValid() const | - | ||||||
295 | { | - | ||||||
296 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
297 | return d->socketDescriptor != -1; | - | ||||||
298 | } | - | ||||||
299 | - | |||||||
300 | - | |||||||
301 | - | |||||||
302 | - | |||||||
303 | - | |||||||
304 | qintptr QNativeSocketEngine::socketDescriptor() const | - | ||||||
305 | { | - | ||||||
306 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
307 | return d->socketDescriptor; | - | ||||||
308 | } | - | ||||||
309 | bool QNativeSocketEngine::connectToHost(const QHostAddress &address, quint16 port) | - | ||||||
310 | { | - | ||||||
311 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
312 | do { if (!isValid()) { QMessageLogger(__FILE__, 558565, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::connectToHost()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
313 | - | |||||||
314 | if (!d->checkProxy(address)) | - | ||||||
315 | return false; | - | ||||||
316 | - | |||||||
317 | do { if (d->socketState != (QAbstractSocket::BoundState) && d->socketState != (QAbstractSocket::UnconnectedState) && d->socketState != (QAbstractSocket::ConnectingState)) { QMessageLogger( | - | ||||||
318 | __FILE__ | - | ||||||
319 | , | - | ||||||
320 | 564571 | - | ||||||
321 | , __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::connectToHost()"" was called" " not in ""QAbstractSocket::BoundState"" or ""QAbstractSocket::UnconnectedState"); return (false); } } while (0) | - | ||||||
322 | ; | - | ||||||
323 | - | |||||||
324 | d->peerAddress = address; | - | ||||||
325 | d->peerPort = port; | - | ||||||
326 | bool connected = d->nativeConnect(d->adjustAddressProtocol(address), port); | - | ||||||
327 | if (connected) | - | ||||||
328 | d->fetchConnectionParameters(); | - | ||||||
329 | - | |||||||
330 | return connected; | - | ||||||
331 | } | - | ||||||
332 | - | |||||||
333 | - | |||||||
334 | - | |||||||
335 | - | |||||||
336 | - | |||||||
337 | void QNativeSocketEngine::connectionNotification() | - | ||||||
338 | { | - | ||||||
339 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
340 | ((!(state() == QAbstractSocket::ConnectingState)) ? qt_assert("state() == QAbstractSocket::ConnectingState",__FILE__,582589) : qt_noop()); | - | ||||||
341 | - | |||||||
342 | connectToHost(d->peerAddress, d->peerPort); | - | ||||||
343 | if (state() != QAbstractSocket::ConnectingState) { | - | ||||||
344 | - | |||||||
345 | QAbstractSocketEngine::connectionNotification(); | - | ||||||
346 | } | - | ||||||
347 | } | - | ||||||
348 | bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port) | - | ||||||
349 | { | - | ||||||
350 | (void)name;; | - | ||||||
351 | (void)port;; | - | ||||||
352 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
353 | d->setError(QAbstractSocket::UnsupportedSocketOperationError, | - | ||||||
354 | QNativeSocketEnginePrivate::OperationUnsupportedErrorString); | - | ||||||
355 | return false; | - | ||||||
356 | } | - | ||||||
357 | bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port) | - | ||||||
358 | { | - | ||||||
359 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
360 | do { if (!isValid()) { QMessageLogger(__FILE__, 621628, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::bind()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
361 | - | |||||||
362 | if (!d->checkProxy(address)) | - | ||||||
363 | return false; | - | ||||||
364 | - | |||||||
365 | do { if (d->socketState != (QAbstractSocket::UnconnectedState)) { QMessageLogger(__FILE__, 626633, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::bind()"" was not called in ""QAbstractSocket::UnconnectedState"); return (false); } } while (0); | - | ||||||
366 | - | |||||||
367 | if (!d->nativeBind(d->adjustAddressProtocol(address), port)) | - | ||||||
368 | return false; | - | ||||||
369 | - | |||||||
370 | d->fetchConnectionParameters(); | - | ||||||
371 | return true; | - | ||||||
372 | } | - | ||||||
373 | bool QNativeSocketEngine::listen() | - | ||||||
374 | { | - | ||||||
375 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
376 | do { if (!isValid()) { QMessageLogger(__FILE__, 653660, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::listen()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
377 | do { if (d->socketState != (QAbstractSocket::BoundState)) { QMessageLogger(__FILE__, 654661, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::listen()"" was not called in ""QAbstractSocket::BoundState"); return (false); } } while (0); | - | ||||||
378 | do { if (d->socketType != (QAbstractSocket::TcpSocket)) { QMessageLogger(__FILE__, 655662, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::listen()"" was called by a" " socket other than ""QAbstractSocket::TcpSocket"""); return (false); } } while (0); | - | ||||||
379 | - | |||||||
380 | - | |||||||
381 | - | |||||||
382 | - | |||||||
383 | - | |||||||
384 | return d->nativeListen(50); | - | ||||||
385 | } | - | ||||||
386 | int QNativeSocketEngine::accept() | - | ||||||
387 | { | - | ||||||
388 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
389 | do { if (!isValid()) { QMessageLogger(__FILE__, 674681, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::accept()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
390 | do { if (d->socketState != (QAbstractSocket::ListeningState)) { QMessageLogger(__FILE__, 675682, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::accept()"" was not called in ""QAbstractSocket::ListeningState"); return (-1); } } while (0); | - | ||||||
391 | do { if (d->socketType != (QAbstractSocket::TcpSocket)) { QMessageLogger(__FILE__, 676683, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::accept()"" was called by a" " socket other than ""QAbstractSocket::TcpSocket"""); return (-1); } } while (0); | - | ||||||
392 | - | |||||||
393 | return d->nativeAccept(); | - | ||||||
394 | } | - | ||||||
395 | qint64 QNativeSocketEngine::bytesAvailable() const | - | ||||||
396 | { | - | ||||||
397 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
398 | do { if (!isValid()) { QMessageLogger(__FILE__, 692699, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::bytesAvailable()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
399 | do { if (d->socketState == (QAbstractSocket::UnconnectedState)) { QMessageLogger(__FILE__, 693700, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::bytesAvailable()"" was called in ""QAbstractSocket::UnconnectedState"); return (-1); } } while (0); | - | ||||||
400 | - | |||||||
401 | return d->nativeBytesAvailable(); | - | ||||||
402 | } | - | ||||||
403 | - | |||||||
404 | - | |||||||
405 | - | |||||||
406 | - | |||||||
407 | - | |||||||
408 | - | |||||||
409 | - | |||||||
410 | bool QNativeSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress, | - | ||||||
411 | const QNetworkInterface &iface) | - | ||||||
412 | { | - | ||||||
413 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
414 | do { if (!isValid()) { QMessageLogger(__FILE__, 708715, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::joinMulticastGroup()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
415 | do { if (d->socketState != (QAbstractSocket::BoundState)) { QMessageLogger(__FILE__, 709716, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::joinMulticastGroup()"" was not called in ""QAbstractSocket::BoundState"); return (false); } } while (0); | - | ||||||
416 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 710717, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::joinMulticastGroup()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (false); } } while (0); | - | ||||||
417 | - | |||||||
418 | - | |||||||
419 | - | |||||||
420 | - | |||||||
421 | - | |||||||
422 | if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol && | - | ||||||
423 | (d->socketProtocol == QAbstractSocket::IPv6Protocol || | - | ||||||
424 | d->socketProtocol == QAbstractSocket::AnyIPProtocol)) { | - | ||||||
425 | QMessageLogger(__FILE__, 719726, __PRETTY_FUNCTION__).warning("QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group;" | - | ||||||
426 | " bind to QHostAddress::AnyIPv4 instead if you want to do this"); | - | ||||||
427 | return false; | - | ||||||
428 | } | - | ||||||
429 | - | |||||||
430 | return d->nativeJoinMulticastGroup(groupAddress, iface); | - | ||||||
431 | } | - | ||||||
432 | - | |||||||
433 | - | |||||||
434 | - | |||||||
435 | - | |||||||
436 | bool QNativeSocketEngine::leaveMulticastGroup(const QHostAddress &groupAddress, | - | ||||||
437 | const QNetworkInterface &iface) | - | ||||||
438 | { | - | ||||||
439 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
440 | do { if (!isValid()) { QMessageLogger(__FILE__, 734741, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::leaveMulticastGroup()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
441 | do { if (d->socketState != (QAbstractSocket::BoundState)) { QMessageLogger(__FILE__, 735742, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::leaveMulticastGroup()"" was not called in ""QAbstractSocket::BoundState"); return (false); } } while (0); | - | ||||||
442 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 736743, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::leaveMulticastGroup()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (false); } } while (0); | - | ||||||
443 | return d->nativeLeaveMulticastGroup(groupAddress, iface); | - | ||||||
444 | } | - | ||||||
445 | - | |||||||
446 | - | |||||||
447 | QNetworkInterface QNativeSocketEngine::multicastInterface() const | - | ||||||
448 | { | - | ||||||
449 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
450 | do { if (!isValid()) { QMessageLogger(__FILE__, 744751, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::multicastInterface()"" was called on an uninitialized socket device"); return QNetworkInterface(); } } while (0); | - | ||||||
451 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 745752, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::multicastInterface()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (QNetworkInterface()); } } while (0); | - | ||||||
452 | return d->nativeMulticastInterface(); | - | ||||||
453 | } | - | ||||||
454 | - | |||||||
455 | - | |||||||
456 | bool QNativeSocketEngine::setMulticastInterface(const QNetworkInterface &iface) | - | ||||||
457 | { | - | ||||||
458 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
459 | do { if (!isValid()) { QMessageLogger(__FILE__, 753760, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::setMulticastInterface()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
460 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 754761, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::setMulticastInterface()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (false); } } while (0); | - | ||||||
461 | return d->nativeSetMulticastInterface(iface); | - | ||||||
462 | } | - | ||||||
463 | bool QNativeSocketEngine::hasPendingDatagrams() const | - | ||||||
464 | { | - | ||||||
465 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
466 | do { if (!isValid()) { QMessageLogger(__FILE__, 768775, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::hasPendingDatagrams()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
467 | do { if (d->socketState == (QAbstractSocket::UnconnectedState)) { QMessageLogger(__FILE__, 769776, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::hasPendingDatagrams()"" was called in ""QAbstractSocket::UnconnectedState"); return (false); } } while (0); | - | ||||||
468 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 770777, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::hasPendingDatagrams()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (false); } } while (0); | - | ||||||
469 | - | |||||||
470 | return d->nativeHasPendingDatagrams(); | - | ||||||
471 | } | - | ||||||
472 | - | |||||||
473 | - | |||||||
474 | - | |||||||
475 | - | |||||||
476 | - | |||||||
477 | - | |||||||
478 | - | |||||||
479 | qint64 QNativeSocketEngine::pendingDatagramSize() const | - | ||||||
480 | { | - | ||||||
481 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
482 | do { if (!isValid()) { QMessageLogger(__FILE__, 784791, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::pendingDatagramSize()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
483 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 785792, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::pendingDatagramSize()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (-1); } } while (0); | - | ||||||
484 | - | |||||||
485 | return d->nativePendingDatagramSize(); | - | ||||||
486 | } | - | ||||||
487 | qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxSize, QIpPacketHeader *header, | - | ||||||
488 | PacketHeaderOptions options) | - | ||||||
489 | { | - | ||||||
490 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
491 | do { if (!isValid()) { QMessageLogger(__FILE__, 808815, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::readDatagram()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
492 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 809816, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::readDatagram()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (-1); } } while (0); | - | ||||||
493 | - | |||||||
494 | return d->nativeReceiveDatagram(data, maxSize, header, options); | - | ||||||
495 | } | - | ||||||
496 | qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 size, const QIpPacketHeader &header) | - | ||||||
497 | { | - | ||||||
498 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
499 | do { if (!isValid()) { QMessageLogger(__FILE__, 839846, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::writeDatagram()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
500 | do { if (d->socketType != (QAbstractSocket::UdpSocket)) { QMessageLogger(__FILE__, 840847, __PRETTY_FUNCTION__).warning("QNativeSocketEngine::writeDatagram()"" was called by a" " socket other than ""QAbstractSocket::UdpSocket"""); return (-1); } } while (0); | - | ||||||
501 | - | |||||||
502 | return d->nativeSendDatagram(data, size, header); | - | ||||||
503 | } | - | ||||||
504 | qint64 QNativeSocketEngine::write(const char *data, qint64 size) | - | ||||||
505 | { | - | ||||||
506 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
507 | do { if (!isValid()) { QMessageLogger(__FILE__, 857864, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::write()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
508 | do { if (d->socketState != (QAbstractSocket::ConnectedState)) { QMessageLogger(__FILE__, 858865, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::write()"" was not called in ""QAbstractSocket::ConnectedState"); return (-1); } } while (0); | - | ||||||
509 | return d->nativeWrite(data, size); | - | ||||||
510 | } | - | ||||||
511 | - | |||||||
512 | - | |||||||
513 | qint64 QNativeSocketEngine::bytesToWrite() const | - | ||||||
514 | { | - | ||||||
515 | return 0; | - | ||||||
516 | } | - | ||||||
517 | - | |||||||
518 | - | |||||||
519 | - | |||||||
520 | - | |||||||
521 | - | |||||||
522 | qint64 QNativeSocketEngine::read(char *data, qint64 maxSize) | - | ||||||
523 | { | - | ||||||
524 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
525 | do { if (!isValid()) { QMessageLogger(__FILE__, 875882, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::read()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
526 | do { if (d->socketState != (QAbstractSocket::ConnectedState) && d->socketState != (QAbstractSocket::BoundState)) { QMessageLogger(__FILE__, 876883, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::read()"" was called" " not in ""QAbstractSocket::ConnectedState"" or ""QAbstractSocket::BoundState"); return (-1); } } while (0); | - | ||||||
527 | - | |||||||
528 | qint64 readBytes = d->nativeRead(data, maxSize); | - | ||||||
529 | - | |||||||
530 | - | |||||||
531 | if (readBytes == 0 && d->socketType == QAbstractSocket::TcpSocket) { | - | ||||||
532 | d->setError(QAbstractSocket::RemoteHostClosedError, | - | ||||||
533 | QNativeSocketEnginePrivate::RemoteHostClosedErrorString); | - | ||||||
534 | close(); | - | ||||||
535 | return -1; | - | ||||||
536 | } else if (readBytes == -1) { | - | ||||||
537 | if (!d->hasSetSocketError) { | - | ||||||
538 | d->hasSetSocketError = true; | - | ||||||
539 | d->socketError = QAbstractSocket::NetworkError; | - | ||||||
540 | d->socketErrorString = qt_error_string(); | - | ||||||
541 | } | - | ||||||
542 | close(); | - | ||||||
543 | return -1; | - | ||||||
544 | } | - | ||||||
545 | return readBytes; | - | ||||||
546 | } | - | ||||||
547 | - | |||||||
548 | - | |||||||
549 | - | |||||||
550 | - | |||||||
551 | - | |||||||
552 | void QNativeSocketEngine::close() | - | ||||||
553 | { | - | ||||||
554 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
555 | if (d->readNotifier
| 5137-73055 | ||||||
556 | d->readNotifier->setEnabled(false); executed 5137 times by 31 tests: d->readNotifier->setEnabled(false); Executed by:
| 5137 | ||||||
557 | if (d->writeNotifier
| 4264-73928 | ||||||
558 | d->writeNotifier->setEnabled(false); executed 4264 times by 29 tests: d->writeNotifier->setEnabled(false); Executed by:
| 4264 | ||||||
559 | if (d->exceptNotifier
| 0-78192 | ||||||
560 | d->exceptNotifier->setEnabled(false); never executed: d->exceptNotifier->setEnabled(false); | 0 | ||||||
561 | - | |||||||
562 | if(d->socketDescriptor != -1
| 6907-71285 | ||||||
563 | d->nativeClose(); | - | ||||||
564 | d->socketDescriptor = -1; | - | ||||||
565 | } executed 71284 times by 32 tests: end of block Executed by:
| 71284 | ||||||
566 | d->socketState = QAbstractSocket::UnconnectedState; | - | ||||||
567 | d->hasSetSocketError = false; | - | ||||||
568 | d->localPort = 0; | - | ||||||
569 | d->localAddress.clear(); | - | ||||||
570 | d->peerPort = 0; | - | ||||||
571 | d->peerAddress.clear(); | - | ||||||
572 | d->inboundStreamCount = d->outboundStreamCount = 0; | - | ||||||
573 | if (d->readNotifier
| 5136-73055 | ||||||
574 | qDeleteInEventHandler(d->readNotifier); | - | ||||||
575 | d->readNotifier = 0; | - | ||||||
576 | } executed 5136 times by 31 tests: end of block Executed by:
| 5136 | ||||||
577 | if (d->writeNotifier
| 4263-73928 | ||||||
578 | qDeleteInEventHandler(d->writeNotifier); | - | ||||||
579 | d->writeNotifier = 0; | - | ||||||
580 | } executed 4263 times by 29 tests: end of block Executed by:
| 4263 | ||||||
581 | if (d->exceptNotifier
| 0-78191 | ||||||
582 | qDeleteInEventHandler(d->exceptNotifier); | - | ||||||
583 | d->exceptNotifier = 0; | - | ||||||
584 | } never executed: end of block | 0 | ||||||
585 | } executed 78191 times by 32 tests: end of block Executed by:
| 78191 | ||||||
586 | bool QNativeSocketEngine::waitForRead(int msecs, bool *timedOut) | - | ||||||
587 | { | - | ||||||
588 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
589 | do { if (!isValid()) { QMessageLogger(__FILE__, 954962, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForRead()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
590 | do { if (d->socketState == (QAbstractSocket::UnconnectedState)) { QMessageLogger( | - | ||||||
591 | __FILE__ | - | ||||||
592 | , | - | ||||||
593 | 956964 | - | ||||||
594 | , __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForRead()"" was called in ""QAbstractSocket::UnconnectedState"); return (false); } } while (0) | - | ||||||
595 | ; | - | ||||||
596 | - | |||||||
597 | if (timedOut) | - | ||||||
598 | *timedOut = false; | - | ||||||
599 | - | |||||||
600 | int ret = d->nativeSelect(msecs, true); | - | ||||||
601 | if (ret == 0) { | - | ||||||
602 | if (timedOut) | - | ||||||
603 | *timedOut = true; | - | ||||||
604 | d->setError(QAbstractSocket::SocketTimeoutError, | - | ||||||
605 | QNativeSocketEnginePrivate::TimeOutErrorString); | - | ||||||
606 | d->hasSetSocketError = false; | - | ||||||
607 | return false; | - | ||||||
608 | } else if (state() == QAbstractSocket::ConnectingState) { | - | ||||||
609 | connectToHost(d->peerAddress, d->peerPort); | - | ||||||
610 | } | - | ||||||
611 | - | |||||||
612 | return ret > 0; | - | ||||||
613 | } | - | ||||||
614 | bool QNativeSocketEngine::waitForWrite(int msecs, bool *timedOut) | - | ||||||
615 | { | - | ||||||
616 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
617 | do { if (!isValid()) { QMessageLogger(__FILE__, 9941002, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForWrite()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
618 | do { if (d->socketState == (QAbstractSocket::UnconnectedState)) { QMessageLogger( | - | ||||||
619 | __FILE__ | - | ||||||
620 | , | - | ||||||
621 | 9961004 | - | ||||||
622 | , __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForWrite()"" was called in ""QAbstractSocket::UnconnectedState"); return (false); } } while (0) | - | ||||||
623 | ; | - | ||||||
624 | - | |||||||
625 | if (timedOut) | - | ||||||
626 | *timedOut = false; | - | ||||||
627 | - | |||||||
628 | int ret = d->nativeSelect(msecs, false); | - | ||||||
629 | if (ret == 0) { | - | ||||||
630 | if (timedOut) | - | ||||||
631 | *timedOut = true; | - | ||||||
632 | d->setError(QAbstractSocket::SocketTimeoutError, | - | ||||||
633 | QNativeSocketEnginePrivate::TimeOutErrorString); | - | ||||||
634 | d->hasSetSocketError = false; | - | ||||||
635 | return false; | - | ||||||
636 | } else if (state() == QAbstractSocket::ConnectingState || (state() == QAbstractSocket::BoundState && d->socketDescriptor != -1)) { | - | ||||||
637 | connectToHost(d->peerAddress, d->peerPort); | - | ||||||
638 | } | - | ||||||
639 | - | |||||||
640 | return ret > 0; | - | ||||||
641 | } | - | ||||||
642 | - | |||||||
643 | bool QNativeSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWrite, | - | ||||||
644 | bool checkRead, bool checkWrite, | - | ||||||
645 | int msecs, bool *timedOut) | - | ||||||
646 | { | - | ||||||
647 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
648 | do { if (!isValid()) { QMessageLogger(__FILE__, 10501058, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForWrite()"" was called on an uninitialized socket device"); return false; } } while (0); | - | ||||||
649 | do { if (d->socketState == (QAbstractSocket::UnconnectedState)) { QMessageLogger( | - | ||||||
650 | __FILE__ | - | ||||||
651 | , | - | ||||||
652 | 10521060 | - | ||||||
653 | , __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::waitForReadOrWrite()"" was called in ""QAbstractSocket::UnconnectedState"); return (false); } } while (0) | - | ||||||
654 | ; | - | ||||||
655 | - | |||||||
656 | int ret = d->nativeSelect(msecs, checkRead, checkWrite, readyToRead, readyToWrite); | - | ||||||
657 | if (ret == 0) { | - | ||||||
658 | if (timedOut) | - | ||||||
659 | *timedOut = true; | - | ||||||
660 | d->setError(QAbstractSocket::SocketTimeoutError, | - | ||||||
661 | QNativeSocketEnginePrivate::TimeOutErrorString); | - | ||||||
662 | d->hasSetSocketError = false; | - | ||||||
663 | return false; | - | ||||||
664 | } else if (state() == QAbstractSocket::ConnectingState) { | - | ||||||
665 | connectToHost(d->peerAddress, d->peerPort); | - | ||||||
666 | } | - | ||||||
667 | - | |||||||
668 | return ret > 0; | - | ||||||
669 | } | - | ||||||
670 | - | |||||||
671 | - | |||||||
672 | - | |||||||
673 | - | |||||||
674 | - | |||||||
675 | - | |||||||
676 | - | |||||||
677 | qint64 QNativeSocketEngine::receiveBufferSize() const | - | ||||||
678 | { | - | ||||||
679 | do { if (!isValid()) { QMessageLogger(__FILE__, 11051113, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::receiveBufferSize()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
680 | return option(ReceiveBufferSocketOption); | - | ||||||
681 | } | - | ||||||
682 | void QNativeSocketEngine::setReceiveBufferSize(qint64 size) | - | ||||||
683 | { | - | ||||||
684 | do { if (!isValid()) { QMessageLogger(__FILE__, 11261134, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::setReceiveBufferSize()"" was called on an uninitialized socket device"); return ; } } while (0); | - | ||||||
685 | setOption(ReceiveBufferSocketOption, size); | - | ||||||
686 | } | - | ||||||
687 | - | |||||||
688 | - | |||||||
689 | - | |||||||
690 | - | |||||||
691 | - | |||||||
692 | - | |||||||
693 | qint64 QNativeSocketEngine::sendBufferSize() const | - | ||||||
694 | { | - | ||||||
695 | do { if (!isValid()) { QMessageLogger(__FILE__, 11371145, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::setSendBufferSize()"" was called on an uninitialized socket device"); return -1; } } while (0); | - | ||||||
696 | return option(SendBufferSocketOption); | - | ||||||
697 | } | - | ||||||
698 | void QNativeSocketEngine::setSendBufferSize(qint64 size) | - | ||||||
699 | { | - | ||||||
700 | do { if (!isValid()) { QMessageLogger(__FILE__, 11521160, __PRETTY_FUNCTION__).warning("""QNativeSocketEngine::setSendBufferSize()"" was called on an uninitialized socket device"); return ; } } while (0); | - | ||||||
701 | setOption(SendBufferSocketOption, size); | - | ||||||
702 | } | - | ||||||
703 | - | |||||||
704 | - | |||||||
705 | - | |||||||
706 | - | |||||||
707 | - | |||||||
708 | bool QNativeSocketEngine::setOption(SocketOption option, int value) | - | ||||||
709 | { | - | ||||||
710 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
711 | return d->setOption(option, value); | - | ||||||
712 | } | - | ||||||
713 | - | |||||||
714 | - | |||||||
715 | - | |||||||
716 | - | |||||||
717 | int QNativeSocketEngine::option(SocketOption socketOption) const | - | ||||||
718 | { | - | ||||||
719 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
720 | return d->option(socketOption); | - | ||||||
721 | } | - | ||||||
722 | - | |||||||
723 | bool QNativeSocketEngine::isReadNotificationEnabled() const | - | ||||||
724 | { | - | ||||||
725 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
726 | return d->readNotifier && d->readNotifier->isEnabled(); | - | ||||||
727 | } | - | ||||||
728 | class QReadNotifier : public QSocketNotifier | - | ||||||
729 | { | - | ||||||
730 | public: | - | ||||||
731 | QReadNotifier(qintptr fd, QNativeSocketEngine *parent) | - | ||||||
732 | : QSocketNotifier(fd, QSocketNotifier::Read, parent) | - | ||||||
733 | { engine = parent; } | - | ||||||
734 | - | |||||||
735 | protected: | - | ||||||
736 | bool event(QEvent *); | - | ||||||
737 | - | |||||||
738 | QNativeSocketEngine *engine; | - | ||||||
739 | }; | - | ||||||
740 | - | |||||||
741 | bool QReadNotifier::event(QEvent *e) | - | ||||||
742 | { | - | ||||||
743 | if (e->type() == QEvent::SockAct) { | - | ||||||
744 | engine->readNotification(); | - | ||||||
745 | return true; | - | ||||||
746 | } else if (e->type() == QEvent::SockClose) { | - | ||||||
747 | engine->closeNotification(); | - | ||||||
748 | return true; | - | ||||||
749 | } | - | ||||||
750 | return QSocketNotifier::event(e); | - | ||||||
751 | } | - | ||||||
752 | class QWriteNotifier : public QSocketNotifier | - | ||||||
753 | { | - | ||||||
754 | public: | - | ||||||
755 | QWriteNotifier(int fd, QNativeSocketEngine *parent) | - | ||||||
756 | : QSocketNotifier(fd, QSocketNotifier::Write, parent) { engine = parent; } | - | ||||||
757 | - | |||||||
758 | protected: | - | ||||||
759 | bool event(QEvent *); | - | ||||||
760 | - | |||||||
761 | QNativeSocketEngine *engine; | - | ||||||
762 | }; | - | ||||||
763 | - | |||||||
764 | bool QWriteNotifier::event(QEvent *e) | - | ||||||
765 | { | - | ||||||
766 | if (e->type() == QEvent::SockAct) { | - | ||||||
767 | if (engine->state() == QAbstractSocket::ConnectingState) | - | ||||||
768 | engine->connectionNotification(); | - | ||||||
769 | else | - | ||||||
770 | engine->writeNotification(); | - | ||||||
771 | return true; | - | ||||||
772 | } | - | ||||||
773 | return QSocketNotifier::event(e); | - | ||||||
774 | } | - | ||||||
775 | - | |||||||
776 | class QExceptionNotifier : public QSocketNotifier | - | ||||||
777 | { | - | ||||||
778 | public: | - | ||||||
779 | QExceptionNotifier(int fd, QNativeSocketEngine *parent) | - | ||||||
780 | : QSocketNotifier(fd, QSocketNotifier::Exception, parent) { engine = parent; } | - | ||||||
781 | - | |||||||
782 | protected: | - | ||||||
783 | bool event(QEvent *); | - | ||||||
784 | - | |||||||
785 | QNativeSocketEngine *engine; | - | ||||||
786 | }; | - | ||||||
787 | - | |||||||
788 | bool QExceptionNotifier::event(QEvent *e) | - | ||||||
789 | { | - | ||||||
790 | if (e->type() == QEvent::SockAct) { | - | ||||||
791 | if (engine->state() == QAbstractSocket::ConnectingState) | - | ||||||
792 | engine->connectionNotification(); | - | ||||||
793 | else | - | ||||||
794 | engine->exceptionNotification(); | - | ||||||
795 | return true; | - | ||||||
796 | } | - | ||||||
797 | return QSocketNotifier::event(e); | - | ||||||
798 | } | - | ||||||
799 | - | |||||||
800 | void QNativeSocketEngine::setReadNotificationEnabled(bool enable) | - | ||||||
801 | { | - | ||||||
802 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
803 | if (d->readNotifier) { | - | ||||||
804 | d->readNotifier->setEnabled(enable); | - | ||||||
805 | } else if (enable && d->threadData->hasEventDispatcher()) { | - | ||||||
806 | d->readNotifier = new QReadNotifier(d->socketDescriptor, this); | - | ||||||
807 | d->readNotifier->setEnabled(true); | - | ||||||
808 | } | - | ||||||
809 | } | - | ||||||
810 | - | |||||||
811 | bool QNativeSocketEngine::isWriteNotificationEnabled() const | - | ||||||
812 | { | - | ||||||
813 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
814 | return d->writeNotifier && d->writeNotifier->isEnabled(); | - | ||||||
815 | } | - | ||||||
816 | - | |||||||
817 | void QNativeSocketEngine::setWriteNotificationEnabled(bool enable) | - | ||||||
818 | { | - | ||||||
819 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
820 | if (d->writeNotifier) { | - | ||||||
821 | d->writeNotifier->setEnabled(enable); | - | ||||||
822 | } else if (enable && d->threadData->hasEventDispatcher()) { | - | ||||||
823 | d->writeNotifier = new QWriteNotifier(d->socketDescriptor, this); | - | ||||||
824 | d->writeNotifier->setEnabled(true); | - | ||||||
825 | } | - | ||||||
826 | } | - | ||||||
827 | - | |||||||
828 | bool QNativeSocketEngine::isExceptionNotificationEnabled() const | - | ||||||
829 | { | - | ||||||
830 | const QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
831 | return d->exceptNotifier && d->exceptNotifier->isEnabled(); | - | ||||||
832 | } | - | ||||||
833 | - | |||||||
834 | void QNativeSocketEngine::setExceptionNotificationEnabled(bool enable) | - | ||||||
835 | { | - | ||||||
836 | QNativeSocketEnginePrivate * const d = d_func(); | - | ||||||
837 | if (d->exceptNotifier) { | - | ||||||
838 | d->exceptNotifier->setEnabled(enable); | - | ||||||
839 | } else if (enable && d->threadData->hasEventDispatcher()) { | - | ||||||
840 | d->exceptNotifier = new QExceptionNotifier(d->socketDescriptor, this); | - | ||||||
841 | d->exceptNotifier->setEnabled(true); | - | ||||||
842 | } | - | ||||||
843 | } | - | ||||||
844 | - | |||||||
845 | - | |||||||
Switch to Source code | Preprocessed file |