Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtNetwork module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | //#define QABSTRACTSOCKET_DEBUG | - |
43 | | - |
44 | /*! | - |
45 | \class QAbstractSocket | - |
46 | | - |
47 | \brief The QAbstractSocket class provides the base functionality | - |
48 | common to all socket types. | - |
49 | | - |
50 | \reentrant | - |
51 | \ingroup network | - |
52 | \inmodule QtNetwork | - |
53 | | - |
54 | QAbstractSocket is the base class for QTcpSocket and QUdpSocket | - |
55 | and contains all common functionality of these two classes. If | - |
56 | you need a socket, you have two options: | - |
57 | | - |
58 | \list | - |
59 | \li Instantiate QTcpSocket or QUdpSocket. | - |
60 | \li Create a native socket descriptor, instantiate | - |
61 | QAbstractSocket, and call setSocketDescriptor() to wrap the | - |
62 | native socket. | - |
63 | \endlist | - |
64 | | - |
65 | TCP (Transmission Control Protocol) is a reliable, | - |
66 | stream-oriented, connection-oriented transport protocol. UDP | - |
67 | (User Datagram Protocol) is an unreliable, datagram-oriented, | - |
68 | connectionless protocol. In practice, this means that TCP is | - |
69 | better suited for continuous transmission of data, whereas the | - |
70 | more lightweight UDP can be used when reliability isn't | - |
71 | important. | - |
72 | | - |
73 | QAbstractSocket's API unifies most of the differences between the | - |
74 | two protocols. For example, although UDP is connectionless, | - |
75 | connectToHost() establishes a virtual connection for UDP sockets, | - |
76 | enabling you to use QAbstractSocket in more or less the same way | - |
77 | regardless of the underlying protocol. Internally, | - |
78 | QAbstractSocket remembers the address and port passed to | - |
79 | connectToHost(), and functions like read() and write() use these | - |
80 | values. | - |
81 | | - |
82 | At any time, QAbstractSocket has a state (returned by | - |
83 | state()). The initial state is UnconnectedState. After | - |
84 | calling connectToHost(), the socket first enters | - |
85 | HostLookupState. If the host is found, QAbstractSocket enters | - |
86 | ConnectingState and emits the hostFound() signal. When the | - |
87 | connection has been established, it enters ConnectedState and | - |
88 | emits connected(). If an error occurs at any stage, error() is | - |
89 | emitted. Whenever the state changes, stateChanged() is emitted. | - |
90 | For convenience, isValid() returns true if the socket is ready for | - |
91 | reading and writing, but note that the socket's state must be | - |
92 | ConnectedState before reading and writing can occur. | - |
93 | | - |
94 | Read or write data by calling read() or write(), or use the | - |
95 | convenience functions readLine() and readAll(). QAbstractSocket | - |
96 | also inherits getChar(), putChar(), and ungetChar() from | - |
97 | QIODevice, which work on single bytes. The bytesWritten() signal | - |
98 | is emitted when data has been written to the socket. Note that Qt does | - |
99 | not limit the write buffer size. You can monitor its size by listening | - |
100 | to this signal. | - |
101 | | - |
102 | The readyRead() signal is emitted every time a new chunk of data | - |
103 | has arrived. bytesAvailable() then returns the number of bytes | - |
104 | that are available for reading. Typically, you would connect the | - |
105 | readyRead() signal to a slot and read all available data there. | - |
106 | If you don't read all the data at once, the remaining data will | - |
107 | still be available later, and any new incoming data will be | - |
108 | appended to QAbstractSocket's internal read buffer. To limit the | - |
109 | size of the read buffer, call setReadBufferSize(). | - |
110 | | - |
111 | To close the socket, call disconnectFromHost(). QAbstractSocket enters | - |
112 | QAbstractSocket::ClosingState. After all pending data has been written to | - |
113 | the socket, QAbstractSocket actually closes the socket, enters | - |
114 | QAbstractSocket::ClosedState, and emits disconnected(). If you want to | - |
115 | abort a connection immediately, discarding all pending data, call abort() | - |
116 | instead. If the remote host closes the connection, QAbstractSocket will | - |
117 | emit error(QAbstractSocket::RemoteHostClosedError), during which the socket | - |
118 | state will still be ConnectedState, and then the disconnected() signal | - |
119 | will be emitted. | - |
120 | | - |
121 | The port and address of the connected peer is fetched by calling | - |
122 | peerPort() and peerAddress(). peerName() returns the host name of | - |
123 | the peer, as passed to connectToHost(). localPort() and | - |
124 | localAddress() return the port and address of the local socket. | - |
125 | | - |
126 | QAbstractSocket provides a set of functions that suspend the | - |
127 | calling thread until certain signals are emitted. These functions | - |
128 | can be used to implement blocking sockets: | - |
129 | | - |
130 | \list | - |
131 | \li waitForConnected() blocks until a connection has been established. | - |
132 | | - |
133 | \li waitForReadyRead() blocks until new data is available for | - |
134 | reading. | - |
135 | | - |
136 | \li waitForBytesWritten() blocks until one payload of data has been | - |
137 | written to the socket. | - |
138 | | - |
139 | \li waitForDisconnected() blocks until the connection has closed. | - |
140 | \endlist | - |
141 | | - |
142 | We show an example: | - |
143 | | - |
144 | \snippet network/tcpwait.cpp 0 | - |
145 | | - |
146 | If \l{QIODevice::}{waitForReadyRead()} returns false, the | - |
147 | connection has been closed or an error has occurred. | - |
148 | | - |
149 | Programming with a blocking socket is radically different from | - |
150 | programming with a non-blocking socket. A blocking socket doesn't | - |
151 | require an event loop and typically leads to simpler code. | - |
152 | However, in a GUI application, blocking sockets should only be | - |
153 | used in non-GUI threads, to avoid freezing the user interface. | - |
154 | See the \l fortuneclient and \l blockingfortuneclient | - |
155 | examples for an overview of both approaches. | - |
156 | | - |
157 | \note We discourage the use of the blocking functions together | - |
158 | with signals. One of the two possibilities should be used. | - |
159 | | - |
160 | QAbstractSocket can be used with QTextStream and QDataStream's | - |
161 | stream operators (operator<<() and operator>>()). There is one | - |
162 | issue to be aware of, though: You must make sure that enough data | - |
163 | is available before attempting to read it using operator>>(). | - |
164 | | - |
165 | \sa QNetworkAccessManager, QTcpServer | - |
166 | */ | - |
167 | | - |
168 | /*! | - |
169 | \fn void QAbstractSocket::hostFound() | - |
170 | | - |
171 | This signal is emitted after connectToHost() has been called and | - |
172 | the host lookup has succeeded. | - |
173 | | - |
174 | \note Since Qt 4.6.3 QAbstractSocket may emit hostFound() | - |
175 | directly from the connectToHost() call since a DNS result could have been | - |
176 | cached. | - |
177 | | - |
178 | \sa connected() | - |
179 | */ | - |
180 | | - |
181 | /*! | - |
182 | \fn void QAbstractSocket::connected() | - |
183 | | - |
184 | This signal is emitted after connectToHost() has been called and | - |
185 | a connection has been successfully established. | - |
186 | | - |
187 | \note On some operating systems the connected() signal may | - |
188 | be directly emitted from the connectToHost() call for connections | - |
189 | to the localhost. | - |
190 | | - |
191 | \sa connectToHost(), disconnected() | - |
192 | */ | - |
193 | | - |
194 | /*! | - |
195 | \fn void QAbstractSocket::disconnected() | - |
196 | | - |
197 | This signal is emitted when the socket has been disconnected. | - |
198 | | - |
199 | \warning If you need to delete the sender() of this signal in a slot connected | - |
200 | to it, use the \l{QObject::deleteLater()}{deleteLater()} function. | - |
201 | | - |
202 | \sa connectToHost(), disconnectFromHost(), abort() | - |
203 | */ | - |
204 | | - |
205 | /*! | - |
206 | \fn void QAbstractSocket::error(QAbstractSocket::SocketError socketError) | - |
207 | | - |
208 | This signal is emitted after an error occurred. The \a socketError | - |
209 | parameter describes the type of error that occurred. | - |
210 | | - |
211 | QAbstractSocket::SocketError is not a registered metatype, so for queued | - |
212 | connections, you will have to register it with Q_DECLARE_METATYPE() and | - |
213 | qRegisterMetaType(). | - |
214 | | - |
215 | \sa error(), errorString(), {Creating Custom Qt Types} | - |
216 | */ | - |
217 | | - |
218 | /*! | - |
219 | \fn void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState) | - |
220 | | - |
221 | This signal is emitted whenever QAbstractSocket's state changes. | - |
222 | The \a socketState parameter is the new state. | - |
223 | | - |
224 | QAbstractSocket::SocketState is not a registered metatype, so for queued | - |
225 | connections, you will have to register it with Q_DECLARE_METATYPE() and | - |
226 | qRegisterMetaType(). | - |
227 | | - |
228 | \sa state(), {Creating Custom Qt Types} | - |
229 | */ | - |
230 | | - |
231 | /*! | - |
232 | \fn void QAbstractSocket::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) | - |
233 | \since 4.3 | - |
234 | | - |
235 | This signal can be emitted when a \a proxy that requires | - |
236 | authentication is used. The \a authenticator object can then be | - |
237 | filled in with the required details to allow authentication and | - |
238 | continue the connection. | - |
239 | | - |
240 | \note It is not possible to use a QueuedConnection to connect to | - |
241 | this signal, as the connection will fail if the authenticator has | - |
242 | not been filled in with new information when the signal returns. | - |
243 | | - |
244 | \sa QAuthenticator, QNetworkProxy | - |
245 | */ | - |
246 | | - |
247 | /*! | - |
248 | \enum QAbstractSocket::NetworkLayerProtocol | - |
249 | | - |
250 | This enum describes the network layer protocol values used in Qt. | - |
251 | | - |
252 | \value IPv4Protocol IPv4 | - |
253 | \value IPv6Protocol IPv6 | - |
254 | \value AnyIPProtocol Either IPv4 or IPv6 | - |
255 | \value UnknownNetworkLayerProtocol Other than IPv4 and IPv6 | - |
256 | | - |
257 | \sa QHostAddress::protocol() | - |
258 | */ | - |
259 | | - |
260 | /*! | - |
261 | \enum QAbstractSocket::SocketType | - |
262 | | - |
263 | This enum describes the transport layer protocol. | - |
264 | | - |
265 | \value TcpSocket TCP | - |
266 | \value UdpSocket UDP | - |
267 | \value UnknownSocketType Other than TCP and UDP | - |
268 | | - |
269 | \sa QAbstractSocket::socketType() | - |
270 | */ | - |
271 | | - |
272 | /*! | - |
273 | \enum QAbstractSocket::SocketError | - |
274 | | - |
275 | This enum describes the socket errors that can occur. | - |
276 | | - |
277 | \value ConnectionRefusedError The connection was refused by the | - |
278 | peer (or timed out). | - |
279 | \value RemoteHostClosedError The remote host closed the | - |
280 | connection. Note that the client socket (i.e., this socket) | - |
281 | will be closed after the remote close notification has | - |
282 | been sent. | - |
283 | \value HostNotFoundError The host address was not found. | - |
284 | \value SocketAccessError The socket operation failed because the | - |
285 | application lacked the required privileges. | - |
286 | \value SocketResourceError The local system ran out of resources | - |
287 | (e.g., too many sockets). | - |
288 | \value SocketTimeoutError The socket operation timed out. | - |
289 | \value DatagramTooLargeError The datagram was larger than the | - |
290 | operating system's limit (which can be as low as 8192 | - |
291 | bytes). | - |
292 | \value NetworkError An error occurred with the network (e.g., the | - |
293 | network cable was accidentally plugged out). | - |
294 | \value AddressInUseError The address specified to QAbstractSocket::bind() is | - |
295 | already in use and was set to be exclusive. | - |
296 | \value SocketAddressNotAvailableError The address specified to | - |
297 | QAbstractSocket::bind() does not belong to the host. | - |
298 | \value UnsupportedSocketOperationError The requested socket operation is | - |
299 | not supported by the local operating system (e.g., lack of | - |
300 | IPv6 support). | - |
301 | \value ProxyAuthenticationRequiredError The socket is using a proxy, and | - |
302 | the proxy requires authentication. | - |
303 | \value SslHandshakeFailedError The SSL/TLS handshake failed, so | - |
304 | the connection was closed (only used in QSslSocket) | - |
305 | \value UnfinishedSocketOperationError Used by QAbstractSocketEngine only, | - |
306 | The last operation attempted has not finished yet (still in progress in | - |
307 | the background). | - |
308 | \value ProxyConnectionRefusedError Could not contact the proxy server because | - |
309 | the connection to that server was denied | - |
310 | \value ProxyConnectionClosedError The connection to the proxy server was closed | - |
311 | unexpectedly (before the connection to the final peer was established) | - |
312 | \value ProxyConnectionTimeoutError The connection to the proxy server timed out | - |
313 | or the proxy server stopped responding in the authentication phase. | - |
314 | \value ProxyNotFoundError The proxy address set with setProxy() (or the application | - |
315 | proxy) was not found. | - |
316 | \value ProxyProtocolError The connection negotiation with the proxy server failed, | - |
317 | because the response from the proxy server could not be understood. | - |
318 | \value OperationError An operation was attempted while the socket was in a state that | - |
319 | did not permit it. | - |
320 | \value SslInternalError The SSL library being used reported an internal error. This is | - |
321 | probably the result of a bad installation or misconfiguration of the library. | - |
322 | \value SslInvalidUserDataError Invalid data (certificate, key, cypher, etc.) was | - |
323 | provided and its use resulted in an error in the SSL library. | - |
324 | \value TemporaryError A temporary error occurred (e.g., operation would block and socket | - |
325 | is non-blocking). | - |
326 | | - |
327 | \value UnknownSocketError An unidentified error occurred. | - |
328 | \sa QAbstractSocket::error() | - |
329 | */ | - |
330 | | - |
331 | /*! | - |
332 | \enum QAbstractSocket::SocketState | - |
333 | | - |
334 | This enum describes the different states in which a socket can be. | - |
335 | | - |
336 | \value UnconnectedState The socket is not connected. | - |
337 | \value HostLookupState The socket is performing a host name lookup. | - |
338 | \value ConnectingState The socket has started establishing a connection. | - |
339 | \value ConnectedState A connection is established. | - |
340 | \value BoundState The socket is bound to an address and port. | - |
341 | \value ClosingState The socket is about to close (data may still | - |
342 | be waiting to be written). | - |
343 | \value ListeningState For internal use only. | - |
344 | | - |
345 | \sa QAbstractSocket::state() | - |
346 | */ | - |
347 | | - |
348 | /*! | - |
349 | \enum QAbstractSocket::SocketOption | - |
350 | \since 4.6 | - |
351 | | - |
352 | This enum represents the options that can be set on a socket. If | - |
353 | desired, they can be set after having received the connected() | - |
354 | signal from the socket or after having received a new socket from | - |
355 | a QTcpServer. | - |
356 | | - |
357 | \value LowDelayOption Try to optimize the socket for low | - |
358 | latency. For a QTcpSocket this would set the TCP_NODELAY option | - |
359 | and disable Nagle's algorithm. Set this to 1 to enable. | - |
360 | | - |
361 | \value KeepAliveOption Set this to 1 to enable the SO_KEEPALIVE | - |
362 | socket option | - |
363 | | - |
364 | \value MulticastTtlOption Set this to an integer value to set | - |
365 | IP_MULTICAST_TTL (TTL for multicast datagrams) socket option. | - |
366 | | - |
367 | \value MulticastLoopbackOption Set this to 1 to enable the | - |
368 | IP_MULTICAST_LOOP (multicast loopback) socket option. | - |
369 | | - |
370 | \value TypeOfServiceOption This option is not supported on | - |
371 | Windows. This maps to the IP_TOS socket option. | - |
372 | | - |
373 | Possible values for the \e{TypeOfServiceOption} are: | - |
374 | | - |
375 | \table | - |
376 | \header \li Value \li Description | - |
377 | \row \li 224 \li Network control | - |
378 | \row \li 192 \li Internetwork control | - |
379 | \row \li 160 \li CRITIC/ECP | - |
380 | \row \li 128 \li Flash override | - |
381 | \row \li 96 \li Flash | - |
382 | \row \li 64 \li Immediate | - |
383 | \row \li 32 \li Priority | - |
384 | \row \li 0 \li Routine | - |
385 | \endtable | - |
386 | | - |
387 | \sa QAbstractSocket::setSocketOption(), QAbstractSocket::socketOption() | - |
388 | */ | - |
389 | | - |
390 | /*! \enum QAbstractSocket::BindFlag | - |
391 | \since 5.0 | - |
392 | | - |
393 | This enum describes the different flags you can pass to modify the | - |
394 | behavior of QAbstractSocket::bind(). | - |
395 | | - |
396 | \value ShareAddress Allow other services to bind to the same address | - |
397 | and port. This is useful when multiple processes share | - |
398 | the load of a single service by listening to the same address and port | - |
399 | (e.g., a web server with several pre-forked listeners can greatly | - |
400 | improve response time). However, because any service is allowed to | - |
401 | rebind, this option is subject to certain security considerations. | - |
402 | Note that by combining this option with ReuseAddressHint, you will | - |
403 | also allow your service to rebind an existing shared address. On | - |
404 | Unix, this is equivalent to the SO_REUSEADDR socket option. On Windows, | - |
405 | this option is ignored. | - |
406 | | - |
407 | \value DontShareAddress Bind the address and port exclusively, so that | - |
408 | no other services are allowed to rebind. By passing this option to | - |
409 | QAbstractSocket::bind(), you are guaranteed that on successs, your service | - |
410 | is the only one that listens to the address and port. No services are | - |
411 | allowed to rebind, even if they pass ReuseAddressHint. This option | - |
412 | provides more security than ShareAddress, but on certain operating | - |
413 | systems, it requires you to run the server with administrator privileges. | - |
414 | On Unix and Mac OS X, not sharing is the default behavior for binding | - |
415 | an address and port, so this option is ignored. On Windows, this | - |
416 | option uses the SO_EXCLUSIVEADDRUSE socket option. | - |
417 | | - |
418 | \value ReuseAddressHint Provides a hint to QAbstractSocket that it should try | - |
419 | to rebind the service even if the address and port are already bound by | - |
420 | another socket. On Windows, this is equivalent to the SO_REUSEADDR | - |
421 | socket option. On Unix, this option is ignored. | - |
422 | | - |
423 | \value DefaultForPlatform The default option for the current platform. | - |
424 | On Unix and Mac OS X, this is equivalent to (DontShareAddress | - |
425 | + ReuseAddressHint), and on Windows, its equivalent to ShareAddress. | - |
426 | */ | - |
427 | | - |
428 | /*! \enum QAbstractSocket::PauseMode | - |
429 | \since 5.0 | - |
430 | | - |
431 | This enum describes the behavior of when the socket should hold | - |
432 | back with continuing data transfer. | - |
433 | The only notification currently supported is QSslSocket::sslErrors(). | - |
434 | | - |
435 | \value PauseNever Do not pause data transfer on the socket. This is the | - |
436 | default and matches the behaviour of Qt 4. | - |
437 | \value PauseOnSslErrors Pause data transfer on the socket upon receiving an | - |
438 | SSL error notification. I.E. QSslSocket::sslErrors(). | - |
439 | */ | - |
440 | | - |
441 | #include "qabstractsocket.h" | - |
442 | #include "qabstractsocket_p.h" | - |
443 | | - |
444 | #include "private/qhostinfo_p.h" | - |
445 | #include "private/qnetworksession_p.h" | - |
446 | | - |
447 | #include <qabstracteventdispatcher.h> | - |
448 | #include <qhostaddress.h> | - |
449 | #include <qhostinfo.h> | - |
450 | #include <qmetaobject.h> | - |
451 | #include <qpointer.h> | - |
452 | #include <qtimer.h> | - |
453 | #include <qelapsedtimer.h> | - |
454 | #include <qscopedvaluerollback.h> | - |
455 | | - |
456 | #ifndef QT_NO_SSL | - |
457 | #include <QtNetwork/qsslsocket.h> | - |
458 | #endif | - |
459 | | - |
460 | #include <private/qthread_p.h> | - |
461 | | - |
462 | #ifdef QABSTRACTSOCKET_DEBUG | - |
463 | #include <qdebug.h> | - |
464 | #endif | - |
465 | | - |
466 | #include <time.h> | - |
467 | | - |
468 | #define Q_CHECK_SOCKETENGINE(returnValue) do { \ | - |
469 | if (!d->socketEngine) { \ | - |
470 | return returnValue; \ | - |
471 | } } while (0) | - |
472 | | - |
473 | #ifndef QABSTRACTSOCKET_BUFFERSIZE | - |
474 | #define QABSTRACTSOCKET_BUFFERSIZE 32768 | - |
475 | #endif | - |
476 | #define QT_CONNECT_TIMEOUT 30000 | - |
477 | #define QT_TRANSFER_TIMEOUT 120000 | - |
478 | | - |
479 | QT_BEGIN_NAMESPACE | - |
480 | | - |
481 | #if defined QABSTRACTSOCKET_DEBUG | - |
482 | QT_BEGIN_INCLUDE_NAMESPACE | - |
483 | #include <qstring.h> | - |
484 | #include <ctype.h> | - |
485 | QT_END_INCLUDE_NAMESPACE | - |
486 | | - |
487 | /* | - |
488 | Returns a human readable representation of the first \a len | - |
489 | characters in \a data. | - |
490 | */ | - |
491 | static QByteArray qt_prettyDebug(const char *data, int len, int maxLength) | - |
492 | { | - |
493 | if (!data) return "(null)"; | - |
494 | QByteArray out; | - |
495 | for (int i = 0; i < len; ++i) { | - |
496 | char c = data[i]; | - |
497 | if (isprint(int(uchar(c)))) { | - |
498 | out += c; | - |
499 | } else switch (c) { | - |
500 | case '\n': out += "\\n"; break; | - |
501 | case '\r': out += "\\r"; break; | - |
502 | case '\t': out += "\\t"; break; | - |
503 | default: | - |
504 | QString tmp; | - |
505 | tmp.sprintf("\\%o", c); | - |
506 | out += tmp.toLatin1(); | - |
507 | } | - |
508 | } | - |
509 | | - |
510 | if (len < maxLength) | - |
511 | out += "..."; | - |
512 | | - |
513 | return out; | - |
514 | } | - |
515 | #endif | - |
516 | | - |
517 | static bool isProxyError(QAbstractSocket::SocketError error) | - |
518 | { | - |
519 | switch (error) { | - |
520 | case QAbstractSocket::ProxyAuthenticationRequiredError: | - |
521 | case QAbstractSocket::ProxyConnectionRefusedError: | - |
522 | case QAbstractSocket::ProxyConnectionClosedError: | - |
523 | case QAbstractSocket::ProxyConnectionTimeoutError: | - |
524 | case QAbstractSocket::ProxyNotFoundError: | - |
525 | case QAbstractSocket::ProxyProtocolError: | - |
526 | return true; executed: return true; Execution Count:5 | 5 |
527 | default: | - |
528 | return false; executed: return false; Execution Count:10 | 10 |
529 | } | - |
530 | } | 0 |
531 | | - |
532 | /*! \internal | - |
533 | | - |
534 | Constructs a QAbstractSocketPrivate. Initializes all members. | - |
535 | */ | - |
536 | QAbstractSocketPrivate::QAbstractSocketPrivate() | - |
537 | : readSocketNotifierCalled(false), | - |
538 | readSocketNotifierState(false), | - |
539 | readSocketNotifierStateSet(false), | - |
540 | emittedReadyRead(false), | - |
541 | emittedBytesWritten(false), | - |
542 | abortCalled(false), | - |
543 | closeCalled(false), | - |
544 | pendingClose(false), | - |
545 | pauseMode(QAbstractSocket::PauseNever), | - |
546 | port(0), | - |
547 | localPort(0), | - |
548 | peerPort(0), | - |
549 | socketEngine(0), | - |
550 | cachedSocketDescriptor(-1), | - |
551 | readBufferMaxSize(0), | - |
552 | writeBuffer(QABSTRACTSOCKET_BUFFERSIZE), | - |
553 | isBuffered(false), | - |
554 | blockingTimeout(30000), | - |
555 | connectTimer(0), | - |
556 | disconnectTimer(0), | - |
557 | connectTimeElapsed(0), | - |
558 | hostLookupId(-1), | - |
559 | socketType(QAbstractSocket::UnknownSocketType), | - |
560 | state(QAbstractSocket::UnconnectedState), | - |
561 | socketError(QAbstractSocket::UnknownSocketError), | - |
562 | preferredNetworkLayerProtocol(QAbstractSocket::UnknownNetworkLayerProtocol) | - |
563 | { | - |
564 | } executed: } Execution Count:3146 | 3146 |
565 | | - |
566 | /*! \internal | - |
567 | | - |
568 | Destructs the QAbstractSocket. If the socket layer is open, it | - |
569 | will be reset. | - |
570 | */ | - |
571 | QAbstractSocketPrivate::~QAbstractSocketPrivate() | - |
572 | { | - |
573 | } | - |
574 | | - |
575 | /*! \internal | - |
576 | | - |
577 | Resets the socket layer, clears the read and write buffers and | - |
578 | deletes any socket notifiers. | - |
579 | */ | - |
580 | void QAbstractSocketPrivate::resetSocketLayer() | - |
581 | { | - |
582 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
583 | qDebug("QAbstractSocketPrivate::resetSocketLayer()"); | - |
584 | #endif | - |
585 | | - |
586 | if (socketEngine) { evaluated: socketEngine yes Evaluation Count:3040 | yes Evaluation Count:3387 |
| 3040-3387 |
587 | socketEngine->close(); executed (the execution status of this line is deduced): socketEngine->close(); | - |
588 | socketEngine->disconnect(); executed (the execution status of this line is deduced): socketEngine->disconnect(); | - |
589 | delete socketEngine; executed (the execution status of this line is deduced): delete socketEngine; | - |
590 | socketEngine = 0; executed (the execution status of this line is deduced): socketEngine = 0; | - |
591 | cachedSocketDescriptor = -1; executed (the execution status of this line is deduced): cachedSocketDescriptor = -1; | - |
592 | } executed: } Execution Count:3040 | 3040 |
593 | if (connectTimer) evaluated: connectTimer yes Evaluation Count:1250 | yes Evaluation Count:5177 |
| 1250-5177 |
594 | connectTimer->stop(); executed: connectTimer->stop(); Execution Count:1250 | 1250 |
595 | if (disconnectTimer) partially evaluated: disconnectTimer no Evaluation Count:0 | yes Evaluation Count:6427 |
| 0-6427 |
596 | disconnectTimer->stop(); never executed: disconnectTimer->stop(); | 0 |
597 | } executed: } Execution Count:6427 | 6427 |
598 | | - |
599 | /*! \internal | - |
600 | | - |
601 | Initializes the socket layer to by of type \a type, using the | - |
602 | network layer protocol \a protocol. Resets the socket layer first | - |
603 | if it's already initialized. Sets up the socket notifiers. | - |
604 | */ | - |
605 | bool QAbstractSocketPrivate::initSocketLayer(QAbstractSocket::NetworkLayerProtocol protocol) | - |
606 | { | - |
607 | #ifdef QT_NO_NETWORKPROXY | - |
608 | // this is here to avoid a duplication of the call to createSocketEngine below | - |
609 | static const QNetworkProxy &proxyInUse = *(QNetworkProxy *)0; | - |
610 | #endif | - |
611 | | - |
612 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
613 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
614 | QString typeStr; | - |
615 | if (q->socketType() == QAbstractSocket::TcpSocket) typeStr = QLatin1String("TcpSocket"); | - |
616 | else if (q->socketType() == QAbstractSocket::UdpSocket) typeStr = QLatin1String("UdpSocket"); | - |
617 | else typeStr = QLatin1String("UnknownSocketType"); | - |
618 | QString protocolStr; | - |
619 | if (protocol == QAbstractSocket::IPv4Protocol) protocolStr = QLatin1String("IPv4Protocol"); | - |
620 | else if (protocol == QAbstractSocket::IPv6Protocol) protocolStr = QLatin1String("IPv6Protocol"); | - |
621 | else protocolStr = QLatin1String("UnknownNetworkLayerProtocol"); | - |
622 | #endif | - |
623 | | - |
624 | resetSocketLayer(); executed (the execution status of this line is deduced): resetSocketLayer(); | - |
625 | socketEngine = QAbstractSocketEngine::createSocketEngine(q->socketType(), proxyInUse, q); executed (the execution status of this line is deduced): socketEngine = QAbstractSocketEngine::createSocketEngine(q->socketType(), proxyInUse, q); | - |
626 | if (!socketEngine) { partially evaluated: !socketEngine no Evaluation Count:0 | yes Evaluation Count:2464 |
| 0-2464 |
627 | socketError = QAbstractSocket::UnsupportedSocketOperationError; never executed (the execution status of this line is deduced): socketError = QAbstractSocket::UnsupportedSocketOperationError; | - |
628 | q->setErrorString(QAbstractSocket::tr("Operation on socket is not supported")); never executed (the execution status of this line is deduced): q->setErrorString(QAbstractSocket::tr("Operation on socket is not supported")); | - |
629 | return false; never executed: return false; | 0 |
630 | } | - |
631 | #ifndef QT_NO_BEARERMANAGEMENT | - |
632 | //copy network session down to the socket engine (if it has been set) | - |
633 | socketEngine->setProperty("_q_networksession", q->property("_q_networksession")); executed (the execution status of this line is deduced): socketEngine->setProperty("_q_networksession", q->property("_q_networksession")); | - |
634 | #endif | - |
635 | if (!socketEngine->initialize(q->socketType(), protocol)) { partially evaluated: !socketEngine->initialize(q->socketType(), protocol) no Evaluation Count:0 | yes Evaluation Count:2464 |
| 0-2464 |
636 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
637 | qDebug("QAbstractSocketPrivate::initSocketLayer(%s, %s) failed (%s)", | - |
638 | typeStr.toLatin1().constData(), protocolStr.toLatin1().constData(), | - |
639 | socketEngine->errorString().toLatin1().constData()); | - |
640 | #endif | - |
641 | socketError = socketEngine->error(); never executed (the execution status of this line is deduced): socketError = socketEngine->error(); | - |
642 | q->setErrorString(socketEngine->errorString()); never executed (the execution status of this line is deduced): q->setErrorString(socketEngine->errorString()); | - |
643 | return false; never executed: return false; | 0 |
644 | } | - |
645 | | - |
646 | if (threadData->eventDispatcher) partially evaluated: threadData->eventDispatcher yes Evaluation Count:2464 | no Evaluation Count:0 |
| 0-2464 |
647 | socketEngine->setReceiver(this); executed: socketEngine->setReceiver(this); Execution Count:2464 | 2464 |
648 | | - |
649 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
650 | qDebug("QAbstractSocketPrivate::initSocketLayer(%s, %s) success", | - |
651 | typeStr.toLatin1().constData(), protocolStr.toLatin1().constData()); | - |
652 | #endif | - |
653 | return true; executed: return true; Execution Count:2464 | 2464 |
654 | } | - |
655 | | - |
656 | /*! \internal | - |
657 | | - |
658 | Slot connected to the read socket notifier. This slot is called | - |
659 | when new data is available for reading, or when the socket has | - |
660 | been closed. Handles recursive calls. | - |
661 | */ | - |
662 | bool QAbstractSocketPrivate::canReadNotification() | - |
663 | { | - |
664 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
665 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
666 | qDebug("QAbstractSocketPrivate::canReadNotification()"); | - |
667 | #endif | - |
668 | | - |
669 | // Prevent recursive calls | - |
670 | if (readSocketNotifierCalled) { partially evaluated: readSocketNotifierCalled no Evaluation Count:0 | yes Evaluation Count:22784 |
| 0-22784 |
671 | if (!readSocketNotifierStateSet) { never evaluated: !readSocketNotifierStateSet | 0 |
672 | readSocketNotifierStateSet = true; never executed (the execution status of this line is deduced): readSocketNotifierStateSet = true; | - |
673 | readSocketNotifierState = socketEngine->isReadNotificationEnabled(); never executed (the execution status of this line is deduced): readSocketNotifierState = socketEngine->isReadNotificationEnabled(); | - |
674 | socketEngine->setReadNotificationEnabled(false); never executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(false); | - |
675 | } | 0 |
676 | } | 0 |
677 | QScopedValueRollback<bool> rsncrollback(readSocketNotifierCalled); executed (the execution status of this line is deduced): QScopedValueRollback<bool> rsncrollback(readSocketNotifierCalled); | - |
678 | readSocketNotifierCalled = true; executed (the execution status of this line is deduced): readSocketNotifierCalled = true; | - |
679 | | - |
680 | if (!isBuffered) evaluated: !isBuffered yes Evaluation Count:6710 | yes Evaluation Count:16074 |
| 6710-16074 |
681 | socketEngine->setReadNotificationEnabled(false); executed: socketEngine->setReadNotificationEnabled(false); Execution Count:6710 | 6710 |
682 | | - |
683 | // If buffered, read data from the socket into the read buffer | - |
684 | qint64 newBytes = 0; executed (the execution status of this line is deduced): qint64 newBytes = 0; | - |
685 | if (isBuffered) { evaluated: isBuffered yes Evaluation Count:16074 | yes Evaluation Count:6710 |
| 6710-16074 |
686 | // Return if there is no space in the buffer | - |
687 | if (readBufferMaxSize && buffer.size() >= readBufferMaxSize) { evaluated: readBufferMaxSize yes Evaluation Count:1174 | yes Evaluation Count:14900 |
partially evaluated: buffer.size() >= readBufferMaxSize no Evaluation Count:0 | yes Evaluation Count:1174 |
| 0-14900 |
688 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
689 | qDebug("QAbstractSocketPrivate::canReadNotification() buffer is full"); | - |
690 | #endif | - |
691 | return false; never executed: return false; | 0 |
692 | } | - |
693 | | - |
694 | // If reading from the socket fails after getting a read | - |
695 | // notification, close the socket. | - |
696 | newBytes = buffer.size(); executed (the execution status of this line is deduced): newBytes = buffer.size(); | - |
697 | if (!readFromSocket()) { evaluated: !readFromSocket() yes Evaluation Count:205 | yes Evaluation Count:15869 |
| 205-15869 |
698 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
699 | qDebug("QAbstractSocketPrivate::canReadNotification() disconnecting socket"); | - |
700 | #endif | - |
701 | q->disconnectFromHost(); executed (the execution status of this line is deduced): q->disconnectFromHost(); | - |
702 | return false; executed: return false; Execution Count:205 | 205 |
703 | } | - |
704 | newBytes = buffer.size() - newBytes; executed (the execution status of this line is deduced): newBytes = buffer.size() - newBytes; | - |
705 | | - |
706 | // If read buffer is full, disable the read socket notifier. | - |
707 | if (readBufferMaxSize && buffer.size() == readBufferMaxSize) { evaluated: readBufferMaxSize yes Evaluation Count:1167 | yes Evaluation Count:14702 |
evaluated: buffer.size() == readBufferMaxSize yes Evaluation Count:37 | yes Evaluation Count:1130 |
| 37-14702 |
708 | socketEngine->setReadNotificationEnabled(false); executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(false); | - |
709 | } executed: } Execution Count:37 | 37 |
710 | } executed: } Execution Count:15869 | 15869 |
711 | | - |
712 | // only emit readyRead() when not recursing, and only if there is data available | - |
713 | bool hasData = newBytes > 0 evaluated: newBytes > 0 yes Evaluation Count:15869 | yes Evaluation Count:6710 |
| 6710-15869 |
714 | #ifndef QT_NO_UDPSOCKET executed (the execution status of this line is deduced):
| - |
715 | || (!isBuffered && socketType != QAbstractSocket::TcpSocket && socketEngine && socketEngine->hasPendingDatagrams()) partially evaluated: !isBuffered yes Evaluation Count:6710 | no Evaluation Count:0 |
evaluated: socketType != QAbstractSocket::TcpSocket yes Evaluation Count:710 | yes Evaluation Count:6000 |
partially evaluated: socketEngine yes Evaluation Count:710 | no Evaluation Count:0 |
evaluated: socketEngine->hasPendingDatagrams() yes Evaluation Count:690 | yes Evaluation Count:20 |
| 0-6710 |
716 | #endif executed (the execution status of this line is deduced):
| - |
717 | || (!isBuffered && socketType == QAbstractSocket::TcpSocket && socketEngine) partially evaluated: !isBuffered yes Evaluation Count:6020 | no Evaluation Count:0 |
evaluated: socketType == QAbstractSocket::TcpSocket yes Evaluation Count:6000 | yes Evaluation Count:20 |
partially evaluated: socketEngine yes Evaluation Count:6000 | no Evaluation Count:0 |
| 0-6020 |
718 | ; executed (the execution status of this line is deduced): ; | - |
719 | | - |
720 | if (!emittedReadyRead && hasData) { partially evaluated: !emittedReadyRead yes Evaluation Count:22579 | no Evaluation Count:0 |
evaluated: hasData yes Evaluation Count:22559 | yes Evaluation Count:20 |
| 0-22579 |
721 | QScopedValueRollback<bool> r(emittedReadyRead); executed (the execution status of this line is deduced): QScopedValueRollback<bool> r(emittedReadyRead); | - |
722 | emittedReadyRead = true; executed (the execution status of this line is deduced): emittedReadyRead = true; | - |
723 | emit q->readyRead(); executed (the execution status of this line is deduced): q->readyRead(); | - |
724 | } executed: } Execution Count:22559 | 22559 |
725 | | - |
726 | // If we were closed as a result of the readyRead() signal, | - |
727 | // return. | - |
728 | if (state == QAbstractSocket::UnconnectedState || state == QAbstractSocket::ClosingState) { evaluated: state == QAbstractSocket::UnconnectedState yes Evaluation Count:347 | yes Evaluation Count:22232 |
evaluated: state == QAbstractSocket::ClosingState yes Evaluation Count:1 | yes Evaluation Count:22231 |
| 1-22232 |
729 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
730 | qDebug("QAbstractSocketPrivate::canReadNotification() socket is closing - returning"); | - |
731 | #endif | - |
732 | return true; executed: return true; Execution Count:348 | 348 |
733 | } | - |
734 | | - |
735 | if (!hasData && socketEngine) evaluated: !hasData yes Evaluation Count:20 | yes Evaluation Count:22211 |
partially evaluated: socketEngine yes Evaluation Count:20 | no Evaluation Count:0 |
| 0-22211 |
736 | socketEngine->setReadNotificationEnabled(true); executed: socketEngine->setReadNotificationEnabled(true); Execution Count:20 | 20 |
737 | | - |
738 | // reset the read socket notifier state if we reentered inside the | - |
739 | // readyRead() connected slot. | - |
740 | if (readSocketNotifierStateSet && socketEngine && partially evaluated: readSocketNotifierStateSet no Evaluation Count:0 | yes Evaluation Count:22231 |
never evaluated: socketEngine | 0-22231 |
741 | readSocketNotifierState != socketEngine->isReadNotificationEnabled()) { never evaluated: readSocketNotifierState != socketEngine->isReadNotificationEnabled() | 0 |
742 | socketEngine->setReadNotificationEnabled(readSocketNotifierState); never executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(readSocketNotifierState); | - |
743 | readSocketNotifierStateSet = false; never executed (the execution status of this line is deduced): readSocketNotifierStateSet = false; | - |
744 | } | 0 |
745 | return true; executed: return true; Execution Count:22231 | 22231 |
746 | } | - |
747 | | - |
748 | /*! \internal | - |
749 | | - |
750 | Slot connected to the close socket notifier. It's called when the | - |
751 | socket is closed. | - |
752 | */ | - |
753 | void QAbstractSocketPrivate::canCloseNotification() | - |
754 | { | - |
755 | Q_Q(QAbstractSocket); never executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
756 | | - |
757 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
758 | qDebug("QAbstractSocketPrivate::canCloseNotification()"); | - |
759 | #endif | - |
760 | | - |
761 | qint64 newBytes = 0; never executed (the execution status of this line is deduced): qint64 newBytes = 0; | - |
762 | if (isBuffered) { never evaluated: isBuffered | 0 |
763 | // Try to read to the buffer, if the read fail we can close the socket. | - |
764 | newBytes = buffer.size(); never executed (the execution status of this line is deduced): newBytes = buffer.size(); | - |
765 | if (!readFromSocket()) { never evaluated: !readFromSocket() | 0 |
766 | q->disconnectFromHost(); never executed (the execution status of this line is deduced): q->disconnectFromHost(); | - |
767 | return; | 0 |
768 | } | - |
769 | newBytes = buffer.size() - newBytes; never executed (the execution status of this line is deduced): newBytes = buffer.size() - newBytes; | - |
770 | if (newBytes) { never evaluated: newBytes | 0 |
771 | // If there was still some data to be read from the socket | - |
772 | // then we could get another FD_READ. The disconnect will | - |
773 | // then occur when we read from the socket again and fail | - |
774 | // in canReadNotification or by the manually created | - |
775 | // closeNotification below. | - |
776 | emit q->readyRead(); never executed (the execution status of this line is deduced): q->readyRead(); | - |
777 | | - |
778 | QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection); never executed (the execution status of this line is deduced): QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection); | - |
779 | } | 0 |
780 | } else if (socketType == QAbstractSocket::TcpSocket && socketEngine) { never executed: } never evaluated: socketType == QAbstractSocket::TcpSocket never evaluated: socketEngine | 0 |
781 | emit q->readyRead(); never executed (the execution status of this line is deduced): q->readyRead(); | - |
782 | } | 0 |
783 | } | - |
784 | | - |
785 | | - |
786 | /*! \internal | - |
787 | | - |
788 | Slot connected to the write socket notifier. It's called during a | - |
789 | delayed connect or when the socket is ready for writing. | - |
790 | */ | - |
791 | bool QAbstractSocketPrivate::canWriteNotification() | - |
792 | { | - |
793 | #if defined (Q_OS_WIN) | - |
794 | if (socketEngine && socketEngine->isWriteNotificationEnabled()) | - |
795 | socketEngine->setWriteNotificationEnabled(false); | - |
796 | #endif | - |
797 | | - |
798 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
799 | qDebug("QAbstractSocketPrivate::canWriteNotification() flushing"); | - |
800 | #endif | - |
801 | int tmp = writeBuffer.size(); executed (the execution status of this line is deduced): int tmp = writeBuffer.size(); | - |
802 | flush(); executed (the execution status of this line is deduced): flush(); | - |
803 | | - |
804 | if (socketEngine) { evaluated: socketEngine yes Evaluation Count:12359 | yes Evaluation Count:230 |
| 230-12359 |
805 | #if defined (Q_OS_WIN) | - |
806 | if (!writeBuffer.isEmpty()) | - |
807 | socketEngine->setWriteNotificationEnabled(true); | - |
808 | #else | - |
809 | if (writeBuffer.isEmpty() && socketEngine->bytesToWrite() == 0) evaluated: writeBuffer.isEmpty() yes Evaluation Count:6944 | yes Evaluation Count:5415 |
evaluated: socketEngine->bytesToWrite() == 0 yes Evaluation Count:6888 | yes Evaluation Count:56 |
| 56-6944 |
810 | socketEngine->setWriteNotificationEnabled(false); executed: socketEngine->setWriteNotificationEnabled(false); Execution Count:6888 | 6888 |
811 | #endif | - |
812 | } executed: } Execution Count:12359 | 12359 |
813 | | - |
814 | return (writeBuffer.size() < tmp); executed: return (writeBuffer.size() < tmp); Execution Count:12589 | 12589 |
815 | } | - |
816 | | - |
817 | /*! \internal | - |
818 | | - |
819 | Slot connected to a notification of connection status | - |
820 | change. Either we finished connecting or we failed to connect. | - |
821 | */ | - |
822 | void QAbstractSocketPrivate::connectionNotification() | - |
823 | { | - |
824 | // If in connecting state, check if the connection has been | - |
825 | // established, otherwise flush pending data. | - |
826 | if (state == QAbstractSocket::ConnectingState) { partially evaluated: state == QAbstractSocket::ConnectingState yes Evaluation Count:839 | no Evaluation Count:0 |
| 0-839 |
827 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
828 | qDebug("QAbstractSocketPrivate::connectionNotification() testing connection"); | - |
829 | #endif | - |
830 | _q_testConnection(); executed (the execution status of this line is deduced): _q_testConnection(); | - |
831 | } executed: } Execution Count:839 | 839 |
832 | } executed: } Execution Count:839 | 839 |
833 | | - |
834 | /*! \internal | - |
835 | | - |
836 | Writes pending data in the write buffers to the socket. The | - |
837 | function writes as much as it can without blocking. | - |
838 | | - |
839 | It is usually invoked by canWriteNotification after one or more | - |
840 | calls to write(). | - |
841 | | - |
842 | Emits bytesWritten(). | - |
843 | */ | - |
844 | bool QAbstractSocketPrivate::flush() | - |
845 | { | - |
846 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
847 | if (!socketEngine || !socketEngine->isValid() || (writeBuffer.isEmpty() partially evaluated: !socketEngine no Evaluation Count:0 | yes Evaluation Count:24771 |
partially evaluated: !socketEngine->isValid() no Evaluation Count:0 | yes Evaluation Count:24771 |
evaluated: writeBuffer.isEmpty() yes Evaluation Count:710 | yes Evaluation Count:24061 |
| 0-24771 |
848 | && socketEngine->bytesToWrite() == 0)) { evaluated: socketEngine->bytesToWrite() == 0 yes Evaluation Count:693 | yes Evaluation Count:17 |
| 17-693 |
849 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
850 | qDebug("QAbstractSocketPrivate::flush() nothing to do: valid ? %s, writeBuffer.isEmpty() ? %s", | - |
851 | (socketEngine && socketEngine->isValid()) ? "yes" : "no", writeBuffer.isEmpty() ? "yes" : "no"); | - |
852 | #endif | - |
853 | | - |
854 | // this covers the case when the buffer was empty, but we had to wait for the socket engine to finish | - |
855 | if (state == QAbstractSocket::ClosingState) partially evaluated: state == QAbstractSocket::ClosingState no Evaluation Count:0 | yes Evaluation Count:693 |
| 0-693 |
856 | q->disconnectFromHost(); never executed: q->disconnectFromHost(); | 0 |
857 | | - |
858 | return false; executed: return false; Execution Count:693 | 693 |
859 | } | - |
860 | | - |
861 | int nextSize = writeBuffer.nextDataBlockSize(); executed (the execution status of this line is deduced): int nextSize = writeBuffer.nextDataBlockSize(); | - |
862 | const char *ptr = writeBuffer.readPointer(); executed (the execution status of this line is deduced): const char *ptr = writeBuffer.readPointer(); | - |
863 | | - |
864 | // Attempt to write it all in one chunk. | - |
865 | qint64 written = socketEngine->write(ptr, nextSize); executed (the execution status of this line is deduced): qint64 written = socketEngine->write(ptr, nextSize); | - |
866 | if (written < 0) { evaluated: written < 0 yes Evaluation Count:6 | yes Evaluation Count:24072 |
| 6-24072 |
867 | socketError = socketEngine->error(); executed (the execution status of this line is deduced): socketError = socketEngine->error(); | - |
868 | q->setErrorString(socketEngine->errorString()); executed (the execution status of this line is deduced): q->setErrorString(socketEngine->errorString()); | - |
869 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
870 | qDebug() << "QAbstractSocketPrivate::flush() write error, aborting." << socketEngine->errorString(); | - |
871 | #endif | - |
872 | emit q->error(socketError); executed (the execution status of this line is deduced): q->error(socketError); | - |
873 | // an unexpected error so close the socket. | - |
874 | q->abort(); executed (the execution status of this line is deduced): q->abort(); | - |
875 | return false; executed: return false; Execution Count:6 | 6 |
876 | } | - |
877 | | - |
878 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
879 | qDebug("QAbstractSocketPrivate::flush() %lld bytes written to the network", | - |
880 | written); | - |
881 | #endif | - |
882 | | - |
883 | // Remove what we wrote so far. | - |
884 | writeBuffer.free(written); executed (the execution status of this line is deduced): writeBuffer.free(written); | - |
885 | if (written > 0) { evaluated: written > 0 yes Evaluation Count:24046 | yes Evaluation Count:26 |
| 26-24046 |
886 | // Don't emit bytesWritten() recursively. | - |
887 | if (!emittedBytesWritten) { partially evaluated: !emittedBytesWritten yes Evaluation Count:24046 | no Evaluation Count:0 |
| 0-24046 |
888 | QScopedValueRollback<bool> r(emittedBytesWritten); executed (the execution status of this line is deduced): QScopedValueRollback<bool> r(emittedBytesWritten); | - |
889 | emittedBytesWritten = true; executed (the execution status of this line is deduced): emittedBytesWritten = true; | - |
890 | emit q->bytesWritten(written); executed (the execution status of this line is deduced): q->bytesWritten(written); | - |
891 | } executed: } Execution Count:24046 | 24046 |
892 | } executed: } Execution Count:24046 | 24046 |
893 | | - |
894 | if (writeBuffer.isEmpty() && socketEngine && socketEngine->isWriteNotificationEnabled() evaluated: writeBuffer.isEmpty() yes Evaluation Count:18627 | yes Evaluation Count:5445 |
evaluated: socketEngine yes Evaluation Count:18488 | yes Evaluation Count:139 |
partially evaluated: socketEngine->isWriteNotificationEnabled() yes Evaluation Count:18488 | no Evaluation Count:0 |
| 0-18627 |
895 | && !socketEngine->bytesToWrite()) evaluated: !socketEngine->bytesToWrite() yes Evaluation Count:18424 | yes Evaluation Count:64 |
| 64-18424 |
896 | socketEngine->setWriteNotificationEnabled(false); executed: socketEngine->setWriteNotificationEnabled(false); Execution Count:18424 | 18424 |
897 | if (state == QAbstractSocket::ClosingState) evaluated: state == QAbstractSocket::ClosingState yes Evaluation Count:142 | yes Evaluation Count:23930 |
| 142-23930 |
898 | q->disconnectFromHost(); executed: q->disconnectFromHost(); Execution Count:142 | 142 |
899 | | - |
900 | return true; executed: return true; Execution Count:24072 | 24072 |
901 | } | - |
902 | | - |
903 | #ifndef QT_NO_NETWORKPROXY | - |
904 | /*! \internal | - |
905 | | - |
906 | Resolve the proxy to its final value. | - |
907 | */ | - |
908 | void QAbstractSocketPrivate::resolveProxy(const QString &hostname, quint16 port) | - |
909 | { | - |
910 | QList<QNetworkProxy> proxies; executed (the execution status of this line is deduced): QList<QNetworkProxy> proxies; | - |
911 | | - |
912 | if (proxy.type() != QNetworkProxy::DefaultProxy) { evaluated: proxy.type() != QNetworkProxy::DefaultProxy yes Evaluation Count:946 | yes Evaluation Count:1634 |
| 946-1634 |
913 | // a non-default proxy was set with setProxy | - |
914 | proxies << proxy; executed (the execution status of this line is deduced): proxies << proxy; | - |
915 | } else { executed: } Execution Count:946 | 946 |
916 | // try the application settings instead | - |
917 | QNetworkProxyQuery query(hostname, port, QString(), executed (the execution status of this line is deduced): QNetworkProxyQuery query(hostname, port, QString(), | - |
918 | socketType == QAbstractSocket::TcpSocket ? executed (the execution status of this line is deduced): socketType == QAbstractSocket::TcpSocket ? | - |
919 | QNetworkProxyQuery::TcpSocket : executed (the execution status of this line is deduced): QNetworkProxyQuery::TcpSocket : | - |
920 | QNetworkProxyQuery::UdpSocket); executed (the execution status of this line is deduced): QNetworkProxyQuery::UdpSocket); | - |
921 | proxies = QNetworkProxyFactory::proxyForQuery(query); executed (the execution status of this line is deduced): proxies = QNetworkProxyFactory::proxyForQuery(query); | - |
922 | } executed: } Execution Count:1634 | 1634 |
923 | | - |
924 | // return the first that we can use | - |
925 | foreach (const QNetworkProxy &p, proxies) { executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(proxies)> _container_(proxies); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (const QNetworkProxy &p = *_container_.i;; __extension__ ({--_container_.brk; break;})) { | - |
926 | if (socketType == QAbstractSocket::UdpSocket && evaluated: socketType == QAbstractSocket::UdpSocket yes Evaluation Count:306 | yes Evaluation Count:2274 |
| 306-2274 |
927 | (p.capabilities() & QNetworkProxy::UdpTunnelingCapability) == 0) partially evaluated: (p.capabilities() & QNetworkProxy::UdpTunnelingCapability) == 0 no Evaluation Count:0 | yes Evaluation Count:306 |
| 0-306 |
928 | continue; never executed: continue; | 0 |
929 | | - |
930 | if (socketType == QAbstractSocket::TcpSocket && evaluated: socketType == QAbstractSocket::TcpSocket yes Evaluation Count:2274 | yes Evaluation Count:306 |
| 306-2274 |
931 | (p.capabilities() & QNetworkProxy::TunnelingCapability) == 0) partially evaluated: (p.capabilities() & QNetworkProxy::TunnelingCapability) == 0 no Evaluation Count:0 | yes Evaluation Count:2274 |
| 0-2274 |
932 | continue; never executed: continue; | 0 |
933 | | - |
934 | proxyInUse = p; executed (the execution status of this line is deduced): proxyInUse = p; | - |
935 | return; executed: return; Execution Count:2580 | 2580 |
936 | } | - |
937 | | - |
938 | // no proxy found | - |
939 | // DefaultProxy here will raise an error | - |
940 | proxyInUse = QNetworkProxy(); never executed (the execution status of this line is deduced): proxyInUse = QNetworkProxy(); | - |
941 | } | 0 |
942 | | - |
943 | /*! | - |
944 | \internal | - |
945 | | - |
946 | Starts the connection to \a host, like _q_startConnecting below, | - |
947 | but without hostname resolution. | - |
948 | */ | - |
949 | void QAbstractSocketPrivate::startConnectingByName(const QString &host) | - |
950 | { | - |
951 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
952 | if (state == QAbstractSocket::ConnectingState || state == QAbstractSocket::ConnectedState) partially evaluated: state == QAbstractSocket::ConnectingState no Evaluation Count:0 | yes Evaluation Count:59 |
partially evaluated: state == QAbstractSocket::ConnectedState no Evaluation Count:0 | yes Evaluation Count:59 |
| 0-59 |
953 | return; | 0 |
954 | | - |
955 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
956 | qDebug("QAbstractSocketPrivate::startConnectingByName(host == %s)", qPrintable(host)); | - |
957 | #endif | - |
958 | | - |
959 | // ### Let the socket engine drive this? | - |
960 | state = QAbstractSocket::ConnectingState; executed (the execution status of this line is deduced): state = QAbstractSocket::ConnectingState; | - |
961 | emit q->stateChanged(state); executed (the execution status of this line is deduced): q->stateChanged(state); | - |
962 | | - |
963 | connectTimeElapsed = 0; executed (the execution status of this line is deduced): connectTimeElapsed = 0; | - |
964 | | - |
965 | if (initSocketLayer(QAbstractSocket::UnknownNetworkLayerProtocol)) { partially evaluated: initSocketLayer(QAbstractSocket::UnknownNetworkLayerProtocol) yes Evaluation Count:59 | no Evaluation Count:0 |
| 0-59 |
966 | if (socketEngine->connectToHostByName(host, port) || partially evaluated: socketEngine->connectToHostByName(host, port) no Evaluation Count:0 | yes Evaluation Count:59 |
| 0-59 |
967 | socketEngine->state() == QAbstractSocket::ConnectingState) { partially evaluated: socketEngine->state() == QAbstractSocket::ConnectingState yes Evaluation Count:59 | no Evaluation Count:0 |
| 0-59 |
968 | cachedSocketDescriptor = socketEngine->socketDescriptor(); executed (the execution status of this line is deduced): cachedSocketDescriptor = socketEngine->socketDescriptor(); | - |
969 | | - |
970 | return; executed: return; Execution Count:59 | 59 |
971 | } | - |
972 | | - |
973 | // failed to connect | - |
974 | socketError = socketEngine->error(); never executed (the execution status of this line is deduced): socketError = socketEngine->error(); | - |
975 | q->setErrorString(socketEngine->errorString()); never executed (the execution status of this line is deduced): q->setErrorString(socketEngine->errorString()); | - |
976 | } | 0 |
977 | | - |
978 | state = QAbstractSocket::UnconnectedState; never executed (the execution status of this line is deduced): state = QAbstractSocket::UnconnectedState; | - |
979 | emit q->error(socketError); never executed (the execution status of this line is deduced): q->error(socketError); | - |
980 | emit q->stateChanged(state); never executed (the execution status of this line is deduced): q->stateChanged(state); | - |
981 | } | 0 |
982 | | - |
983 | #endif | - |
984 | | - |
985 | /*! \internal | - |
986 | | - |
987 | Slot connected to QHostInfo::lookupHost() in connectToHost(). This | - |
988 | function starts the process of connecting to any number of | - |
989 | candidate IP addresses for the host, if it was found. Calls | - |
990 | _q_connectToNextAddress(). | - |
991 | */ | - |
992 | void QAbstractSocketPrivate::_q_startConnecting(const QHostInfo &hostInfo) | - |
993 | { | - |
994 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
995 | addresses.clear(); executed (the execution status of this line is deduced): addresses.clear(); | - |
996 | if (state != QAbstractSocket::HostLookupState) partially evaluated: state != QAbstractSocket::HostLookupState no Evaluation Count:0 | yes Evaluation Count:2100 |
| 0-2100 |
997 | return; | 0 |
998 | | - |
999 | if (hostLookupId != -1 && hostLookupId != hostInfo.lookupId()) { evaluated: hostLookupId != -1 yes Evaluation Count:2 | yes Evaluation Count:2098 |
partially evaluated: hostLookupId != hostInfo.lookupId() no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2098 |
1000 | qWarning("QAbstractSocketPrivate::_q_startConnecting() received hostInfo for wrong lookup ID %d expected %d", hostInfo.lookupId(), hostLookupId); never executed (the execution status of this line is deduced): QMessageLogger("socket/qabstractsocket.cpp", 1000, __PRETTY_FUNCTION__).warning("QAbstractSocketPrivate::_q_startConnecting() received hostInfo for wrong lookup ID %d expected %d", hostInfo.lookupId(), hostLookupId); | - |
1001 | } | 0 |
1002 | | - |
1003 | // Only add the addresses for the preferred network layer. | - |
1004 | // Or all if preferred network layer is not set. | - |
1005 | if (preferredNetworkLayerProtocol == QAbstractSocket::UnknownNetworkLayerProtocol || preferredNetworkLayerProtocol == QAbstractSocket::AnyIPProtocol) { partially evaluated: preferredNetworkLayerProtocol == QAbstractSocket::UnknownNetworkLayerProtocol no Evaluation Count:0 | yes Evaluation Count:2100 |
evaluated: preferredNetworkLayerProtocol == QAbstractSocket::AnyIPProtocol yes Evaluation Count:1505 | yes Evaluation Count:595 |
| 0-2100 |
1006 | addresses = hostInfo.addresses(); executed (the execution status of this line is deduced): addresses = hostInfo.addresses(); | - |
1007 | } else { executed: } Execution Count:1505 | 1505 |
1008 | foreach (const QHostAddress &address, hostInfo.addresses()) executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(hostInfo.addresses())> _container_(hostInfo.addresses()); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (const QHostAddress &address = *_container_.i;; __extension__ ({--_container_.brk; break;})) | - |
1009 | if (address.protocol() == preferredNetworkLayerProtocol) evaluated: address.protocol() == preferredNetworkLayerProtocol yes Evaluation Count:595 | yes Evaluation Count:1 |
| 1-595 |
1010 | addresses += address; executed: addresses += address; Execution Count:595 | 595 |
1011 | } executed: } Execution Count:595 | 595 |
1012 | | - |
1013 | | - |
1014 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1015 | QString s = QLatin1String("{"); | - |
1016 | for (int i = 0; i < addresses.count(); ++i) { | - |
1017 | if (i != 0) s += QLatin1String(", "); | - |
1018 | s += addresses.at(i).toString(); | - |
1019 | } | - |
1020 | s += QLatin1Char('}'); | - |
1021 | qDebug("QAbstractSocketPrivate::_q_startConnecting(hostInfo == %s)", s.toLatin1().constData()); | - |
1022 | #endif | - |
1023 | | - |
1024 | // Try all addresses twice. | - |
1025 | addresses += addresses; executed (the execution status of this line is deduced): addresses += addresses; | - |
1026 | | - |
1027 | // If there are no addresses in the host list, report this to the | - |
1028 | // user. | - |
1029 | if (addresses.isEmpty()) { evaluated: addresses.isEmpty() yes Evaluation Count:3 | yes Evaluation Count:2097 |
| 3-2097 |
1030 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1031 | qDebug("QAbstractSocketPrivate::_q_startConnecting(), host not found"); | - |
1032 | #endif | - |
1033 | state = QAbstractSocket::UnconnectedState; executed (the execution status of this line is deduced): state = QAbstractSocket::UnconnectedState; | - |
1034 | socketError = QAbstractSocket::HostNotFoundError; executed (the execution status of this line is deduced): socketError = QAbstractSocket::HostNotFoundError; | - |
1035 | q->setErrorString(QAbstractSocket::tr("Host not found")); executed (the execution status of this line is deduced): q->setErrorString(QAbstractSocket::tr("Host not found")); | - |
1036 | emit q->stateChanged(state); executed (the execution status of this line is deduced): q->stateChanged(state); | - |
1037 | emit q->error(QAbstractSocket::HostNotFoundError); executed (the execution status of this line is deduced): q->error(QAbstractSocket::HostNotFoundError); | - |
1038 | return; executed: return; Execution Count:3 | 3 |
1039 | } | - |
1040 | | - |
1041 | // Enter Connecting state (see also sn_write, which is called by | - |
1042 | // the write socket notifier after connect()) | - |
1043 | state = QAbstractSocket::ConnectingState; executed (the execution status of this line is deduced): state = QAbstractSocket::ConnectingState; | - |
1044 | emit q->stateChanged(state); executed (the execution status of this line is deduced): q->stateChanged(state); | - |
1045 | | - |
1046 | // Report the successful host lookup | - |
1047 | emit q->hostFound(); executed (the execution status of this line is deduced): q->hostFound(); | - |
1048 | | - |
1049 | // Reset the total time spent connecting. | - |
1050 | connectTimeElapsed = 0; executed (the execution status of this line is deduced): connectTimeElapsed = 0; | - |
1051 | | - |
1052 | // The addresses returned by the lookup will be tested one after | - |
1053 | // another by _q_connectToNextAddress(). | - |
1054 | _q_connectToNextAddress(); executed (the execution status of this line is deduced): _q_connectToNextAddress(); | - |
1055 | } executed: } Execution Count:2097 | 2097 |
1056 | | - |
1057 | /*! \internal | - |
1058 | | - |
1059 | Called by a queued or direct connection from _q_startConnecting() or | - |
1060 | _q_testConnection(), this function takes the first address of the | - |
1061 | pending addresses list and tries to connect to it. If the | - |
1062 | connection succeeds, QAbstractSocket will emit | - |
1063 | connected(). Otherwise, error(ConnectionRefusedError) or | - |
1064 | error(SocketTimeoutError) is emitted. | - |
1065 | */ | - |
1066 | void QAbstractSocketPrivate::_q_connectToNextAddress() | - |
1067 | { | - |
1068 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
1069 | do { | - |
1070 | // Check for more pending addresses | - |
1071 | if (addresses.isEmpty()) { evaluated: addresses.isEmpty() yes Evaluation Count:12 | yes Evaluation Count:2102 |
| 12-2102 |
1072 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1073 | qDebug("QAbstractSocketPrivate::_q_connectToNextAddress(), all addresses failed."); | - |
1074 | #endif | - |
1075 | state = QAbstractSocket::UnconnectedState; executed (the execution status of this line is deduced): state = QAbstractSocket::UnconnectedState; | - |
1076 | if (socketEngine) { partially evaluated: socketEngine yes Evaluation Count:12 | no Evaluation Count:0 |
| 0-12 |
1077 | if ((socketEngine->error() == QAbstractSocket::UnknownSocketError partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1078 | #ifdef Q_OS_AIX partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1079 | // On AIX, the second connect call will result in EINVAL and not partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1080 | // ECONNECTIONREFUSED; although the meaning is the same. partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1081 | || socketEngine->error() == QAbstractSocket::UnsupportedSocketOperationError partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1082 | #endif partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
1083 | ) && socketEngine->state() == QAbstractSocket::ConnectingState) { partially evaluated: (socketEngine->error() == QAbstractSocket::UnknownSocketError ) no Evaluation Count:0 | yes Evaluation Count:12 |
never evaluated: socketEngine->state() == QAbstractSocket::ConnectingState | 0-12 |
1084 | socketError = QAbstractSocket::ConnectionRefusedError; never executed (the execution status of this line is deduced): socketError = QAbstractSocket::ConnectionRefusedError; | - |
1085 | q->setErrorString(QAbstractSocket::tr("Connection refused")); never executed (the execution status of this line is deduced): q->setErrorString(QAbstractSocket::tr("Connection refused")); | - |
1086 | } else { | 0 |
1087 | socketError = socketEngine->error(); executed (the execution status of this line is deduced): socketError = socketEngine->error(); | - |
1088 | q->setErrorString(socketEngine->errorString()); executed (the execution status of this line is deduced): q->setErrorString(socketEngine->errorString()); | - |
1089 | } executed: } Execution Count:12 | 12 |
1090 | } else { | - |
1091 | // socketError = QAbstractSocket::ConnectionRefusedError; | - |
1092 | // q->setErrorString(QAbstractSocket::tr("Connection refused")); | - |
1093 | } | 0 |
1094 | emit q->stateChanged(state); executed (the execution status of this line is deduced): q->stateChanged(state); | - |
1095 | emit q->error(socketError); executed (the execution status of this line is deduced): q->error(socketError); | - |
1096 | return; executed: return; Execution Count:12 | 12 |
1097 | } | - |
1098 | | - |
1099 | // Pick the first host address candidate | - |
1100 | host = addresses.takeFirst(); executed (the execution status of this line is deduced): host = addresses.takeFirst(); | - |
1101 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1102 | qDebug("QAbstractSocketPrivate::_q_connectToNextAddress(), connecting to %s:%i, %d left to try", | - |
1103 | host.toString().toLatin1().constData(), port, addresses.count()); | - |
1104 | #endif | - |
1105 | | - |
1106 | if (!initSocketLayer(host.protocol())) { partially evaluated: !initSocketLayer(host.protocol()) no Evaluation Count:0 | yes Evaluation Count:2102 |
| 0-2102 |
1107 | // hope that the next address is better | - |
1108 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1109 | qDebug("QAbstractSocketPrivate::_q_connectToNextAddress(), failed to initialize sock layer"); | - |
1110 | #endif | - |
1111 | continue; never executed: continue; | 0 |
1112 | } | - |
1113 | | - |
1114 | // Tries to connect to the address. If it succeeds immediately | - |
1115 | // (localhost address on BSD or any UDP connect), emit | - |
1116 | // connected() and return. | - |
1117 | if (socketEngine->connectToHost(host, port)) { evaluated: socketEngine->connectToHost(host, port) yes Evaluation Count:6 | yes Evaluation Count:2096 |
| 6-2096 |
1118 | //_q_testConnection(); | - |
1119 | fetchConnectionParameters(); executed (the execution status of this line is deduced): fetchConnectionParameters(); | - |
1120 | return; executed: return; Execution Count:6 | 6 |
1121 | } | - |
1122 | | - |
1123 | // cache the socket descriptor even if we're not fully connected yet | - |
1124 | cachedSocketDescriptor = socketEngine->socketDescriptor(); executed (the execution status of this line is deduced): cachedSocketDescriptor = socketEngine->socketDescriptor(); | - |
1125 | | - |
1126 | // Check that we're in delayed connection state. If not, try | - |
1127 | // the next address | - |
1128 | if (socketEngine->state() != QAbstractSocket::ConnectingState) { evaluated: socketEngine->state() != QAbstractSocket::ConnectingState yes Evaluation Count:2 | yes Evaluation Count:2094 |
| 2-2094 |
1129 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1130 | qDebug("QAbstractSocketPrivate::_q_connectToNextAddress(), connection failed (%s)", | - |
1131 | socketEngine->errorString().toLatin1().constData()); | - |
1132 | #endif | - |
1133 | continue; executed: continue; Execution Count:2 | 2 |
1134 | } | - |
1135 | | - |
1136 | // Start the connect timer. | - |
1137 | if (threadData->eventDispatcher) { partially evaluated: threadData->eventDispatcher yes Evaluation Count:2094 | no Evaluation Count:0 |
| 0-2094 |
1138 | if (!connectTimer) { evaluated: !connectTimer yes Evaluation Count:1956 | yes Evaluation Count:138 |
| 138-1956 |
1139 | connectTimer = new QTimer(q); executed (the execution status of this line is deduced): connectTimer = new QTimer(q); | - |
1140 | QObject::connect(connectTimer, SIGNAL(timeout()), executed (the execution status of this line is deduced): QObject::connect(connectTimer, "2""timeout()", | - |
1141 | q, SLOT(_q_abortConnectionAttempt()), executed (the execution status of this line is deduced): q, "1""_q_abortConnectionAttempt()", | - |
1142 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
1143 | } executed: } Execution Count:1956 | 1956 |
1144 | connectTimer->start(QT_CONNECT_TIMEOUT); executed (the execution status of this line is deduced): connectTimer->start(30000); | - |
1145 | } executed: } Execution Count:2094 | 2094 |
1146 | | - |
1147 | // Wait for a write notification that will eventually call | - |
1148 | // _q_testConnection(). | - |
1149 | socketEngine->setWriteNotificationEnabled(true); executed (the execution status of this line is deduced): socketEngine->setWriteNotificationEnabled(true); | - |
1150 | break; executed: break; Execution Count:2094 | 2094 |
1151 | } while (state != QAbstractSocket::ConnectedState); partially evaluated: state != QAbstractSocket::ConnectedState yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1152 | } executed: } Execution Count:2094 | 2094 |
1153 | | - |
1154 | /*! \internal | - |
1155 | | - |
1156 | Tests if a connection has been established. If it has, connected() | - |
1157 | is emitted. Otherwise, _q_connectToNextAddress() is invoked. | - |
1158 | */ | - |
1159 | void QAbstractSocketPrivate::_q_testConnection() | - |
1160 | { | - |
1161 | if (socketEngine) { partially evaluated: socketEngine yes Evaluation Count:1261 | no Evaluation Count:0 |
| 0-1261 |
1162 | if (threadData->eventDispatcher) { partially evaluated: threadData->eventDispatcher yes Evaluation Count:1261 | no Evaluation Count:0 |
| 0-1261 |
1163 | if (connectTimer) evaluated: connectTimer yes Evaluation Count:1202 | yes Evaluation Count:59 |
| 59-1202 |
1164 | connectTimer->stop(); executed: connectTimer->stop(); Execution Count:1202 | 1202 |
1165 | } executed: } Execution Count:1261 | 1261 |
1166 | | - |
1167 | if (socketEngine->state() == QAbstractSocket::ConnectedState) { evaluated: socketEngine->state() == QAbstractSocket::ConnectedState yes Evaluation Count:1246 | yes Evaluation Count:15 |
| 15-1246 |
1168 | // Fetch the parameters if our connection is completed; | - |
1169 | // otherwise, fall out and try the next address. | - |
1170 | fetchConnectionParameters(); executed (the execution status of this line is deduced): fetchConnectionParameters(); | - |
1171 | if (pendingClose) { partially evaluated: pendingClose no Evaluation Count:0 | yes Evaluation Count:1246 |
| 0-1246 |
1172 | q_func()->disconnectFromHost(); never executed (the execution status of this line is deduced): q_func()->disconnectFromHost(); | - |
1173 | pendingClose = false; never executed (the execution status of this line is deduced): pendingClose = false; | - |
1174 | } | 0 |
1175 | return; executed: return; Execution Count:1246 | 1246 |
1176 | } | - |
1177 | | - |
1178 | // don't retry the other addresses if we had a proxy error | - |
1179 | if (isProxyError(socketEngine->error())) evaluated: isProxyError(socketEngine->error()) yes Evaluation Count:5 | yes Evaluation Count:10 |
| 5-10 |
1180 | addresses.clear(); executed: addresses.clear(); Execution Count:5 | 5 |
1181 | } executed: } Execution Count:15 | 15 |
1182 | | - |
1183 | if (threadData->eventDispatcher) { partially evaluated: threadData->eventDispatcher yes Evaluation Count:15 | no Evaluation Count:0 |
| 0-15 |
1184 | if (connectTimer) evaluated: connectTimer yes Evaluation Count:8 | yes Evaluation Count:7 |
| 7-8 |
1185 | connectTimer->stop(); executed: connectTimer->stop(); Execution Count:8 | 8 |
1186 | } executed: } Execution Count:15 | 15 |
1187 | | - |
1188 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1189 | qDebug("QAbstractSocketPrivate::_q_testConnection() connection failed," | - |
1190 | " checking for alternative addresses"); | - |
1191 | #endif | - |
1192 | _q_connectToNextAddress(); executed (the execution status of this line is deduced): _q_connectToNextAddress(); | - |
1193 | } executed: } Execution Count:15 | 15 |
1194 | | - |
1195 | /*! \internal | - |
1196 | | - |
1197 | This function is called after a certain number of seconds has | - |
1198 | passed while waiting for a connection. It simply tests the | - |
1199 | connection, and continues to the next address if the connection | - |
1200 | failed. | - |
1201 | */ | - |
1202 | void QAbstractSocketPrivate::_q_abortConnectionAttempt() | - |
1203 | { | - |
1204 | Q_Q(QAbstractSocket); never executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
1205 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1206 | qDebug("QAbstractSocketPrivate::_q_abortConnectionAttempt() (timed out)"); | - |
1207 | #endif | - |
1208 | if (socketEngine) never evaluated: socketEngine | 0 |
1209 | socketEngine->setWriteNotificationEnabled(false); never executed: socketEngine->setWriteNotificationEnabled(false); | 0 |
1210 | | - |
1211 | connectTimer->stop(); never executed (the execution status of this line is deduced): connectTimer->stop(); | - |
1212 | | - |
1213 | if (addresses.isEmpty()) { never evaluated: addresses.isEmpty() | 0 |
1214 | state = QAbstractSocket::UnconnectedState; never executed (the execution status of this line is deduced): state = QAbstractSocket::UnconnectedState; | - |
1215 | socketError = QAbstractSocket::SocketTimeoutError; never executed (the execution status of this line is deduced): socketError = QAbstractSocket::SocketTimeoutError; | - |
1216 | q->setErrorString(QAbstractSocket::tr("Connection timed out")); never executed (the execution status of this line is deduced): q->setErrorString(QAbstractSocket::tr("Connection timed out")); | - |
1217 | emit q->stateChanged(state); never executed (the execution status of this line is deduced): q->stateChanged(state); | - |
1218 | emit q->error(socketError); never executed (the execution status of this line is deduced): q->error(socketError); | - |
1219 | } else { | 0 |
1220 | _q_connectToNextAddress(); never executed (the execution status of this line is deduced): _q_connectToNextAddress(); | - |
1221 | } | 0 |
1222 | } | - |
1223 | | - |
1224 | void QAbstractSocketPrivate::_q_forceDisconnect() | - |
1225 | { | - |
1226 | Q_Q(QAbstractSocket); never executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
1227 | if (socketEngine && socketEngine->isValid() && state == QAbstractSocket::ClosingState) { never evaluated: socketEngine never evaluated: socketEngine->isValid() never evaluated: state == QAbstractSocket::ClosingState | 0 |
1228 | socketEngine->close(); never executed (the execution status of this line is deduced): socketEngine->close(); | - |
1229 | q->disconnectFromHost(); never executed (the execution status of this line is deduced): q->disconnectFromHost(); | - |
1230 | } | 0 |
1231 | } | 0 |
1232 | | - |
1233 | /*! \internal | - |
1234 | | - |
1235 | Reads data from the socket layer into the read buffer. Returns | - |
1236 | true on success; otherwise false. | - |
1237 | */ | - |
1238 | bool QAbstractSocketPrivate::readFromSocket() | - |
1239 | { | - |
1240 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
1241 | // Find how many bytes we can read from the socket layer. | - |
1242 | qint64 bytesToRead = socketEngine->bytesAvailable(); executed (the execution status of this line is deduced): qint64 bytesToRead = socketEngine->bytesAvailable(); | - |
1243 | if (bytesToRead == 0) { evaluated: bytesToRead == 0 yes Evaluation Count:205 | yes Evaluation Count:15869 |
| 205-15869 |
1244 | // Under heavy load, certain conditions can trigger read notifications | - |
1245 | // for socket notifiers on which there is no activity. If we continue | - |
1246 | // to read 0 bytes from the socket, we will trigger behavior similar | - |
1247 | // to that which signals a remote close. When we hit this condition, | - |
1248 | // we try to read 4k of data from the socket, which will give us either | - |
1249 | // an EAGAIN/EWOULDBLOCK if the connection is alive (i.e., the remote | - |
1250 | // host has _not_ disappeared). | - |
1251 | bytesToRead = 4096; executed (the execution status of this line is deduced): bytesToRead = 4096; | - |
1252 | } executed: } Execution Count:205 | 205 |
1253 | if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - buffer.size())) evaluated: readBufferMaxSize yes Evaluation Count:1174 | yes Evaluation Count:14900 |
evaluated: bytesToRead > (readBufferMaxSize - buffer.size()) yes Evaluation Count:36 | yes Evaluation Count:1138 |
| 36-14900 |
1254 | bytesToRead = readBufferMaxSize - buffer.size(); executed: bytesToRead = readBufferMaxSize - buffer.size(); Execution Count:36 | 36 |
1255 | | - |
1256 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1257 | qDebug("QAbstractSocketPrivate::readFromSocket() about to read %d bytes", | - |
1258 | int(bytesToRead)); | - |
1259 | #endif | - |
1260 | | - |
1261 | // Read from the socket, store data in the read buffer. | - |
1262 | char *ptr = buffer.reserve(bytesToRead); executed (the execution status of this line is deduced): char *ptr = buffer.reserve(bytesToRead); | - |
1263 | qint64 readBytes = socketEngine->read(ptr, bytesToRead); executed (the execution status of this line is deduced): qint64 readBytes = socketEngine->read(ptr, bytesToRead); | - |
1264 | if (readBytes == -2) { partially evaluated: readBytes == -2 no Evaluation Count:0 | yes Evaluation Count:16074 |
| 0-16074 |
1265 | // No bytes currently available for reading. | - |
1266 | buffer.chop(bytesToRead); never executed (the execution status of this line is deduced): buffer.chop(bytesToRead); | - |
1267 | return true; never executed: return true; | 0 |
1268 | } | - |
1269 | buffer.chop(int(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes))); executed (the execution status of this line is deduced): buffer.chop(int(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes))); | - |
1270 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1271 | qDebug("QAbstractSocketPrivate::readFromSocket() got %d bytes, buffer size = %d", | - |
1272 | int(readBytes), buffer.size()); | - |
1273 | #endif | - |
1274 | | - |
1275 | if (!socketEngine->isValid()) { evaluated: !socketEngine->isValid() yes Evaluation Count:205 | yes Evaluation Count:15869 |
| 205-15869 |
1276 | socketError = socketEngine->error(); executed (the execution status of this line is deduced): socketError = socketEngine->error(); | - |
1277 | q->setErrorString(socketEngine->errorString()); executed (the execution status of this line is deduced): q->setErrorString(socketEngine->errorString()); | - |
1278 | emit q->error(socketError); executed (the execution status of this line is deduced): q->error(socketError); | - |
1279 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1280 | qDebug("QAbstractSocketPrivate::readFromSocket() read failed: %s", | - |
1281 | q->errorString().toLatin1().constData()); | - |
1282 | #endif | - |
1283 | resetSocketLayer(); executed (the execution status of this line is deduced): resetSocketLayer(); | - |
1284 | return false; executed: return false; Execution Count:205 | 205 |
1285 | } | - |
1286 | | - |
1287 | return true; executed: return true; Execution Count:15869 | 15869 |
1288 | } | - |
1289 | | - |
1290 | /*! \internal | - |
1291 | | - |
1292 | Sets up the internal state after the connection has succeeded. | - |
1293 | */ | - |
1294 | void QAbstractSocketPrivate::fetchConnectionParameters() | - |
1295 | { | - |
1296 | Q_Q(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocket * const q = q_func(); | - |
1297 | | - |
1298 | peerName = hostName; executed (the execution status of this line is deduced): peerName = hostName; | - |
1299 | if (socketEngine) { partially evaluated: socketEngine yes Evaluation Count:1252 | no Evaluation Count:0 |
| 0-1252 |
1300 | socketEngine->setReadNotificationEnabled(true); executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(true); | - |
1301 | socketEngine->setWriteNotificationEnabled(true); executed (the execution status of this line is deduced): socketEngine->setWriteNotificationEnabled(true); | - |
1302 | localPort = socketEngine->localPort(); executed (the execution status of this line is deduced): localPort = socketEngine->localPort(); | - |
1303 | peerPort = socketEngine->peerPort(); executed (the execution status of this line is deduced): peerPort = socketEngine->peerPort(); | - |
1304 | localAddress = socketEngine->localAddress(); executed (the execution status of this line is deduced): localAddress = socketEngine->localAddress(); | - |
1305 | peerAddress = socketEngine->peerAddress(); executed (the execution status of this line is deduced): peerAddress = socketEngine->peerAddress(); | - |
1306 | cachedSocketDescriptor = socketEngine->socketDescriptor(); executed (the execution status of this line is deduced): cachedSocketDescriptor = socketEngine->socketDescriptor(); | - |
1307 | } executed: } Execution Count:1252 | 1252 |
1308 | | - |
1309 | state = QAbstractSocket::ConnectedState; executed (the execution status of this line is deduced): state = QAbstractSocket::ConnectedState; | - |
1310 | emit q->stateChanged(state); executed (the execution status of this line is deduced): q->stateChanged(state); | - |
1311 | emit q->connected(); executed (the execution status of this line is deduced): q->connected(); | - |
1312 | | - |
1313 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1314 | qDebug("QAbstractSocketPrivate::fetchConnectionParameters() connection to %s:%i established", | - |
1315 | host.toString().toLatin1().constData(), port); | - |
1316 | #endif | - |
1317 | } executed: } Execution Count:1252 | 1252 |
1318 | | - |
1319 | | - |
1320 | void QAbstractSocketPrivate::pauseSocketNotifiers(QAbstractSocket *socket) | - |
1321 | { | - |
1322 | QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; executed (the execution status of this line is deduced): QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; | - |
1323 | if (!socketEngine) evaluated: !socketEngine yes Evaluation Count:2 | yes Evaluation Count:251 |
| 2-251 |
1324 | return; executed: return; Execution Count:2 | 2 |
1325 | socket->d_func()->prePauseReadSocketNotifierState = socketEngine->isReadNotificationEnabled(); executed (the execution status of this line is deduced): socket->d_func()->prePauseReadSocketNotifierState = socketEngine->isReadNotificationEnabled(); | - |
1326 | socket->d_func()->prePauseWriteSocketNotifierState = socketEngine->isWriteNotificationEnabled(); executed (the execution status of this line is deduced): socket->d_func()->prePauseWriteSocketNotifierState = socketEngine->isWriteNotificationEnabled(); | - |
1327 | socket->d_func()->prePauseExceptionSocketNotifierState = socketEngine->isExceptionNotificationEnabled(); executed (the execution status of this line is deduced): socket->d_func()->prePauseExceptionSocketNotifierState = socketEngine->isExceptionNotificationEnabled(); | - |
1328 | socketEngine->setReadNotificationEnabled(false); executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(false); | - |
1329 | socketEngine->setWriteNotificationEnabled(false); executed (the execution status of this line is deduced): socketEngine->setWriteNotificationEnabled(false); | - |
1330 | socketEngine->setExceptionNotificationEnabled(false); executed (the execution status of this line is deduced): socketEngine->setExceptionNotificationEnabled(false); | - |
1331 | } executed: } Execution Count:251 | 251 |
1332 | | - |
1333 | void QAbstractSocketPrivate::resumeSocketNotifiers(QAbstractSocket *socket) | - |
1334 | { | - |
1335 | QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; executed (the execution status of this line is deduced): QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; | - |
1336 | if (!socketEngine) evaluated: !socketEngine yes Evaluation Count:2 | yes Evaluation Count:251 |
| 2-251 |
1337 | return; executed: return; Execution Count:2 | 2 |
1338 | socketEngine->setReadNotificationEnabled(socket->d_func()->prePauseReadSocketNotifierState); executed (the execution status of this line is deduced): socketEngine->setReadNotificationEnabled(socket->d_func()->prePauseReadSocketNotifierState); | - |
1339 | socketEngine->setWriteNotificationEnabled(socket->d_func()->prePauseWriteSocketNotifierState); executed (the execution status of this line is deduced): socketEngine->setWriteNotificationEnabled(socket->d_func()->prePauseWriteSocketNotifierState); | - |
1340 | socketEngine->setExceptionNotificationEnabled(socket->d_func()->prePauseExceptionSocketNotifierState); executed (the execution status of this line is deduced): socketEngine->setExceptionNotificationEnabled(socket->d_func()->prePauseExceptionSocketNotifierState); | - |
1341 | } executed: } Execution Count:251 | 251 |
1342 | | - |
1343 | QAbstractSocketEngine* QAbstractSocketPrivate::getSocketEngine(QAbstractSocket *socket) | - |
1344 | { | - |
1345 | return socket->d_func()->socketEngine; never executed: return socket->d_func()->socketEngine; | 0 |
1346 | } | - |
1347 | | - |
1348 | | - |
1349 | /*! \internal | - |
1350 | | - |
1351 | Constructs a new abstract socket of type \a socketType. The \a | - |
1352 | parent argument is passed to QObject's constructor. | - |
1353 | */ | - |
1354 | QAbstractSocket::QAbstractSocket(SocketType socketType, | - |
1355 | QAbstractSocketPrivate &dd, QObject *parent) | - |
1356 | : QIODevice(dd, parent) | - |
1357 | { | - |
1358 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1359 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1360 | qDebug("QAbstractSocket::QAbstractSocket(%sSocket, QAbstractSocketPrivate == %p, parent == %p)", | - |
1361 | socketType == TcpSocket ? "Tcp" : socketType == UdpSocket | - |
1362 | ? "Udp" : "Unknown", &dd, parent); | - |
1363 | #endif | - |
1364 | d->socketType = socketType; executed (the execution status of this line is deduced): d->socketType = socketType; | - |
1365 | } executed: } Execution Count:3144 | 3144 |
1366 | | - |
1367 | /*! | - |
1368 | Creates a new abstract socket of type \a socketType. The \a | - |
1369 | parent argument is passed to QObject's constructor. | - |
1370 | | - |
1371 | \sa socketType(), QTcpSocket, QUdpSocket | - |
1372 | */ | - |
1373 | QAbstractSocket::QAbstractSocket(SocketType socketType, QObject *parent) | - |
1374 | : QIODevice(*new QAbstractSocketPrivate, parent) | - |
1375 | { | - |
1376 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1377 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1378 | qDebug("QAbstractSocket::QAbstractSocket(%p)", parent); | - |
1379 | #endif | - |
1380 | d->socketType = socketType; executed (the execution status of this line is deduced): d->socketType = socketType; | - |
1381 | } executed: } Execution Count:1 | 1 |
1382 | | - |
1383 | /*! | - |
1384 | Destroys the socket. | - |
1385 | */ | - |
1386 | QAbstractSocket::~QAbstractSocket() | - |
1387 | { | - |
1388 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1389 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1390 | qDebug("QAbstractSocket::~QAbstractSocket()"); | - |
1391 | #endif | - |
1392 | if (d->state != UnconnectedState) evaluated: d->state != UnconnectedState yes Evaluation Count:1629 | yes Evaluation Count:1513 |
| 1513-1629 |
1393 | abort(); executed: abort(); Execution Count:1629 | 1629 |
1394 | } executed: } Execution Count:3142 | 3142 |
1395 | | - |
1396 | /*! | - |
1397 | \since 5.0 | - |
1398 | | - |
1399 | Continues data transfer on the socket. This method should only be used | - |
1400 | after the socket has been set to pause upon notifications and a | - |
1401 | notification has been received. | - |
1402 | The only notification currently supported is QSslSocket::sslErrors(). | - |
1403 | Calling this method if the socket is not paused results in undefined | - |
1404 | behavior. | - |
1405 | | - |
1406 | \sa pauseMode(), setPauseMode() | - |
1407 | */ | - |
1408 | void QAbstractSocket::resume() | - |
1409 | { | - |
1410 | QAbstractSocketPrivate::resumeSocketNotifiers(this); never executed (the execution status of this line is deduced): QAbstractSocketPrivate::resumeSocketNotifiers(this); | - |
1411 | } | 0 |
1412 | | - |
1413 | /*! | - |
1414 | \since 5.0 | - |
1415 | | - |
1416 | Returns the pause mode of this socket. | - |
1417 | | - |
1418 | \sa setPauseMode(), resume() | - |
1419 | */ | - |
1420 | QAbstractSocket::PauseModes QAbstractSocket::pauseMode() const | - |
1421 | { | - |
1422 | return d_func()->pauseMode; executed: return d_func()->pauseMode; Execution Count:9 | 9 |
1423 | } | - |
1424 | | - |
1425 | | - |
1426 | /*! | - |
1427 | \since 5.0 | - |
1428 | | - |
1429 | Controls whether to pause upon receiving a notification. The \a pauseMode parameter | - |
1430 | specifies the conditions in which the socket should be paused. The only notification | - |
1431 | currently supported is QSslSocket::sslErrors(). If set to PauseOnSslErrors, | - |
1432 | data transfer on the socket will be paused and needs to be enabled explicitly | - |
1433 | again by calling resume(). | - |
1434 | By default this option is set to PauseNever. | - |
1435 | This option must be called before connecting to the server, otherwise it will | - |
1436 | result in undefined behavior. | - |
1437 | | - |
1438 | \sa pauseMode(), resume() | - |
1439 | */ | - |
1440 | void QAbstractSocket::setPauseMode(PauseModes pauseMode) | - |
1441 | { | - |
1442 | d_func()->pauseMode = pauseMode; never executed (the execution status of this line is deduced): d_func()->pauseMode = pauseMode; | - |
1443 | } | 0 |
1444 | | - |
1445 | /*! | - |
1446 | \since 5.0 | - |
1447 | | - |
1448 | Binds to \a address on port \a port, using the BindMode \a mode. | - |
1449 | | - |
1450 | Binds this socket to the address \a address and the port \a port. | - |
1451 | | - |
1452 | For UDP sockets, after binding, the signal QUdpSocket::readyRead() is emitted | - |
1453 | whenever a UDP datagram arrives on the specified address and port. | - |
1454 | Thus, This function is useful to write UDP servers. | - |
1455 | | - |
1456 | For TCP sockets, this function may be used to specify which interface to use | - |
1457 | for an outgoing connection, which is useful in case of multiple network | - |
1458 | interfaces. | - |
1459 | | - |
1460 | By default, the socket is bound using the DefaultForPlatform BindMode. | - |
1461 | If a port is not specified, a random port is chosen. | - |
1462 | | - |
1463 | On success, the functions returns true and the socket enters | - |
1464 | BoundState; otherwise it returns false. | - |
1465 | | - |
1466 | */ | - |
1467 | bool QAbstractSocket::bind(const QHostAddress &address, quint16 port, BindMode mode) | - |
1468 | { | - |
1469 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1470 | | - |
1471 | // now check if the socket engine is initialized and to the right type | - |
1472 | if (!d->socketEngine || !d->socketEngine->isValid()) { evaluated: !d->socketEngine yes Evaluation Count:286 | yes Evaluation Count:19 |
partially evaluated: !d->socketEngine->isValid() no Evaluation Count:0 | yes Evaluation Count:19 |
| 0-286 |
1473 | QHostAddress nullAddress; executed (the execution status of this line is deduced): QHostAddress nullAddress; | - |
1474 | d->resolveProxy(nullAddress.toString(), port); executed (the execution status of this line is deduced): d->resolveProxy(nullAddress.toString(), port); | - |
1475 | | - |
1476 | QAbstractSocket::NetworkLayerProtocol protocol = address.protocol(); executed (the execution status of this line is deduced): QAbstractSocket::NetworkLayerProtocol protocol = address.protocol(); | - |
1477 | if (protocol == QAbstractSocket::UnknownNetworkLayerProtocol) partially evaluated: protocol == QAbstractSocket::UnknownNetworkLayerProtocol no Evaluation Count:0 | yes Evaluation Count:286 |
| 0-286 |
1478 | protocol = nullAddress.protocol(); never executed: protocol = nullAddress.protocol(); | 0 |
1479 | | - |
1480 | if (!d->initSocketLayer(protocol)) partially evaluated: !d->initSocketLayer(protocol) no Evaluation Count:0 | yes Evaluation Count:286 |
| 0-286 |
1481 | return false; never executed: return false; | 0 |
1482 | } executed: } Execution Count:286 | 286 |
1483 | | - |
1484 | if (mode != DefaultForPlatform) { evaluated: mode != DefaultForPlatform yes Evaluation Count:3 | yes Evaluation Count:302 |
| 3-302 |
1485 | #ifdef Q_OS_UNIX | - |
1486 | if ((mode & ShareAddress) || (mode & ReuseAddressHint)) evaluated: (mode & ShareAddress) yes Evaluation Count:1 | yes Evaluation Count:2 |
partially evaluated: (mode & ReuseAddressHint) yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1487 | d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); executed: d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); Execution Count:3 | 3 |
1488 | else | - |
1489 | d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 0); never executed: d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 0); | 0 |
1490 | #endif | - |
1491 | #ifdef Q_OS_WIN | - |
1492 | if (mode & ReuseAddressHint) | - |
1493 | d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); | - |
1494 | else | - |
1495 | d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 0); | - |
1496 | if (mode & DontShareAddress) | - |
1497 | d->socketEngine->setOption(QAbstractSocketEngine::BindExclusively, 1); | - |
1498 | else | - |
1499 | d->socketEngine->setOption(QAbstractSocketEngine::BindExclusively, 0); | - |
1500 | #endif | - |
1501 | } | - |
1502 | bool result = d->socketEngine->bind(address, port); executed (the execution status of this line is deduced): bool result = d->socketEngine->bind(address, port); | - |
1503 | d->cachedSocketDescriptor = d->socketEngine->socketDescriptor(); executed (the execution status of this line is deduced): d->cachedSocketDescriptor = d->socketEngine->socketDescriptor(); | - |
1504 | | - |
1505 | if (!result) { evaluated: !result yes Evaluation Count:27 | yes Evaluation Count:278 |
| 27-278 |
1506 | d->socketError = d->socketEngine->error(); executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
1507 | setErrorString(d->socketEngine->errorString()); executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
1508 | emit error(d->socketError); executed (the execution status of this line is deduced): error(d->socketError); | - |
1509 | return false; executed: return false; Execution Count:27 | 27 |
1510 | } | - |
1511 | | - |
1512 | d->state = BoundState; executed (the execution status of this line is deduced): d->state = BoundState; | - |
1513 | d->localAddress = d->socketEngine->localAddress(); executed (the execution status of this line is deduced): d->localAddress = d->socketEngine->localAddress(); | - |
1514 | d->localPort = d->socketEngine->localPort(); executed (the execution status of this line is deduced): d->localPort = d->socketEngine->localPort(); | - |
1515 | | - |
1516 | emit stateChanged(d->state); executed (the execution status of this line is deduced): stateChanged(d->state); | - |
1517 | d->socketEngine->setReadNotificationEnabled(true); executed (the execution status of this line is deduced): d->socketEngine->setReadNotificationEnabled(true); | - |
1518 | return true; executed: return true; Execution Count:278 | 278 |
1519 | } | - |
1520 | | - |
1521 | /*! | - |
1522 | \since 5.0 | - |
1523 | \overload | - |
1524 | | - |
1525 | Binds to QHostAddress:Any on port \a port, using the BindMode \a mode. | - |
1526 | | - |
1527 | By default, the socket is bound using the DefaultForPlatform BindMode. | - |
1528 | If a port is not specified, a random port is chosen. | - |
1529 | */ | - |
1530 | bool QAbstractSocket::bind(quint16 port, BindMode mode) | - |
1531 | { | - |
1532 | return bind(QHostAddress::Any, port, mode); executed: return bind(QHostAddress::Any, port, mode); Execution Count:121 | 121 |
1533 | } | - |
1534 | | - |
1535 | /*! | - |
1536 | Returns true if the socket is valid and ready for use; otherwise | - |
1537 | returns false. | - |
1538 | | - |
1539 | \b{Note:} The socket's state must be ConnectedState before reading and | - |
1540 | writing can occur. | - |
1541 | | - |
1542 | \sa state() | - |
1543 | */ | - |
1544 | bool QAbstractSocket::isValid() const | - |
1545 | { | - |
1546 | return d_func()->socketEngine ? d_func()->socketEngine->isValid() : isOpen(); executed: return d_func()->socketEngine ? d_func()->socketEngine->isValid() : isOpen(); Execution Count:3341915 | 3341915 |
1547 | } | - |
1548 | | - |
1549 | /*! | - |
1550 | Attempts to make a connection to \a hostName on the given \a port. | - |
1551 | The \a protocol parameter can be used to specify which network | - |
1552 | protocol to use (eg. IPv4 or IPv6). | - |
1553 | | - |
1554 | The socket is opened in the given \a openMode and first enters | - |
1555 | HostLookupState, then performs a host name lookup of \a hostName. | - |
1556 | If the lookup succeeds, hostFound() is emitted and QAbstractSocket | - |
1557 | enters ConnectingState. It then attempts to connect to the address | - |
1558 | or addresses returned by the lookup. Finally, if a connection is | - |
1559 | established, QAbstractSocket enters ConnectedState and | - |
1560 | emits connected(). | - |
1561 | | - |
1562 | At any point, the socket can emit error() to signal that an error | - |
1563 | occurred. | - |
1564 | | - |
1565 | \a hostName may be an IP address in string form (e.g., | - |
1566 | "43.195.83.32"), or it may be a host name (e.g., | - |
1567 | "example.com"). QAbstractSocket will do a lookup only if | - |
1568 | required. \a port is in native byte order. | - |
1569 | | - |
1570 | \sa state(), peerName(), peerAddress(), peerPort(), waitForConnected() | - |
1571 | */ | - |
1572 | void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, | - |
1573 | OpenMode openMode, | - |
1574 | NetworkLayerProtocol protocol) | - |
1575 | { | - |
1576 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1577 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1578 | qDebug("QAbstractSocket::connectToHost(\"%s\", %i, %i)...", qPrintable(hostName), port, | - |
1579 | (int) openMode); | - |
1580 | #endif | - |
1581 | | - |
1582 | if (d->state == ConnectedState || d->state == ConnectingState partially evaluated: d->state == ConnectedState no Evaluation Count:0 | yes Evaluation Count:2277 |
partially evaluated: d->state == ConnectingState no Evaluation Count:0 | yes Evaluation Count:2277 |
| 0-2277 |
1583 | || d->state == ClosingState || d->state == HostLookupState) { partially evaluated: d->state == ClosingState no Evaluation Count:0 | yes Evaluation Count:2277 |
partially evaluated: d->state == HostLookupState no Evaluation Count:0 | yes Evaluation Count:2277 |
| 0-2277 |
1584 | qWarning("QAbstractSocket::connectToHost() called when already looking up or connecting/connected to \"%s\"", qPrintable(hostName)); never executed (the execution status of this line is deduced): QMessageLogger("socket/qabstractsocket.cpp", 1584, __PRETTY_FUNCTION__).warning("QAbstractSocket::connectToHost() called when already looking up or connecting/connected to \"%s\"", QString(hostName).toLocal8Bit().constData()); | - |
1585 | d->socketError = QAbstractSocket::OperationError; never executed (the execution status of this line is deduced): d->socketError = QAbstractSocket::OperationError; | - |
1586 | setErrorString(QAbstractSocket::tr("Trying to connect while connection is in progress")); never executed (the execution status of this line is deduced): setErrorString(QAbstractSocket::tr("Trying to connect while connection is in progress")); | - |
1587 | emit error(d->socketError); never executed (the execution status of this line is deduced): error(d->socketError); | - |
1588 | return; | 0 |
1589 | } | - |
1590 | | - |
1591 | d->preferredNetworkLayerProtocol = protocol; executed (the execution status of this line is deduced): d->preferredNetworkLayerProtocol = protocol; | - |
1592 | d->hostName = hostName; executed (the execution status of this line is deduced): d->hostName = hostName; | - |
1593 | d->port = port; executed (the execution status of this line is deduced): d->port = port; | - |
1594 | d->state = UnconnectedState; executed (the execution status of this line is deduced): d->state = UnconnectedState; | - |
1595 | d->buffer.clear(); executed (the execution status of this line is deduced): d->buffer.clear(); | - |
1596 | d->writeBuffer.clear(); executed (the execution status of this line is deduced): d->writeBuffer.clear(); | - |
1597 | d->abortCalled = false; executed (the execution status of this line is deduced): d->abortCalled = false; | - |
1598 | d->closeCalled = false; executed (the execution status of this line is deduced): d->closeCalled = false; | - |
1599 | d->pendingClose = false; executed (the execution status of this line is deduced): d->pendingClose = false; | - |
1600 | d->localPort = 0; executed (the execution status of this line is deduced): d->localPort = 0; | - |
1601 | d->peerPort = 0; executed (the execution status of this line is deduced): d->peerPort = 0; | - |
1602 | d->localAddress.clear(); executed (the execution status of this line is deduced): d->localAddress.clear(); | - |
1603 | d->peerAddress.clear(); executed (the execution status of this line is deduced): d->peerAddress.clear(); | - |
1604 | d->peerName = hostName; executed (the execution status of this line is deduced): d->peerName = hostName; | - |
1605 | if (d->hostLookupId != -1) { partially evaluated: d->hostLookupId != -1 no Evaluation Count:0 | yes Evaluation Count:2277 |
| 0-2277 |
1606 | QHostInfo::abortHostLookup(d->hostLookupId); never executed (the execution status of this line is deduced): QHostInfo::abortHostLookup(d->hostLookupId); | - |
1607 | d->hostLookupId = -1; never executed (the execution status of this line is deduced): d->hostLookupId = -1; | - |
1608 | } | 0 |
1609 | | - |
1610 | #ifndef QT_NO_NETWORKPROXY | - |
1611 | // Get the proxy information | - |
1612 | d->resolveProxy(hostName, port); executed (the execution status of this line is deduced): d->resolveProxy(hostName, port); | - |
1613 | if (d->proxyInUse.type() == QNetworkProxy::DefaultProxy) { partially evaluated: d->proxyInUse.type() == QNetworkProxy::DefaultProxy no Evaluation Count:0 | yes Evaluation Count:2277 |
| 0-2277 |
1614 | // failed to setup the proxy | - |
1615 | d->socketError = QAbstractSocket::UnsupportedSocketOperationError; never executed (the execution status of this line is deduced): d->socketError = QAbstractSocket::UnsupportedSocketOperationError; | - |
1616 | setErrorString(QAbstractSocket::tr("Operation on socket is not supported")); never executed (the execution status of this line is deduced): setErrorString(QAbstractSocket::tr("Operation on socket is not supported")); | - |
1617 | emit error(d->socketError); never executed (the execution status of this line is deduced): error(d->socketError); | - |
1618 | return; | 0 |
1619 | } | - |
1620 | #endif | - |
1621 | | - |
1622 | if (openMode & QIODevice::Unbuffered) evaluated: openMode & QIODevice::Unbuffered yes Evaluation Count:425 | yes Evaluation Count:1852 |
| 425-1852 |
1623 | d->isBuffered = false; // Unbuffered QTcpSocket executed: d->isBuffered = false; Execution Count:425 | 425 |
1624 | else if (!d_func()->isBuffered) evaluated: !d_func()->isBuffered yes Evaluation Count:6 | yes Evaluation Count:1846 |
| 6-1846 |
1625 | openMode |= QAbstractSocket::Unbuffered; // QUdpSocket executed: openMode |= QAbstractSocket::Unbuffered; Execution Count:6 | 6 |
1626 | | - |
1627 | QIODevice::open(openMode); executed (the execution status of this line is deduced): QIODevice::open(openMode); | - |
1628 | d->state = HostLookupState; executed (the execution status of this line is deduced): d->state = HostLookupState; | - |
1629 | emit stateChanged(d->state); executed (the execution status of this line is deduced): stateChanged(d->state); | - |
1630 | | - |
1631 | QHostAddress temp; executed (the execution status of this line is deduced): QHostAddress temp; | - |
1632 | if (temp.setAddress(hostName)) { evaluated: temp.setAddress(hostName) yes Evaluation Count:519 | yes Evaluation Count:1758 |
| 519-1758 |
1633 | QHostInfo info; executed (the execution status of this line is deduced): QHostInfo info; | - |
1634 | info.setAddresses(QList<QHostAddress>() << temp); executed (the execution status of this line is deduced): info.setAddresses(QList<QHostAddress>() << temp); | - |
1635 | d->_q_startConnecting(info); executed (the execution status of this line is deduced): d->_q_startConnecting(info); | - |
1636 | #ifndef QT_NO_NETWORKPROXY | - |
1637 | } else if (d->proxyInUse.capabilities() & QNetworkProxy::HostNameLookupCapability) { executed: } Execution Count:519 evaluated: d->proxyInUse.capabilities() & QNetworkProxy::HostNameLookupCapability yes Evaluation Count:59 | yes Evaluation Count:1699 |
| 59-1699 |
1638 | // the proxy supports connection by name, so use it | - |
1639 | d->startConnectingByName(hostName); executed (the execution status of this line is deduced): d->startConnectingByName(hostName); | - |
1640 | return; executed: return; Execution Count:59 | 59 |
1641 | #endif | - |
1642 | } else { | - |
1643 | if (d->threadData->eventDispatcher) { partially evaluated: d->threadData->eventDispatcher yes Evaluation Count:1699 | no Evaluation Count:0 |
| 0-1699 |
1644 | // this internal API for QHostInfo either immediately gives us the desired | - |
1645 | // QHostInfo from cache or later calls the _q_startConnecting slot. | - |
1646 | bool immediateResultValid = false; executed (the execution status of this line is deduced): bool immediateResultValid = false; | - |
1647 | QHostInfo hostInfo = qt_qhostinfo_lookup(hostName, executed (the execution status of this line is deduced): QHostInfo hostInfo = qt_qhostinfo_lookup(hostName, | - |
1648 | this, executed (the execution status of this line is deduced): this, | - |
1649 | SLOT(_q_startConnecting(QHostInfo)), executed (the execution status of this line is deduced): "1""_q_startConnecting(QHostInfo)", | - |
1650 | &immediateResultValid, executed (the execution status of this line is deduced): &immediateResultValid, | - |
1651 | &d->hostLookupId); executed (the execution status of this line is deduced): &d->hostLookupId); | - |
1652 | if (immediateResultValid) { evaluated: immediateResultValid yes Evaluation Count:1577 | yes Evaluation Count:122 |
| 122-1577 |
1653 | d->hostLookupId = -1; executed (the execution status of this line is deduced): d->hostLookupId = -1; | - |
1654 | d->_q_startConnecting(hostInfo); executed (the execution status of this line is deduced): d->_q_startConnecting(hostInfo); | - |
1655 | } executed: } Execution Count:1577 | 1577 |
1656 | } executed: } Execution Count:1699 | 1699 |
1657 | } executed: } Execution Count:1699 | 1699 |
1658 | | - |
1659 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1660 | qDebug("QAbstractSocket::connectToHost(\"%s\", %i) == %s%s", hostName.toLatin1().constData(), port, | - |
1661 | (d->state == ConnectedState) ? "true" : "false", | - |
1662 | (d->state == ConnectingState || d->state == HostLookupState) | - |
1663 | ? " (connection in progress)" : ""); | - |
1664 | #endif | - |
1665 | } | - |
1666 | | - |
1667 | /*! \overload | - |
1668 | | - |
1669 | Attempts to make a connection to \a address on port \a port. | - |
1670 | */ | - |
1671 | void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, | - |
1672 | OpenMode openMode) | - |
1673 | { | - |
1674 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1675 | qDebug("QAbstractSocket::connectToHost([%s], %i, %i)...", | - |
1676 | address.toString().toLatin1().constData(), port, (int) openMode); | - |
1677 | #endif | - |
1678 | connectToHost(address.toString(), port, openMode); executed (the execution status of this line is deduced): connectToHost(address.toString(), port, openMode); | - |
1679 | } executed: } Execution Count:54 | 54 |
1680 | | - |
1681 | /*! | - |
1682 | Returns the number of bytes that are waiting to be written. The | - |
1683 | bytes are written when control goes back to the event loop or | - |
1684 | when flush() is called. | - |
1685 | | - |
1686 | \sa bytesAvailable(), flush() | - |
1687 | */ | - |
1688 | qint64 QAbstractSocket::bytesToWrite() const | - |
1689 | { | - |
1690 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1691 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1692 | qDebug("QAbstractSocket::bytesToWrite() == %i", d->writeBuffer.size()); | - |
1693 | #endif | - |
1694 | return (qint64)d->writeBuffer.size(); executed: return (qint64)d->writeBuffer.size(); Execution Count:17851 | 17851 |
1695 | } | - |
1696 | | - |
1697 | /*! | - |
1698 | Returns the number of incoming bytes that are waiting to be read. | - |
1699 | | - |
1700 | \sa bytesToWrite(), read() | - |
1701 | */ | - |
1702 | qint64 QAbstractSocket::bytesAvailable() const | - |
1703 | { | - |
1704 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1705 | qint64 available = QIODevice::bytesAvailable(); executed (the execution status of this line is deduced): qint64 available = QIODevice::bytesAvailable(); | - |
1706 | | - |
1707 | if (!d->isBuffered && d->socketEngine && d->socketEngine->isValid()) evaluated: !d->isBuffered yes Evaluation Count:17559 | yes Evaluation Count:14948 |
evaluated: d->socketEngine yes Evaluation Count:17512 | yes Evaluation Count:47 |
partially evaluated: d->socketEngine->isValid() yes Evaluation Count:17512 | no Evaluation Count:0 |
| 0-17559 |
1708 | available += d->socketEngine->bytesAvailable(); executed: available += d->socketEngine->bytesAvailable(); Execution Count:17512 | 17512 |
1709 | | - |
1710 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
1711 | qDebug("QAbstractSocket::bytesAvailable() == %llu", available); | - |
1712 | #endif | - |
1713 | return available; executed: return available; Execution Count:32507 | 32507 |
1714 | } | - |
1715 | | - |
1716 | /*! | - |
1717 | Returns the host port number (in native byte order) of the local | - |
1718 | socket if available; otherwise returns 0. | - |
1719 | | - |
1720 | \sa localAddress(), peerPort(), setLocalPort() | - |
1721 | */ | - |
1722 | quint16 QAbstractSocket::localPort() const | - |
1723 | { | - |
1724 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1725 | return d->localPort; executed: return d->localPort; Execution Count:423 | 423 |
1726 | } | - |
1727 | | - |
1728 | /*! | - |
1729 | Returns the host address of the local socket if available; | - |
1730 | otherwise returns QHostAddress::Null. | - |
1731 | | - |
1732 | This is normally the main IP address of the host, but can be | - |
1733 | QHostAddress::LocalHost (127.0.0.1) for connections to the | - |
1734 | local host. | - |
1735 | | - |
1736 | \sa localPort(), peerAddress(), setLocalAddress() | - |
1737 | */ | - |
1738 | QHostAddress QAbstractSocket::localAddress() const | - |
1739 | { | - |
1740 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1741 | return d->localAddress; executed: return d->localAddress; Execution Count:716 | 716 |
1742 | } | - |
1743 | | - |
1744 | /*! | - |
1745 | Returns the port of the connected peer if the socket is in | - |
1746 | ConnectedState; otherwise returns 0. | - |
1747 | | - |
1748 | \sa peerAddress(), localPort(), setPeerPort() | - |
1749 | */ | - |
1750 | quint16 QAbstractSocket::peerPort() const | - |
1751 | { | - |
1752 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1753 | return d->peerPort; executed: return d->peerPort; Execution Count:133 | 133 |
1754 | } | - |
1755 | | - |
1756 | /*! | - |
1757 | Returns the address of the connected peer if the socket is in | - |
1758 | ConnectedState; otherwise returns QHostAddress::Null. | - |
1759 | | - |
1760 | \sa peerName(), peerPort(), localAddress(), setPeerAddress() | - |
1761 | */ | - |
1762 | QHostAddress QAbstractSocket::peerAddress() const | - |
1763 | { | - |
1764 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1765 | return d->peerAddress; executed: return d->peerAddress; Execution Count:127 | 127 |
1766 | } | - |
1767 | | - |
1768 | /*! | - |
1769 | Returns the name of the peer as specified by connectToHost(), or | - |
1770 | an empty QString if connectToHost() has not been called. | - |
1771 | | - |
1772 | \sa peerAddress(), peerPort(), setPeerName() | - |
1773 | */ | - |
1774 | QString QAbstractSocket::peerName() const | - |
1775 | { | - |
1776 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1777 | return d->peerName.isEmpty() ? d->hostName : d->peerName; executed: return d->peerName.isEmpty() ? d->hostName : d->peerName; Execution Count:327 | 327 |
1778 | } | - |
1779 | | - |
1780 | /*! | - |
1781 | Returns true if a line of data can be read from the socket; | - |
1782 | otherwise returns false. | - |
1783 | | - |
1784 | \sa readLine() | - |
1785 | */ | - |
1786 | bool QAbstractSocket::canReadLine() const | - |
1787 | { | - |
1788 | bool hasLine = d_func()->buffer.canReadLine(); executed (the execution status of this line is deduced): bool hasLine = d_func()->buffer.canReadLine(); | - |
1789 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
1790 | qDebug("QAbstractSocket::canReadLine() == %s, buffer size = %d, size = %d", hasLine ? "true" : "false", | - |
1791 | d_func()->buffer.size(), d_func()->buffer.size()); | - |
1792 | #endif | - |
1793 | return hasLine || QIODevice::canReadLine(); executed: return hasLine || QIODevice::canReadLine(); Execution Count:1081 | 1081 |
1794 | } | - |
1795 | | - |
1796 | /*! | - |
1797 | Returns the native socket descriptor of the QAbstractSocket object | - |
1798 | if this is available; otherwise returns -1. | - |
1799 | | - |
1800 | If the socket is using QNetworkProxy, the returned descriptor | - |
1801 | may not be usable with native socket functions. | - |
1802 | | - |
1803 | The socket descriptor is not available when QAbstractSocket is in | - |
1804 | UnconnectedState. | - |
1805 | | - |
1806 | \sa setSocketDescriptor() | - |
1807 | */ | - |
1808 | qintptr QAbstractSocket::socketDescriptor() const | - |
1809 | { | - |
1810 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
1811 | return d->cachedSocketDescriptor; executed: return d->cachedSocketDescriptor; Execution Count:290 | 290 |
1812 | } | - |
1813 | | - |
1814 | /*! | - |
1815 | Initializes QAbstractSocket with the native socket descriptor \a | - |
1816 | socketDescriptor. Returns true if \a socketDescriptor is accepted | - |
1817 | as a valid socket descriptor; otherwise returns false. | - |
1818 | The socket is opened in the mode specified by \a openMode, and | - |
1819 | enters the socket state specified by \a socketState. | - |
1820 | | - |
1821 | \b{Note:} It is not possible to initialize two abstract sockets | - |
1822 | with the same native socket descriptor. | - |
1823 | | - |
1824 | \sa socketDescriptor() | - |
1825 | */ | - |
1826 | bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState socketState, | - |
1827 | OpenMode openMode) | - |
1828 | { | - |
1829 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1830 | | - |
1831 | d->resetSocketLayer(); executed (the execution status of this line is deduced): d->resetSocketLayer(); | - |
1832 | d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this); executed (the execution status of this line is deduced): d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this); | - |
1833 | if (!d->socketEngine) { partially evaluated: !d->socketEngine no Evaluation Count:0 | yes Evaluation Count:612 |
| 0-612 |
1834 | d->socketError = UnsupportedSocketOperationError; never executed (the execution status of this line is deduced): d->socketError = UnsupportedSocketOperationError; | - |
1835 | setErrorString(tr("Operation on socket is not supported")); never executed (the execution status of this line is deduced): setErrorString(tr("Operation on socket is not supported")); | - |
1836 | return false; never executed: return false; | 0 |
1837 | } | - |
1838 | #ifndef QT_NO_BEARERMANAGEMENT | - |
1839 | //copy network session down to the socket engine (if it has been set) | - |
1840 | d->socketEngine->setProperty("_q_networksession", property("_q_networksession")); executed (the execution status of this line is deduced): d->socketEngine->setProperty("_q_networksession", property("_q_networksession")); | - |
1841 | #endif | - |
1842 | bool result = d->socketEngine->initialize(socketDescriptor, socketState); executed (the execution status of this line is deduced): bool result = d->socketEngine->initialize(socketDescriptor, socketState); | - |
1843 | if (!result) { evaluated: !result yes Evaluation Count:1 | yes Evaluation Count:611 |
| 1-611 |
1844 | d->socketError = d->socketEngine->error(); executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
1845 | setErrorString(d->socketEngine->errorString()); executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
1846 | return false; executed: return false; Execution Count:1 | 1 |
1847 | } | - |
1848 | | - |
1849 | if (d->threadData->eventDispatcher) partially evaluated: d->threadData->eventDispatcher yes Evaluation Count:611 | no Evaluation Count:0 |
| 0-611 |
1850 | d->socketEngine->setReceiver(d); executed: d->socketEngine->setReceiver(d); Execution Count:611 | 611 |
1851 | | - |
1852 | QIODevice::open(openMode); executed (the execution status of this line is deduced): QIODevice::open(openMode); | - |
1853 | | - |
1854 | if (d->state != socketState) { partially evaluated: d->state != socketState yes Evaluation Count:611 | no Evaluation Count:0 |
| 0-611 |
1855 | d->state = socketState; executed (the execution status of this line is deduced): d->state = socketState; | - |
1856 | emit stateChanged(d->state); executed (the execution status of this line is deduced): stateChanged(d->state); | - |
1857 | } executed: } Execution Count:611 | 611 |
1858 | | - |
1859 | d->pendingClose = false; executed (the execution status of this line is deduced): d->pendingClose = false; | - |
1860 | d->socketEngine->setReadNotificationEnabled(true); executed (the execution status of this line is deduced): d->socketEngine->setReadNotificationEnabled(true); | - |
1861 | d->localPort = d->socketEngine->localPort(); executed (the execution status of this line is deduced): d->localPort = d->socketEngine->localPort(); | - |
1862 | d->peerPort = d->socketEngine->peerPort(); executed (the execution status of this line is deduced): d->peerPort = d->socketEngine->peerPort(); | - |
1863 | d->localAddress = d->socketEngine->localAddress(); executed (the execution status of this line is deduced): d->localAddress = d->socketEngine->localAddress(); | - |
1864 | d->peerAddress = d->socketEngine->peerAddress(); executed (the execution status of this line is deduced): d->peerAddress = d->socketEngine->peerAddress(); | - |
1865 | d->cachedSocketDescriptor = socketDescriptor; executed (the execution status of this line is deduced): d->cachedSocketDescriptor = socketDescriptor; | - |
1866 | | - |
1867 | return true; executed: return true; Execution Count:611 | 611 |
1868 | } | - |
1869 | | - |
1870 | /*! | - |
1871 | \since 4.6 | - |
1872 | Sets the given \a option to the value described by \a value. | - |
1873 | | - |
1874 | \sa socketOption() | - |
1875 | */ | - |
1876 | void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) | - |
1877 | { | - |
1878 | if (!d_func()->socketEngine) partially evaluated: !d_func()->socketEngine no Evaluation Count:0 | yes Evaluation Count:790 |
| 0-790 |
1879 | return; | 0 |
1880 | | - |
1881 | switch (option) { | - |
1882 | case LowDelayOption: | - |
1883 | d_func()->socketEngine->setOption(QAbstractSocketEngine::LowDelayOption, value.toInt()); executed (the execution status of this line is deduced): d_func()->socketEngine->setOption(QAbstractSocketEngine::LowDelayOption, value.toInt()); | - |
1884 | break; executed: break; Execution Count:36 | 36 |
1885 | | - |
1886 | case KeepAliveOption: | - |
1887 | d_func()->socketEngine->setOption(QAbstractSocketEngine::KeepAliveOption, value.toInt()); executed (the execution status of this line is deduced): d_func()->socketEngine->setOption(QAbstractSocketEngine::KeepAliveOption, value.toInt()); | - |
1888 | break; executed: break; Execution Count:702 | 702 |
1889 | | - |
1890 | case MulticastTtlOption: | - |
1891 | d_func()->socketEngine->setOption(QAbstractSocketEngine::MulticastTtlOption, value.toInt()); executed (the execution status of this line is deduced): d_func()->socketEngine->setOption(QAbstractSocketEngine::MulticastTtlOption, value.toInt()); | - |
1892 | break; executed: break; Execution Count:24 | 24 |
1893 | | - |
1894 | case MulticastLoopbackOption: | - |
1895 | d_func()->socketEngine->setOption(QAbstractSocketEngine::MulticastLoopbackOption, value.toInt()); executed (the execution status of this line is deduced): d_func()->socketEngine->setOption(QAbstractSocketEngine::MulticastLoopbackOption, value.toInt()); | - |
1896 | break; executed: break; Execution Count:28 | 28 |
1897 | | - |
1898 | case TypeOfServiceOption: | - |
1899 | d_func()->socketEngine->setOption(QAbstractSocketEngine::TypeOfServiceOption, value.toInt()); never executed (the execution status of this line is deduced): d_func()->socketEngine->setOption(QAbstractSocketEngine::TypeOfServiceOption, value.toInt()); | - |
1900 | break; | 0 |
1901 | } | - |
1902 | } executed: } Execution Count:790 | 790 |
1903 | | - |
1904 | /*! | - |
1905 | \since 4.6 | - |
1906 | Returns the value of the \a option option. | - |
1907 | | - |
1908 | \sa setSocketOption() | - |
1909 | */ | - |
1910 | QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option) | - |
1911 | { | - |
1912 | if (!d_func()->socketEngine) partially evaluated: !d_func()->socketEngine no Evaluation Count:0 | yes Evaluation Count:52 |
| 0-52 |
1913 | return QVariant(); never executed: return QVariant(); | 0 |
1914 | | - |
1915 | int ret = -1; executed (the execution status of this line is deduced): int ret = -1; | - |
1916 | switch (option) { | - |
1917 | case LowDelayOption: | - |
1918 | ret = d_func()->socketEngine->option(QAbstractSocketEngine::LowDelayOption); never executed (the execution status of this line is deduced): ret = d_func()->socketEngine->option(QAbstractSocketEngine::LowDelayOption); | - |
1919 | break; | 0 |
1920 | | - |
1921 | case KeepAliveOption: | - |
1922 | ret = d_func()->socketEngine->option(QAbstractSocketEngine::KeepAliveOption); never executed (the execution status of this line is deduced): ret = d_func()->socketEngine->option(QAbstractSocketEngine::KeepAliveOption); | - |
1923 | break; | 0 |
1924 | | - |
1925 | case MulticastTtlOption: | - |
1926 | ret = d_func()->socketEngine->option(QAbstractSocketEngine::MulticastTtlOption); executed (the execution status of this line is deduced): ret = d_func()->socketEngine->option(QAbstractSocketEngine::MulticastTtlOption); | - |
1927 | break; executed: break; Execution Count:24 | 24 |
1928 | case MulticastLoopbackOption: | - |
1929 | ret = d_func()->socketEngine->option(QAbstractSocketEngine::MulticastLoopbackOption); executed (the execution status of this line is deduced): ret = d_func()->socketEngine->option(QAbstractSocketEngine::MulticastLoopbackOption); | - |
1930 | break; executed: break; Execution Count:28 | 28 |
1931 | | - |
1932 | case TypeOfServiceOption: | - |
1933 | ret = d_func()->socketEngine->option(QAbstractSocketEngine::TypeOfServiceOption); never executed (the execution status of this line is deduced): ret = d_func()->socketEngine->option(QAbstractSocketEngine::TypeOfServiceOption); | - |
1934 | break; | 0 |
1935 | } | - |
1936 | if (ret == -1) evaluated: ret == -1 yes Evaluation Count:26 | yes Evaluation Count:26 |
| 26 |
1937 | return QVariant(); executed: return QVariant(); Execution Count:26 | 26 |
1938 | else | - |
1939 | return QVariant(ret); executed: return QVariant(ret); Execution Count:26 | 26 |
1940 | } | - |
1941 | | - |
1942 | | - |
1943 | /* | - |
1944 | Returns the difference between msecs and elapsed. If msecs is -1, | - |
1945 | however, -1 is returned. | - |
1946 | */ | - |
1947 | static int qt_timeout_value(int msecs, int elapsed) | - |
1948 | { | - |
1949 | if (msecs == -1) evaluated: msecs == -1 yes Evaluation Count:11192 | yes Evaluation Count:7688 |
| 7688-11192 |
1950 | return -1; executed: return -1; Execution Count:11192 | 11192 |
1951 | | - |
1952 | int timeout = msecs - elapsed; executed (the execution status of this line is deduced): int timeout = msecs - elapsed; | - |
1953 | return timeout < 0 ? 0 : timeout; executed: return timeout < 0 ? 0 : timeout; Execution Count:7688 | 7688 |
1954 | } | - |
1955 | | - |
1956 | /*! | - |
1957 | Waits until the socket is connected, up to \a msecs | - |
1958 | milliseconds. If the connection has been established, this | - |
1959 | function returns true; otherwise it returns false. In the case | - |
1960 | where it returns false, you can call error() to determine | - |
1961 | the cause of the error. | - |
1962 | | - |
1963 | The following example waits up to one second for a connection | - |
1964 | to be established: | - |
1965 | | - |
1966 | \snippet code/src_network_socket_qabstractsocket.cpp 0 | - |
1967 | | - |
1968 | If msecs is -1, this function will not time out. | - |
1969 | | - |
1970 | \note This function may wait slightly longer than \a msecs, | - |
1971 | depending on the time it takes to complete the host lookup. | - |
1972 | | - |
1973 | \note Multiple calls to this functions do not accumulate the time. | - |
1974 | If the function times out, the connecting process will be aborted. | - |
1975 | | - |
1976 | \sa connectToHost(), connected() | - |
1977 | */ | - |
1978 | bool QAbstractSocket::waitForConnected(int msecs) | - |
1979 | { | - |
1980 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
1981 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
1982 | qDebug("QAbstractSocket::waitForConnected(%i)", msecs); | - |
1983 | #endif | - |
1984 | | - |
1985 | if (state() == ConnectedState) { evaluated: state() == ConnectedState yes Evaluation Count:6 | yes Evaluation Count:422 |
| 6-422 |
1986 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
1987 | qDebug("QAbstractSocket::waitForConnected(%i) already connected", msecs); | - |
1988 | #endif | - |
1989 | return true; executed: return true; Execution Count:6 | 6 |
1990 | } | - |
1991 | | - |
1992 | bool wasPendingClose = d->pendingClose; executed (the execution status of this line is deduced): bool wasPendingClose = d->pendingClose; | - |
1993 | d->pendingClose = false; executed (the execution status of this line is deduced): d->pendingClose = false; | - |
1994 | QElapsedTimer stopWatch; executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
1995 | stopWatch.start(); executed (the execution status of this line is deduced): stopWatch.start(); | - |
1996 | | - |
1997 | if (d->state == HostLookupState) { evaluated: d->state == HostLookupState yes Evaluation Count:2 | yes Evaluation Count:420 |
| 2-420 |
1998 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
1999 | qDebug("QAbstractSocket::waitForConnected(%i) doing host name lookup", msecs); | - |
2000 | #endif | - |
2001 | QHostInfo::abortHostLookup(d->hostLookupId); executed (the execution status of this line is deduced): QHostInfo::abortHostLookup(d->hostLookupId); | - |
2002 | d->hostLookupId = -1; executed (the execution status of this line is deduced): d->hostLookupId = -1; | - |
2003 | #ifndef QT_NO_BEARERMANAGEMENT | - |
2004 | QSharedPointer<QNetworkSession> networkSession; executed (the execution status of this line is deduced): QSharedPointer<QNetworkSession> networkSession; | - |
2005 | QVariant v(property("_q_networksession")); executed (the execution status of this line is deduced): QVariant v(property("_q_networksession")); | - |
2006 | if (v.isValid()) { partially evaluated: v.isValid() no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
2007 | networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v); never executed (the execution status of this line is deduced): networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v); | - |
2008 | d->_q_startConnecting(QHostInfoPrivate::fromName(d->hostName, networkSession)); never executed (the execution status of this line is deduced): d->_q_startConnecting(QHostInfoPrivate::fromName(d->hostName, networkSession)); | - |
2009 | } else | 0 |
2010 | #endif | - |
2011 | { | - |
2012 | QHostAddress temp; executed (the execution status of this line is deduced): QHostAddress temp; | - |
2013 | if (temp.setAddress(d->hostName)) { partially evaluated: temp.setAddress(d->hostName) no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
2014 | QHostInfo info; never executed (the execution status of this line is deduced): QHostInfo info; | - |
2015 | info.setAddresses(QList<QHostAddress>() << temp); never executed (the execution status of this line is deduced): info.setAddresses(QList<QHostAddress>() << temp); | - |
2016 | d->_q_startConnecting(info); never executed (the execution status of this line is deduced): d->_q_startConnecting(info); | - |
2017 | } else { | 0 |
2018 | d->_q_startConnecting(QHostInfo::fromName(d->hostName)); executed (the execution status of this line is deduced): d->_q_startConnecting(QHostInfo::fromName(d->hostName)); | - |
2019 | } executed: } Execution Count:2 | 2 |
2020 | } | - |
2021 | } | - |
2022 | if (state() == UnconnectedState) evaluated: state() == UnconnectedState yes Evaluation Count:3 | yes Evaluation Count:419 |
| 3-419 |
2023 | return false; // connect not im progress anymore! executed: return false; Execution Count:3 | 3 |
2024 | | - |
2025 | bool timedOut = true; executed (the execution status of this line is deduced): bool timedOut = true; | - |
2026 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2027 | int attempt = 1; | - |
2028 | #endif | - |
2029 | while (state() == ConnectingState && (msecs == -1 || stopWatch.elapsed() < msecs)) { evaluated: state() == ConnectingState yes Evaluation Count:422 | yes Evaluation Count:419 |
partially evaluated: msecs == -1 no Evaluation Count:0 | yes Evaluation Count:422 |
partially evaluated: stopWatch.elapsed() < msecs yes Evaluation Count:422 | no Evaluation Count:0 |
| 0-422 |
2030 | int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); executed (the execution status of this line is deduced): int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); | - |
2031 | if (msecs != -1 && timeout > QT_CONNECT_TIMEOUT) partially evaluated: msecs != -1 yes Evaluation Count:422 | no Evaluation Count:0 |
partially evaluated: timeout > 30000 no Evaluation Count:0 | yes Evaluation Count:422 |
| 0-422 |
2032 | timeout = QT_CONNECT_TIMEOUT; never executed: timeout = 30000; | 0 |
2033 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2034 | qDebug("QAbstractSocket::waitForConnected(%i) waiting %.2f secs for connection attempt #%i", | - |
2035 | msecs, timeout / 1000.0, attempt++); | - |
2036 | #endif | - |
2037 | timedOut = false; executed (the execution status of this line is deduced): timedOut = false; | - |
2038 | | - |
2039 | if (d->socketEngine && d->socketEngine->waitForWrite(timeout, &timedOut) && !timedOut) { partially evaluated: d->socketEngine yes Evaluation Count:422 | no Evaluation Count:0 |
partially evaluated: d->socketEngine->waitForWrite(timeout, &timedOut) yes Evaluation Count:422 | no Evaluation Count:0 |
partially evaluated: !timedOut yes Evaluation Count:422 | no Evaluation Count:0 |
| 0-422 |
2040 | d->_q_testConnection(); executed (the execution status of this line is deduced): d->_q_testConnection(); | - |
2041 | } else { executed: } Execution Count:422 | 422 |
2042 | d->_q_connectToNextAddress(); never executed (the execution status of this line is deduced): d->_q_connectToNextAddress(); | - |
2043 | } | 0 |
2044 | } | - |
2045 | | - |
2046 | if ((timedOut && state() != ConnectedState) || state() == ConnectingState) { partially evaluated: timedOut no Evaluation Count:0 | yes Evaluation Count:419 |
never evaluated: state() != ConnectedState partially evaluated: state() == ConnectingState no Evaluation Count:0 | yes Evaluation Count:419 |
| 0-419 |
2047 | d->socketError = SocketTimeoutError; never executed (the execution status of this line is deduced): d->socketError = SocketTimeoutError; | - |
2048 | d->state = UnconnectedState; never executed (the execution status of this line is deduced): d->state = UnconnectedState; | - |
2049 | emit stateChanged(d->state); never executed (the execution status of this line is deduced): stateChanged(d->state); | - |
2050 | d->resetSocketLayer(); never executed (the execution status of this line is deduced): d->resetSocketLayer(); | - |
2051 | setErrorString(tr("Socket operation timed out")); never executed (the execution status of this line is deduced): setErrorString(tr("Socket operation timed out")); | - |
2052 | } | 0 |
2053 | | - |
2054 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2055 | qDebug("QAbstractSocket::waitForConnected(%i) == %s", msecs, | - |
2056 | state() == ConnectedState ? "true" : "false"); | - |
2057 | #endif | - |
2058 | if (state() != ConnectedState) evaluated: state() != ConnectedState yes Evaluation Count:3 | yes Evaluation Count:416 |
| 3-416 |
2059 | return false; executed: return false; Execution Count:3 | 3 |
2060 | if (wasPendingClose) partially evaluated: wasPendingClose no Evaluation Count:0 | yes Evaluation Count:416 |
| 0-416 |
2061 | disconnectFromHost(); never executed: disconnectFromHost(); | 0 |
2062 | return true; executed: return true; Execution Count:416 | 416 |
2063 | } | - |
2064 | | - |
2065 | /*! | - |
2066 | This function blocks until new data is available for reading and the | - |
2067 | \l{QIODevice::}{readyRead()} signal has been emitted. The function | - |
2068 | will timeout after \a msecs milliseconds; the default timeout is | - |
2069 | 30000 milliseconds. | - |
2070 | | - |
2071 | The function returns true if the readyRead() signal is emitted and | - |
2072 | there is new data available for reading; otherwise it returns false | - |
2073 | (if an error occurred or the operation timed out). | - |
2074 | | - |
2075 | \sa waitForBytesWritten() | - |
2076 | */ | - |
2077 | bool QAbstractSocket::waitForReadyRead(int msecs) | - |
2078 | { | - |
2079 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2080 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2081 | qDebug("QAbstractSocket::waitForReadyRead(%i)", msecs); | - |
2082 | #endif | - |
2083 | | - |
2084 | // require calling connectToHost() before waitForReadyRead() | - |
2085 | if (state() == UnconnectedState) { evaluated: state() == UnconnectedState yes Evaluation Count:24 | yes Evaluation Count:11873 |
| 24-11873 |
2086 | /* If all you have is a QIODevice pointer to an abstractsocket, you cannot check | - |
2087 | this, so you cannot avoid this warning. */ | - |
2088 | // qWarning("QAbstractSocket::waitForReadyRead() is not allowed in UnconnectedState"); | - |
2089 | return false; executed: return false; Execution Count:24 | 24 |
2090 | } | - |
2091 | | - |
2092 | QElapsedTimer stopWatch; executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
2093 | stopWatch.start(); executed (the execution status of this line is deduced): stopWatch.start(); | - |
2094 | | - |
2095 | // handle a socket in connecting state | - |
2096 | if (state() == HostLookupState || state() == ConnectingState) { evaluated: state() == HostLookupState yes Evaluation Count:1 | yes Evaluation Count:11872 |
evaluated: state() == ConnectingState yes Evaluation Count:81 | yes Evaluation Count:11791 |
| 1-11872 |
2097 | if (!waitForConnected(msecs)) evaluated: !waitForConnected(msecs) yes Evaluation Count:1 | yes Evaluation Count:81 |
| 1-81 |
2098 | return false; executed: return false; Execution Count:1 | 1 |
2099 | } executed: } Execution Count:81 | 81 |
2100 | | - |
2101 | Q_ASSERT(d->socketEngine); executed (the execution status of this line is deduced): qt_noop(); | - |
2102 | do { | - |
2103 | bool readyToRead = false; executed (the execution status of this line is deduced): bool readyToRead = false; | - |
2104 | bool readyToWrite = false; executed (the execution status of this line is deduced): bool readyToWrite = false; | - |
2105 | if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) yes Evaluation Count:11 | yes Evaluation Count:11947 |
| 11-11947 |
2106 | qt_timeout_value(msecs, stopWatch.elapsed()))) { evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) yes Evaluation Count:11 | yes Evaluation Count:11947 |
| 11-11947 |
2107 | d->socketError = d->socketEngine->error(); executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2108 | setErrorString(d->socketEngine->errorString()); executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2109 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2110 | qDebug("QAbstractSocket::waitForReadyRead(%i) failed (%i, %s)", | - |
2111 | msecs, d->socketError, errorString().toLatin1().constData()); | - |
2112 | #endif | - |
2113 | emit error(d->socketError); executed (the execution status of this line is deduced): error(d->socketError); | - |
2114 | if (d->socketError != SocketTimeoutError) partially evaluated: d->socketError != SocketTimeoutError no Evaluation Count:0 | yes Evaluation Count:11 |
| 0-11 |
2115 | close(); | 0 |
2116 | return false; executed: return false; Execution Count:11 | 11 |
2117 | } | - |
2118 | | - |
2119 | if (readyToRead) { evaluated: readyToRead yes Evaluation Count:11861 | yes Evaluation Count:86 |
| 86-11861 |
2120 | if (d->canReadNotification()) evaluated: d->canReadNotification() yes Evaluation Count:11855 | yes Evaluation Count:6 |
| 6-11855 |
2121 | return true; executed: return true; Execution Count:11855 | 11855 |
2122 | } executed: } Execution Count:6 | 6 |
2123 | | - |
2124 | if (readyToWrite) evaluated: readyToWrite yes Evaluation Count:86 | yes Evaluation Count:6 |
| 6-86 |
2125 | d->canWriteNotification(); executed: d->canWriteNotification(); Execution Count:86 | 86 |
2126 | | - |
2127 | if (state() != ConnectedState) evaluated: state() != ConnectedState yes Evaluation Count:6 | yes Evaluation Count:86 |
| 6-86 |
2128 | return false; executed: return false; Execution Count:6 | 6 |
2129 | } while (msecs == -1 || qt_timeout_value(msecs, stopWatch.elapsed()) > 0); executed: } Execution Count:86 partially evaluated: msecs == -1 no Evaluation Count:0 | yes Evaluation Count:86 |
partially evaluated: qt_timeout_value(msecs, stopWatch.elapsed()) > 0 yes Evaluation Count:86 | no Evaluation Count:0 |
| 0-86 |
2130 | return false; never executed: return false; | 0 |
2131 | } | - |
2132 | | - |
2133 | /*! \reimp | - |
2134 | */ | - |
2135 | bool QAbstractSocket::waitForBytesWritten(int msecs) | - |
2136 | { | - |
2137 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2138 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2139 | qDebug("QAbstractSocket::waitForBytesWritten(%i)", msecs); | - |
2140 | #endif | - |
2141 | | - |
2142 | // require calling connectToHost() before waitForBytesWritten() | - |
2143 | if (state() == UnconnectedState) { partially evaluated: state() == UnconnectedState no Evaluation Count:0 | yes Evaluation Count:5126 |
| 0-5126 |
2144 | qWarning("QAbstractSocket::waitForBytesWritten() is not allowed in UnconnectedState"); never executed (the execution status of this line is deduced): QMessageLogger("socket/qabstractsocket.cpp", 2144, __PRETTY_FUNCTION__).warning("QAbstractSocket::waitForBytesWritten() is not allowed in UnconnectedState"); | - |
2145 | return false; never executed: return false; | 0 |
2146 | } | - |
2147 | | - |
2148 | if (d->writeBuffer.isEmpty()) evaluated: d->writeBuffer.isEmpty() yes Evaluation Count:99 | yes Evaluation Count:5027 |
| 99-5027 |
2149 | return false; executed: return false; Execution Count:99 | 99 |
2150 | | - |
2151 | QElapsedTimer stopWatch; executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
2152 | stopWatch.start(); executed (the execution status of this line is deduced): stopWatch.start(); | - |
2153 | | - |
2154 | // handle a socket in connecting state | - |
2155 | if (state() == HostLookupState || state() == ConnectingState) { partially evaluated: state() == HostLookupState no Evaluation Count:0 | yes Evaluation Count:5027 |
partially evaluated: state() == ConnectingState no Evaluation Count:0 | yes Evaluation Count:5027 |
| 0-5027 |
2156 | if (!waitForConnected(msecs)) never evaluated: !waitForConnected(msecs) | 0 |
2157 | return false; never executed: return false; | 0 |
2158 | } | 0 |
2159 | | - |
2160 | forever { executed (the execution status of this line is deduced): for(;;) { | - |
2161 | bool readyToRead = false; executed (the execution status of this line is deduced): bool readyToRead = false; | - |
2162 | bool readyToWrite = false; executed (the execution status of this line is deduced): bool readyToWrite = false; | - |
2163 | if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) yes Evaluation Count:21 | yes Evaluation Count:5006 |
| 21-5006 |
2164 | qt_timeout_value(msecs, stopWatch.elapsed()))) { evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) yes Evaluation Count:21 | yes Evaluation Count:5006 |
| 21-5006 |
2165 | d->socketError = d->socketEngine->error(); executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2166 | setErrorString(d->socketEngine->errorString()); executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2167 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2168 | qDebug("QAbstractSocket::waitForBytesWritten(%i) failed (%i, %s)", | - |
2169 | msecs, d->socketError, errorString().toLatin1().constData()); | - |
2170 | #endif | - |
2171 | emit error(d->socketError); executed (the execution status of this line is deduced): error(d->socketError); | - |
2172 | if (d->socketError != SocketTimeoutError) partially evaluated: d->socketError != SocketTimeoutError no Evaluation Count:0 | yes Evaluation Count:21 |
| 0-21 |
2173 | close(); | 0 |
2174 | return false; executed: return false; Execution Count:21 | 21 |
2175 | } | - |
2176 | | - |
2177 | if (readyToRead) { partially evaluated: readyToRead no Evaluation Count:0 | yes Evaluation Count:5006 |
| 0-5006 |
2178 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2179 | qDebug("QAbstractSocket::waitForBytesWritten calls canReadNotification"); | - |
2180 | #endif | - |
2181 | if(!d->canReadNotification()) never evaluated: !d->canReadNotification() | 0 |
2182 | return false; never executed: return false; | 0 |
2183 | } | 0 |
2184 | | - |
2185 | | - |
2186 | if (readyToWrite) { partially evaluated: readyToWrite yes Evaluation Count:5006 | no Evaluation Count:0 |
| 0-5006 |
2187 | if (d->canWriteNotification()) { partially evaluated: d->canWriteNotification() yes Evaluation Count:5006 | no Evaluation Count:0 |
| 0-5006 |
2188 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2189 | qDebug("QAbstractSocket::waitForBytesWritten returns true"); | - |
2190 | #endif | - |
2191 | return true; executed: return true; Execution Count:5006 | 5006 |
2192 | } | - |
2193 | } | 0 |
2194 | | - |
2195 | if (state() != ConnectedState) never evaluated: state() != ConnectedState | 0 |
2196 | return false; never executed: return false; | 0 |
2197 | } | 0 |
2198 | return false; never executed: return false; | 0 |
2199 | } | - |
2200 | | - |
2201 | /*! | - |
2202 | Waits until the socket has disconnected, up to \a msecs | - |
2203 | milliseconds. If the connection has been disconnected, this | - |
2204 | function returns true; otherwise it returns false. In the case | - |
2205 | where it returns false, you can call error() to determine | - |
2206 | the cause of the error. | - |
2207 | | - |
2208 | The following example waits up to one second for a connection | - |
2209 | to be closed: | - |
2210 | | - |
2211 | \snippet code/src_network_socket_qabstractsocket.cpp 1 | - |
2212 | | - |
2213 | If msecs is -1, this function will not time out. | - |
2214 | | - |
2215 | \sa disconnectFromHost(), close() | - |
2216 | */ | - |
2217 | bool QAbstractSocket::waitForDisconnected(int msecs) | - |
2218 | { | - |
2219 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2220 | | - |
2221 | // require calling connectToHost() before waitForDisconnected() | - |
2222 | if (state() == UnconnectedState) { partially evaluated: state() == UnconnectedState no Evaluation Count:0 | yes Evaluation Count:71 |
| 0-71 |
2223 | qWarning("QAbstractSocket::waitForDisconnected() is not allowed in UnconnectedState"); never executed (the execution status of this line is deduced): QMessageLogger("socket/qabstractsocket.cpp", 2223, __PRETTY_FUNCTION__).warning("QAbstractSocket::waitForDisconnected() is not allowed in UnconnectedState"); | - |
2224 | return false; never executed: return false; | 0 |
2225 | } | - |
2226 | | - |
2227 | QElapsedTimer stopWatch; executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
2228 | stopWatch.start(); executed (the execution status of this line is deduced): stopWatch.start(); | - |
2229 | | - |
2230 | // handle a socket in connecting state | - |
2231 | if (state() == HostLookupState || state() == ConnectingState) { partially evaluated: state() == HostLookupState no Evaluation Count:0 | yes Evaluation Count:71 |
evaluated: state() == ConnectingState yes Evaluation Count:28 | yes Evaluation Count:43 |
| 0-71 |
2232 | if (!waitForConnected(msecs)) partially evaluated: !waitForConnected(msecs) no Evaluation Count:0 | yes Evaluation Count:28 |
| 0-28 |
2233 | return false; never executed: return false; | 0 |
2234 | if (state() == UnconnectedState) partially evaluated: state() == UnconnectedState no Evaluation Count:0 | yes Evaluation Count:28 |
| 0-28 |
2235 | return true; never executed: return true; | 0 |
2236 | } executed: } Execution Count:28 | 28 |
2237 | | - |
2238 | forever { executed (the execution status of this line is deduced): for(;;) { | - |
2239 | bool readyToRead = false; executed (the execution status of this line is deduced): bool readyToRead = false; | - |
2240 | bool readyToWrite = false; executed (the execution status of this line is deduced): bool readyToWrite = false; | - |
2241 | if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState, partially evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) no Evaluation Count:0 | yes Evaluation Count:1388 |
| 0-1388 |
2242 | !d->writeBuffer.isEmpty(), partially evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) no Evaluation Count:0 | yes Evaluation Count:1388 |
| 0-1388 |
2243 | qt_timeout_value(msecs, stopWatch.elapsed()))) { partially evaluated: !d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState, !d->writeBuffer.isEmpty(), qt_timeout_value(msecs, stopWatch.elapsed())) no Evaluation Count:0 | yes Evaluation Count:1388 |
| 0-1388 |
2244 | d->socketError = d->socketEngine->error(); never executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2245 | setErrorString(d->socketEngine->errorString()); never executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2246 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2247 | qDebug("QAbstractSocket::waitForReadyRead(%i) failed (%i, %s)", | - |
2248 | msecs, d->socketError, errorString().toLatin1().constData()); | - |
2249 | #endif | - |
2250 | emit error(d->socketError); never executed (the execution status of this line is deduced): error(d->socketError); | - |
2251 | if (d->socketError != SocketTimeoutError) never evaluated: d->socketError != SocketTimeoutError | 0 |
2252 | close(); | 0 |
2253 | return false; never executed: return false; | 0 |
2254 | } | - |
2255 | | - |
2256 | if (readyToRead) evaluated: readyToRead yes Evaluation Count:1360 | yes Evaluation Count:28 |
| 28-1360 |
2257 | d->canReadNotification(); executed: d->canReadNotification(); Execution Count:1360 | 1360 |
2258 | if (readyToWrite) evaluated: readyToWrite yes Evaluation Count:28 | yes Evaluation Count:1360 |
| 28-1360 |
2259 | d->canWriteNotification(); executed: d->canWriteNotification(); Execution Count:28 | 28 |
2260 | | - |
2261 | if (state() == UnconnectedState) evaluated: state() == UnconnectedState yes Evaluation Count:71 | yes Evaluation Count:1317 |
| 71-1317 |
2262 | return true; executed: return true; Execution Count:71 | 71 |
2263 | } executed: } Execution Count:1317 | 1317 |
2264 | return false; never executed: return false; | 0 |
2265 | } | - |
2266 | | - |
2267 | /*! | - |
2268 | Aborts the current connection and resets the socket. Unlike disconnectFromHost(), | - |
2269 | this function immediately closes the socket, discarding any pending data in the | - |
2270 | write buffer. | - |
2271 | | - |
2272 | \sa disconnectFromHost(), close() | - |
2273 | */ | - |
2274 | void QAbstractSocket::abort() | - |
2275 | { | - |
2276 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2277 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2278 | qDebug("QAbstractSocket::abort()"); | - |
2279 | #endif | - |
2280 | if (d->state == UnconnectedState) evaluated: d->state == UnconnectedState yes Evaluation Count:1 | yes Evaluation Count:1659 |
| 1-1659 |
2281 | return; executed: return; Execution Count:1 | 1 |
2282 | #ifndef QT_NO_SSL | - |
2283 | if (QSslSocket *socket = qobject_cast<QSslSocket *>(this)) { partially evaluated: QSslSocket *socket = qobject_cast<QSslSocket *>(this) no Evaluation Count:0 | yes Evaluation Count:1659 |
| 0-1659 |
2284 | socket->abort(); never executed (the execution status of this line is deduced): socket->abort(); | - |
2285 | return; | 0 |
2286 | } | - |
2287 | #endif | - |
2288 | if (d->connectTimer) { evaluated: d->connectTimer yes Evaluation Count:1107 | yes Evaluation Count:552 |
| 552-1107 |
2289 | d->connectTimer->stop(); executed (the execution status of this line is deduced): d->connectTimer->stop(); | - |
2290 | delete d->connectTimer; executed (the execution status of this line is deduced): delete d->connectTimer; | - |
2291 | d->connectTimer = 0; executed (the execution status of this line is deduced): d->connectTimer = 0; | - |
2292 | } executed: } Execution Count:1107 | 1107 |
2293 | | - |
2294 | d->writeBuffer.clear(); executed (the execution status of this line is deduced): d->writeBuffer.clear(); | - |
2295 | d->abortCalled = true; executed (the execution status of this line is deduced): d->abortCalled = true; | - |
2296 | close(); executed (the execution status of this line is deduced): close(); | - |
2297 | } executed: } Execution Count:1659 | 1659 |
2298 | | - |
2299 | /*! \reimp | - |
2300 | */ | - |
2301 | bool QAbstractSocket::isSequential() const | - |
2302 | { | - |
2303 | return true; executed: return true; Execution Count:1985 | 1985 |
2304 | } | - |
2305 | | - |
2306 | /*! \reimp | - |
2307 | | - |
2308 | Returns true if no more data is currently | - |
2309 | available for reading; otherwise returns false. | - |
2310 | | - |
2311 | This function is most commonly used when reading data from the | - |
2312 | socket in a loop. For example: | - |
2313 | | - |
2314 | \snippet code/src_network_socket_qabstractsocket.cpp 2 | - |
2315 | | - |
2316 | \sa bytesAvailable(), readyRead() | - |
2317 | */ | - |
2318 | bool QAbstractSocket::atEnd() const | - |
2319 | { | - |
2320 | return QIODevice::atEnd() && (!isOpen() || d_func()->buffer.isEmpty()); executed: return QIODevice::atEnd() && (!isOpen() || d_func()->buffer.isEmpty()); Execution Count:278 | 278 |
2321 | } | - |
2322 | | - |
2323 | /*! | - |
2324 | This function writes as much as possible from the internal write buffer to | - |
2325 | the underlying network socket, without blocking. If any data was written, | - |
2326 | this function returns true; otherwise false is returned. | - |
2327 | | - |
2328 | Call this function if you need QAbstractSocket to start sending buffered | - |
2329 | data immediately. The number of bytes successfully written depends on the | - |
2330 | operating system. In most cases, you do not need to call this function, | - |
2331 | because QAbstractSocket will start sending data automatically once control | - |
2332 | goes back to the event loop. In the absence of an event loop, call | - |
2333 | waitForBytesWritten() instead. | - |
2334 | | - |
2335 | \sa write(), waitForBytesWritten() | - |
2336 | */ | - |
2337 | // Note! docs copied to QSslSocket::flush() | - |
2338 | bool QAbstractSocket::flush() | - |
2339 | { | - |
2340 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2341 | #ifndef QT_NO_SSL | - |
2342 | // Manual polymorphism; flush() isn't virtual, but QSslSocket overloads | - |
2343 | // it. | - |
2344 | if (QSslSocket *socket = qobject_cast<QSslSocket *>(this)) partially evaluated: QSslSocket *socket = qobject_cast<QSslSocket *>(this) no Evaluation Count:0 | yes Evaluation Count:12189 |
| 0-12189 |
2345 | return socket->flush(); never executed: return socket->flush(); | 0 |
2346 | #endif | - |
2347 | Q_CHECK_SOCKETENGINE(false); executed: return false; Execution Count:7 executed: } Execution Count:12182 evaluated: !d->socketEngine yes Evaluation Count:7 | yes Evaluation Count:12182 |
partially evaluated: 0 no Evaluation Count:0 | yes Evaluation Count:12182 |
| 0-12182 |
2348 | return d->flush(); executed: return d->flush(); Execution Count:12182 | 12182 |
2349 | } | - |
2350 | | - |
2351 | /*! \reimp | - |
2352 | */ | - |
2353 | qint64 QAbstractSocket::readData(char *data, qint64 maxSize) | - |
2354 | { | - |
2355 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2356 | | - |
2357 | // Check if the read notifier can be enabled again. | - |
2358 | if (d->socketEngine && !d->socketEngine->isReadNotificationEnabled() && d->socketEngine->isValid()) evaluated: d->socketEngine yes Evaluation Count:308803 | yes Evaluation Count:5627 |
evaluated: !d->socketEngine->isReadNotificationEnabled() yes Evaluation Count:6055 | yes Evaluation Count:302748 |
partially evaluated: d->socketEngine->isValid() yes Evaluation Count:6055 | no Evaluation Count:0 |
| 0-308803 |
2359 | d->socketEngine->setReadNotificationEnabled(true); executed: d->socketEngine->setReadNotificationEnabled(true); Execution Count:6055 | 6055 |
2360 | | - |
2361 | if (!maxSize) evaluated: !maxSize yes Evaluation Count:154003 | yes Evaluation Count:160427 |
| 154003-160427 |
2362 | return 0; executed: return 0; Execution Count:154003 | 154003 |
2363 | | - |
2364 | // This is for a buffered QTcpSocket | - |
2365 | if (d->isBuffered && d->buffer.isEmpty()) evaluated: d->isBuffered yes Evaluation Count:24769 | yes Evaluation Count:135658 |
evaluated: d->buffer.isEmpty() yes Evaluation Count:18954 | yes Evaluation Count:5815 |
| 5815-135658 |
2366 | // if we're still connected, return 0 indicating there may be more data in the future | - |
2367 | // if we're not connected, return -1 indicating EOF | - |
2368 | return d->state == QAbstractSocket::ConnectedState ? qint64(0) : qint64(-1); executed: return d->state == QAbstractSocket::ConnectedState ? qint64(0) : qint64(-1); Execution Count:18954 | 18954 |
2369 | | - |
2370 | if (!d->socketEngine) evaluated: !d->socketEngine yes Evaluation Count:2719 | yes Evaluation Count:138754 |
| 2719-138754 |
2371 | return -1; // no socket engine is probably EOF executed: return -1; Execution Count:2719 | 2719 |
2372 | if (!d->socketEngine->isValid()) partially evaluated: !d->socketEngine->isValid() no Evaluation Count:0 | yes Evaluation Count:138754 |
| 0-138754 |
2373 | return -1; // This is for unbuffered TCP when we already had been disconnected never executed: return -1; | 0 |
2374 | if (d->state != QAbstractSocket::ConnectedState) partially evaluated: d->state != QAbstractSocket::ConnectedState no Evaluation Count:0 | yes Evaluation Count:138754 |
| 0-138754 |
2375 | return -1; // This is for unbuffered TCP if we're not connected yet never executed: return -1; | 0 |
2376 | qint64 readBytes = d->socketEngine->read(data, maxSize); executed (the execution status of this line is deduced): qint64 readBytes = d->socketEngine->read(data, maxSize); | - |
2377 | if (readBytes == -2) { evaluated: readBytes == -2 yes Evaluation Count:5263 | yes Evaluation Count:133491 |
| 5263-133491 |
2378 | // -2 from the engine means no bytes available (EAGAIN) so read more later | - |
2379 | return 0; executed: return 0; Execution Count:5263 | 5263 |
2380 | } else if (readBytes < 0) { evaluated: readBytes < 0 yes Evaluation Count:128 | yes Evaluation Count:133363 |
| 128-133363 |
2381 | d->socketError = d->socketEngine->error(); executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2382 | setErrorString(d->socketEngine->errorString()); executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2383 | d->resetSocketLayer(); executed (the execution status of this line is deduced): d->resetSocketLayer(); | - |
2384 | d->state = QAbstractSocket::UnconnectedState; executed (the execution status of this line is deduced): d->state = QAbstractSocket::UnconnectedState; | - |
2385 | } else if (!d->socketEngine->isReadNotificationEnabled()) { executed: } Execution Count:128 partially evaluated: !d->socketEngine->isReadNotificationEnabled() no Evaluation Count:0 | yes Evaluation Count:133363 |
| 0-133363 |
2386 | // Only do this when there was no error | - |
2387 | d->socketEngine->setReadNotificationEnabled(true); never executed (the execution status of this line is deduced): d->socketEngine->setReadNotificationEnabled(true); | - |
2388 | } | 0 |
2389 | | - |
2390 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2391 | qDebug("QAbstractSocket::readData(%p \"%s\", %lli) == %lld [engine]", | - |
2392 | data, qt_prettyDebug(data, 32, readBytes).data(), maxSize, | - |
2393 | readBytes); | - |
2394 | #endif | - |
2395 | return readBytes; executed: return readBytes; Execution Count:133491 | 133491 |
2396 | | - |
2397 | } | - |
2398 | | - |
2399 | /*! \reimp | - |
2400 | */ | - |
2401 | qint64 QAbstractSocket::readLineData(char *data, qint64 maxlen) | - |
2402 | { | - |
2403 | return QIODevice::readLineData(data, maxlen); executed: return QIODevice::readLineData(data, maxlen); Execution Count:4 | 4 |
2404 | } | - |
2405 | | - |
2406 | /*! \reimp | - |
2407 | */ | - |
2408 | qint64 QAbstractSocket::writeData(const char *data, qint64 size) | - |
2409 | { | - |
2410 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2411 | if (d->state == QAbstractSocket::UnconnectedState) { evaluated: d->state == QAbstractSocket::UnconnectedState yes Evaluation Count:6 | yes Evaluation Count:1297023 |
| 6-1297023 |
2412 | d->socketError = QAbstractSocket::UnknownSocketError; executed (the execution status of this line is deduced): d->socketError = QAbstractSocket::UnknownSocketError; | - |
2413 | setErrorString(tr("Socket is not connected")); executed (the execution status of this line is deduced): setErrorString(tr("Socket is not connected")); | - |
2414 | return -1; executed: return -1; Execution Count:6 | 6 |
2415 | } | - |
2416 | | - |
2417 | if (!d->isBuffered && d->socketType == TcpSocket && d->writeBuffer.isEmpty()) { evaluated: !d->isBuffered yes Evaluation Count:1273904 | yes Evaluation Count:23119 |
evaluated: d->socketType == TcpSocket yes Evaluation Count:1884 | yes Evaluation Count:1272020 |
evaluated: d->writeBuffer.isEmpty() yes Evaluation Count:784 | yes Evaluation Count:1100 |
| 784-1273904 |
2418 | // This code is for the new Unbuffered QTcpSocket use case | - |
2419 | qint64 written = d->socketEngine->write(data, size); executed (the execution status of this line is deduced): qint64 written = d->socketEngine->write(data, size); | - |
2420 | if (written < 0) { partially evaluated: written < 0 no Evaluation Count:0 | yes Evaluation Count:784 |
| 0-784 |
2421 | d->socketError = d->socketEngine->error(); never executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2422 | setErrorString(d->socketEngine->errorString()); never executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2423 | return written; never executed: return written; | 0 |
2424 | } else if (written < size) { evaluated: written < size yes Evaluation Count:45 | yes Evaluation Count:739 |
| 45-739 |
2425 | // Buffer what was not written yet | - |
2426 | char *ptr = d->writeBuffer.reserve(size - written); executed (the execution status of this line is deduced): char *ptr = d->writeBuffer.reserve(size - written); | - |
2427 | memcpy(ptr, data + written, size - written); executed (the execution status of this line is deduced): memcpy(ptr, data + written, size - written); | - |
2428 | if (d->socketEngine) partially evaluated: d->socketEngine yes Evaluation Count:45 | no Evaluation Count:0 |
| 0-45 |
2429 | d->socketEngine->setWriteNotificationEnabled(true); executed: d->socketEngine->setWriteNotificationEnabled(true); Execution Count:45 | 45 |
2430 | } executed: } Execution Count:45 | 45 |
2431 | return size; // size=actually written + what has been buffered executed: return size; Execution Count:784 | 784 |
2432 | } else if (!d->isBuffered && d->socketType != TcpSocket) { evaluated: !d->isBuffered yes Evaluation Count:1273120 | yes Evaluation Count:23119 |
evaluated: d->socketType != TcpSocket yes Evaluation Count:1272020 | yes Evaluation Count:1100 |
| 1100-1273120 |
2433 | // This is for a QUdpSocket that was connect()ed | - |
2434 | qint64 written = d->socketEngine->write(data, size); executed (the execution status of this line is deduced): qint64 written = d->socketEngine->write(data, size); | - |
2435 | if (written < 0) { partially evaluated: written < 0 no Evaluation Count:0 | yes Evaluation Count:1272020 |
| 0-1272020 |
2436 | d->socketError = d->socketEngine->error(); never executed (the execution status of this line is deduced): d->socketError = d->socketEngine->error(); | - |
2437 | setErrorString(d->socketEngine->errorString()); never executed (the execution status of this line is deduced): setErrorString(d->socketEngine->errorString()); | - |
2438 | } else if (!d->writeBuffer.isEmpty()) { never executed: } partially evaluated: !d->writeBuffer.isEmpty() no Evaluation Count:0 | yes Evaluation Count:1272020 |
| 0-1272020 |
2439 | d->socketEngine->setWriteNotificationEnabled(true); never executed (the execution status of this line is deduced): d->socketEngine->setWriteNotificationEnabled(true); | - |
2440 | } | 0 |
2441 | | - |
2442 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2443 | qDebug("QAbstractSocket::writeData(%p \"%s\", %lli) == %lli", data, | - |
2444 | qt_prettyDebug(data, qMin((int)size, 32), size).data(), | - |
2445 | size, written); | - |
2446 | #endif | - |
2447 | if (written >= 0) partially evaluated: written >= 0 yes Evaluation Count:1272020 | no Evaluation Count:0 |
| 0-1272020 |
2448 | emit bytesWritten(written); executed: bytesWritten(written); Execution Count:1272020 | 1272020 |
2449 | return written; executed: return written; Execution Count:1272020 | 1272020 |
2450 | } | - |
2451 | | - |
2452 | // This is the code path for normal buffered QTcpSocket or | - |
2453 | // unbuffered QTcpSocket when there was already something in the | - |
2454 | // write buffer and therefore we could not do a direct engine write. | - |
2455 | // We just write to our write buffer and enable the write notifier | - |
2456 | // The write notifier then flush()es the buffer. | - |
2457 | | - |
2458 | char *ptr = d->writeBuffer.reserve(size); executed (the execution status of this line is deduced): char *ptr = d->writeBuffer.reserve(size); | - |
2459 | if (size == 1) evaluated: size == 1 yes Evaluation Count:11226 | yes Evaluation Count:12993 |
| 11226-12993 |
2460 | *ptr = *data; executed: *ptr = *data; Execution Count:11226 | 11226 |
2461 | else | - |
2462 | memcpy(ptr, data, size); executed: memcpy(ptr, data, size); Execution Count:12993 | 12993 |
2463 | | - |
2464 | qint64 written = size; executed (the execution status of this line is deduced): qint64 written = size; | - |
2465 | | - |
2466 | if (d->socketEngine && !d->writeBuffer.isEmpty()) partially evaluated: d->socketEngine yes Evaluation Count:24219 | no Evaluation Count:0 |
evaluated: !d->writeBuffer.isEmpty() yes Evaluation Count:24206 | yes Evaluation Count:13 |
| 0-24219 |
2467 | d->socketEngine->setWriteNotificationEnabled(true); executed: d->socketEngine->setWriteNotificationEnabled(true); Execution Count:24206 | 24206 |
2468 | | - |
2469 | #if defined (QABSTRACTSOCKET_DEBUG) | - |
2470 | qDebug("QAbstractSocket::writeData(%p \"%s\", %lli) == %lli", data, | - |
2471 | qt_prettyDebug(data, qMin((int)size, 32), size).data(), | - |
2472 | size, written); | - |
2473 | #endif | - |
2474 | return written; executed: return written; Execution Count:24219 | 24219 |
2475 | } | - |
2476 | | - |
2477 | /*! | - |
2478 | \since 4.1 | - |
2479 | | - |
2480 | Sets the port on the local side of a connection to \a port. | - |
2481 | | - |
2482 | You can call this function in a subclass of QAbstractSocket to | - |
2483 | change the return value of the localPort() function after a | - |
2484 | connection has been established. This feature is commonly used by | - |
2485 | proxy connections for virtual connection settings. | - |
2486 | | - |
2487 | Note that this function does not bind the local port of the socket | - |
2488 | prior to a connection (e.g., QAbstractSocket::bind()). | - |
2489 | | - |
2490 | \sa localAddress(), setLocalAddress(), setPeerPort() | - |
2491 | */ | - |
2492 | void QAbstractSocket::setLocalPort(quint16 port) | - |
2493 | { | - |
2494 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2495 | d->localPort = port; executed (the execution status of this line is deduced): d->localPort = port; | - |
2496 | } executed: } Execution Count:229 | 229 |
2497 | | - |
2498 | /*! | - |
2499 | \since 4.1 | - |
2500 | | - |
2501 | Sets the address on the local side of a connection to | - |
2502 | \a address. | - |
2503 | | - |
2504 | You can call this function in a subclass of QAbstractSocket to | - |
2505 | change the return value of the localAddress() function after a | - |
2506 | connection has been established. This feature is commonly used by | - |
2507 | proxy connections for virtual connection settings. | - |
2508 | | - |
2509 | Note that this function does not bind the local address of the socket | - |
2510 | prior to a connection (e.g., QAbstractSocket::bind()). | - |
2511 | | - |
2512 | \sa localAddress(), setLocalPort(), setPeerAddress() | - |
2513 | */ | - |
2514 | void QAbstractSocket::setLocalAddress(const QHostAddress &address) | - |
2515 | { | - |
2516 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2517 | d->localAddress = address; executed (the execution status of this line is deduced): d->localAddress = address; | - |
2518 | } executed: } Execution Count:227 | 227 |
2519 | | - |
2520 | /*! | - |
2521 | \since 4.1 | - |
2522 | | - |
2523 | Sets the port of the remote side of the connection to | - |
2524 | \a port. | - |
2525 | | - |
2526 | You can call this function in a subclass of QAbstractSocket to | - |
2527 | change the return value of the peerPort() function after a | - |
2528 | connection has been established. This feature is commonly used by | - |
2529 | proxy connections for virtual connection settings. | - |
2530 | | - |
2531 | \sa peerPort(), setPeerAddress(), setLocalPort() | - |
2532 | */ | - |
2533 | void QAbstractSocket::setPeerPort(quint16 port) | - |
2534 | { | - |
2535 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2536 | d->peerPort = port; executed (the execution status of this line is deduced): d->peerPort = port; | - |
2537 | } executed: } Execution Count:229 | 229 |
2538 | | - |
2539 | /*! | - |
2540 | \since 4.1 | - |
2541 | | - |
2542 | Sets the address of the remote side of the connection | - |
2543 | to \a address. | - |
2544 | | - |
2545 | You can call this function in a subclass of QAbstractSocket to | - |
2546 | change the return value of the peerAddress() function after a | - |
2547 | connection has been established. This feature is commonly used by | - |
2548 | proxy connections for virtual connection settings. | - |
2549 | | - |
2550 | \sa peerAddress(), setPeerPort(), setLocalAddress() | - |
2551 | */ | - |
2552 | void QAbstractSocket::setPeerAddress(const QHostAddress &address) | - |
2553 | { | - |
2554 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2555 | d->peerAddress = address; executed (the execution status of this line is deduced): d->peerAddress = address; | - |
2556 | } executed: } Execution Count:227 | 227 |
2557 | | - |
2558 | /*! | - |
2559 | \since 4.1 | - |
2560 | | - |
2561 | Sets the host name of the remote peer to \a name. | - |
2562 | | - |
2563 | You can call this function in a subclass of QAbstractSocket to | - |
2564 | change the return value of the peerName() function after a | - |
2565 | connection has been established. This feature is commonly used by | - |
2566 | proxy connections for virtual connection settings. | - |
2567 | | - |
2568 | \sa peerName() | - |
2569 | */ | - |
2570 | void QAbstractSocket::setPeerName(const QString &name) | - |
2571 | { | - |
2572 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2573 | d->peerName = name; executed (the execution status of this line is deduced): d->peerName = name; | - |
2574 | } executed: } Execution Count:227 | 227 |
2575 | | - |
2576 | /*! | - |
2577 | Closes the I/O device for the socket, disconnects the socket's connection with the | - |
2578 | host, closes the socket, and resets the name, address, port number and underlying | - |
2579 | socket descriptor. | - |
2580 | | - |
2581 | See QIODevice::close() for a description of the actions that occur when an I/O | - |
2582 | device is closed. | - |
2583 | | - |
2584 | \sa abort() | - |
2585 | */ | - |
2586 | void QAbstractSocket::close() | - |
2587 | { | - |
2588 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2589 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2590 | qDebug("QAbstractSocket::close()"); | - |
2591 | #endif | - |
2592 | QIODevice::close(); executed (the execution status of this line is deduced): QIODevice::close(); | - |
2593 | if (d->state != UnconnectedState) { evaluated: d->state != UnconnectedState yes Evaluation Count:2637 | yes Evaluation Count:563 |
| 563-2637 |
2594 | d->closeCalled = true; executed (the execution status of this line is deduced): d->closeCalled = true; | - |
2595 | disconnectFromHost(); executed (the execution status of this line is deduced): disconnectFromHost(); | - |
2596 | } executed: } Execution Count:2637 | 2637 |
2597 | | - |
2598 | d->localPort = 0; executed (the execution status of this line is deduced): d->localPort = 0; | - |
2599 | d->peerPort = 0; executed (the execution status of this line is deduced): d->peerPort = 0; | - |
2600 | d->localAddress.clear(); executed (the execution status of this line is deduced): d->localAddress.clear(); | - |
2601 | d->peerAddress.clear(); executed (the execution status of this line is deduced): d->peerAddress.clear(); | - |
2602 | d->peerName.clear(); executed (the execution status of this line is deduced): d->peerName.clear(); | - |
2603 | d->cachedSocketDescriptor = -1; executed (the execution status of this line is deduced): d->cachedSocketDescriptor = -1; | - |
2604 | } executed: } Execution Count:3200 | 3200 |
2605 | | - |
2606 | /*! | - |
2607 | Attempts to close the socket. If there is pending data waiting to | - |
2608 | be written, QAbstractSocket will enter ClosingState and wait | - |
2609 | until all data has been written. Eventually, it will enter | - |
2610 | UnconnectedState and emit the disconnected() signal. | - |
2611 | | - |
2612 | \sa connectToHost() | - |
2613 | */ | - |
2614 | void QAbstractSocket::disconnectFromHost() | - |
2615 | { | - |
2616 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2617 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2618 | qDebug("QAbstractSocket::disconnectFromHost()"); | - |
2619 | #endif | - |
2620 | | - |
2621 | if (d->state == UnconnectedState) { evaluated: d->state == UnconnectedState yes Evaluation Count:6 | yes Evaluation Count:3168 |
| 6-3168 |
2622 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2623 | qDebug("QAbstractSocket::disconnectFromHost() was called on an unconnected socket"); | - |
2624 | #endif | - |
2625 | return; executed: return; Execution Count:6 | 6 |
2626 | } | - |
2627 | | - |
2628 | if (!d->abortCalled && (d->state == ConnectingState || d->state == HostLookupState)) { evaluated: !d->abortCalled yes Evaluation Count:1509 | yes Evaluation Count:1659 |
evaluated: d->state == ConnectingState yes Evaluation Count:3 | yes Evaluation Count:1506 |
partially evaluated: d->state == HostLookupState no Evaluation Count:0 | yes Evaluation Count:1506 |
| 0-1659 |
2629 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2630 | qDebug("QAbstractSocket::disconnectFromHost() but we're still connecting"); | - |
2631 | #endif | - |
2632 | d->pendingClose = true; executed (the execution status of this line is deduced): d->pendingClose = true; | - |
2633 | return; executed: return; Execution Count:3 | 3 |
2634 | } | - |
2635 | | - |
2636 | // Disable and delete read notification | - |
2637 | if (d->socketEngine) evaluated: d->socketEngine yes Evaluation Count:2842 | yes Evaluation Count:323 |
| 323-2842 |
2638 | d->socketEngine->setReadNotificationEnabled(false); executed: d->socketEngine->setReadNotificationEnabled(false); Execution Count:2842 | 2842 |
2639 | | - |
2640 | if (d->abortCalled) { evaluated: d->abortCalled yes Evaluation Count:1659 | yes Evaluation Count:1506 |
| 1506-1659 |
2641 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2642 | qDebug("QAbstractSocket::disconnectFromHost() aborting immediately"); | - |
2643 | #endif | - |
2644 | if (d->state == HostLookupState) { evaluated: d->state == HostLookupState yes Evaluation Count:118 | yes Evaluation Count:1541 |
| 118-1541 |
2645 | QHostInfo::abortHostLookup(d->hostLookupId); executed (the execution status of this line is deduced): QHostInfo::abortHostLookup(d->hostLookupId); | - |
2646 | d->hostLookupId = -1; executed (the execution status of this line is deduced): d->hostLookupId = -1; | - |
2647 | } executed: } Execution Count:118 | 118 |
2648 | } else { executed: } Execution Count:1659 | 1659 |
2649 | // Perhaps emit closing() | - |
2650 | if (d->state != ClosingState) { evaluated: d->state != ClosingState yes Evaluation Count:1362 | yes Evaluation Count:144 |
| 144-1362 |
2651 | d->state = ClosingState; executed (the execution status of this line is deduced): d->state = ClosingState; | - |
2652 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2653 | qDebug("QAbstractSocket::disconnectFromHost() emits stateChanged()(ClosingState)"); | - |
2654 | #endif | - |
2655 | emit stateChanged(d->state); executed (the execution status of this line is deduced): stateChanged(d->state); | - |
2656 | } else { executed: } Execution Count:1362 | 1362 |
2657 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2658 | qDebug("QAbstractSocket::disconnectFromHost() return from delayed close"); | - |
2659 | #endif | - |
2660 | } executed: } Execution Count:144 | 144 |
2661 | | - |
2662 | // Wait for pending data to be written. | - |
2663 | if (d->socketEngine && d->socketEngine->isValid() && (d->writeBuffer.size() > 0 evaluated: d->socketEngine yes Evaluation Count:1301 | yes Evaluation Count:205 |
partially evaluated: d->socketEngine->isValid() yes Evaluation Count:1301 | no Evaluation Count:0 |
evaluated: d->writeBuffer.size() > 0 yes Evaluation Count:147 | yes Evaluation Count:1154 |
| 0-1301 |
2664 | || d->socketEngine->bytesToWrite() > 0)) { partially evaluated: d->socketEngine->bytesToWrite() > 0 no Evaluation Count:0 | yes Evaluation Count:1154 |
| 0-1154 |
2665 | // hack: when we are waiting for the socket engine to write bytes (only | - |
2666 | // possible when using Socks5 or HTTP socket engine), then close | - |
2667 | // anyway after 2 seconds. This is to prevent a timeout on Mac, where we | - |
2668 | // sometimes just did not get the write notifier from the underlying | - |
2669 | // CFSocket and no progress was made. | - |
2670 | if (d->writeBuffer.size() == 0 && d->socketEngine->bytesToWrite() > 0) { partially evaluated: d->writeBuffer.size() == 0 no Evaluation Count:0 | yes Evaluation Count:147 |
never evaluated: d->socketEngine->bytesToWrite() > 0 | 0-147 |
2671 | if (!d->disconnectTimer) { never evaluated: !d->disconnectTimer | 0 |
2672 | d->disconnectTimer = new QTimer(this); never executed (the execution status of this line is deduced): d->disconnectTimer = new QTimer(this); | - |
2673 | connect(d->disconnectTimer, SIGNAL(timeout()), this, never executed (the execution status of this line is deduced): connect(d->disconnectTimer, "2""timeout()", this, | - |
2674 | SLOT(_q_forceDisconnect()), Qt::DirectConnection); never executed (the execution status of this line is deduced): "1""_q_forceDisconnect()", Qt::DirectConnection); | - |
2675 | } | 0 |
2676 | if (!d->disconnectTimer->isActive()) never evaluated: !d->disconnectTimer->isActive() | 0 |
2677 | d->disconnectTimer->start(2000); never executed: d->disconnectTimer->start(2000); | 0 |
2678 | } | 0 |
2679 | d->socketEngine->setWriteNotificationEnabled(true); executed (the execution status of this line is deduced): d->socketEngine->setWriteNotificationEnabled(true); | - |
2680 | | - |
2681 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2682 | qDebug("QAbstractSocket::disconnectFromHost() delaying disconnect"); | - |
2683 | #endif | - |
2684 | return; executed: return; Execution Count:147 | 147 |
2685 | } else { | - |
2686 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2687 | qDebug("QAbstractSocket::disconnectFromHost() disconnecting immediately"); | - |
2688 | #endif | - |
2689 | } executed: } Execution Count:1359 | 1359 |
2690 | } | - |
2691 | | - |
2692 | SocketState previousState = d->state; executed (the execution status of this line is deduced): SocketState previousState = d->state; | - |
2693 | d->resetSocketLayer(); executed (the execution status of this line is deduced): d->resetSocketLayer(); | - |
2694 | d->state = UnconnectedState; executed (the execution status of this line is deduced): d->state = UnconnectedState; | - |
2695 | emit stateChanged(d->state); executed (the execution status of this line is deduced): stateChanged(d->state); | - |
2696 | emit readChannelFinished(); // we got an EOF executed (the execution status of this line is deduced): readChannelFinished(); | - |
2697 | | - |
2698 | // only emit disconnected if we were connected before | - |
2699 | if (previousState == ConnectedState || previousState == ClosingState) evaluated: previousState == ConnectedState yes Evaluation Count:422 | yes Evaluation Count:2596 |
evaluated: previousState == ClosingState yes Evaluation Count:1362 | yes Evaluation Count:1234 |
| 422-2596 |
2700 | emit disconnected(); executed: disconnected(); Execution Count:1784 | 1784 |
2701 | | - |
2702 | d->localPort = 0; executed (the execution status of this line is deduced): d->localPort = 0; | - |
2703 | d->peerPort = 0; executed (the execution status of this line is deduced): d->peerPort = 0; | - |
2704 | d->localAddress.clear(); executed (the execution status of this line is deduced): d->localAddress.clear(); | - |
2705 | d->peerAddress.clear(); executed (the execution status of this line is deduced): d->peerAddress.clear(); | - |
2706 | | - |
2707 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2708 | qDebug("QAbstractSocket::disconnectFromHost() disconnected!"); | - |
2709 | #endif | - |
2710 | | - |
2711 | if (d->closeCalled) { evaluated: d->closeCalled yes Evaluation Count:2629 | yes Evaluation Count:389 |
| 389-2629 |
2712 | #if defined(QABSTRACTSOCKET_DEBUG) | - |
2713 | qDebug("QAbstractSocket::disconnectFromHost() closed!"); | - |
2714 | #endif | - |
2715 | d->buffer.clear(); executed (the execution status of this line is deduced): d->buffer.clear(); | - |
2716 | d->writeBuffer.clear(); executed (the execution status of this line is deduced): d->writeBuffer.clear(); | - |
2717 | QIODevice::close(); executed (the execution status of this line is deduced): QIODevice::close(); | - |
2718 | } executed: } Execution Count:2629 | 2629 |
2719 | } executed: } Execution Count:3018 | 3018 |
2720 | | - |
2721 | /*! | - |
2722 | Returns the size of the internal read buffer. This limits the | - |
2723 | amount of data that the client can receive before you call read() | - |
2724 | or readAll(). | - |
2725 | | - |
2726 | A read buffer size of 0 (the default) means that the buffer has | - |
2727 | no size limit, ensuring that no data is lost. | - |
2728 | | - |
2729 | \sa setReadBufferSize(), read() | - |
2730 | */ | - |
2731 | qint64 QAbstractSocket::readBufferSize() const | - |
2732 | { | - |
2733 | return d_func()->readBufferMaxSize; executed: return d_func()->readBufferMaxSize; Execution Count:19 | 19 |
2734 | } | - |
2735 | | - |
2736 | /*! | - |
2737 | Sets the size of QAbstractSocket's internal read buffer to be \a | - |
2738 | size bytes. | - |
2739 | | - |
2740 | If the buffer size is limited to a certain size, QAbstractSocket | - |
2741 | won't buffer more than this size of data. Exceptionally, a buffer | - |
2742 | size of 0 means that the read buffer is unlimited and all | - |
2743 | incoming data is buffered. This is the default. | - |
2744 | | - |
2745 | This option is useful if you only read the data at certain points | - |
2746 | in time (e.g., in a real-time streaming application) or if you | - |
2747 | want to protect your socket against receiving too much data, | - |
2748 | which may eventually cause your application to run out of memory. | - |
2749 | | - |
2750 | Only QTcpSocket uses QAbstractSocket's internal buffer; QUdpSocket | - |
2751 | does not use any buffering at all, but rather relies on the | - |
2752 | implicit buffering provided by the operating system. | - |
2753 | Because of this, calling this function on QUdpSocket has no | - |
2754 | effect. | - |
2755 | | - |
2756 | \sa readBufferSize(), read() | - |
2757 | */ | - |
2758 | void QAbstractSocket::setReadBufferSize(qint64 size) | - |
2759 | { | - |
2760 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2761 | | - |
2762 | if (d->readBufferMaxSize == size) evaluated: d->readBufferMaxSize == size yes Evaluation Count:292 | yes Evaluation Count:604 |
| 292-604 |
2763 | return; executed: return; Execution Count:292 | 292 |
2764 | d->readBufferMaxSize = size; executed (the execution status of this line is deduced): d->readBufferMaxSize = size; | - |
2765 | if (!d->readSocketNotifierCalled && d->socketEngine) { partially evaluated: !d->readSocketNotifierCalled yes Evaluation Count:604 | no Evaluation Count:0 |
evaluated: d->socketEngine yes Evaluation Count:535 | yes Evaluation Count:69 |
| 0-604 |
2766 | // ensure that the read notification is enabled if we've now got | - |
2767 | // room in the read buffer | - |
2768 | // but only if we're not inside canReadNotification -- that will take care on its own | - |
2769 | if ((size == 0 || d->buffer.size() < size) && d->state == QAbstractSocket::ConnectedState) // Do not change the notifier unless we are connected. evaluated: size == 0 yes Evaluation Count:2 | yes Evaluation Count:533 |
partially evaluated: d->buffer.size() < size yes Evaluation Count:533 | no Evaluation Count:0 |
evaluated: d->state == QAbstractSocket::ConnectedState yes Evaluation Count:4 | yes Evaluation Count:531 |
| 0-533 |
2770 | d->socketEngine->setReadNotificationEnabled(true); executed: d->socketEngine->setReadNotificationEnabled(true); Execution Count:4 | 4 |
2771 | } executed: } Execution Count:535 | 535 |
2772 | } executed: } Execution Count:604 | 604 |
2773 | | - |
2774 | /*! | - |
2775 | Returns the state of the socket. | - |
2776 | | - |
2777 | \sa error() | - |
2778 | */ | - |
2779 | QAbstractSocket::SocketState QAbstractSocket::state() const | - |
2780 | { | - |
2781 | return d_func()->state; executed: return d_func()->state; Execution Count:431140 | 431140 |
2782 | } | - |
2783 | | - |
2784 | /*! | - |
2785 | Sets the state of the socket to \a state. | - |
2786 | | - |
2787 | \sa state() | - |
2788 | */ | - |
2789 | void QAbstractSocket::setSocketState(SocketState state) | - |
2790 | { | - |
2791 | d_func()->state = state; executed (the execution status of this line is deduced): d_func()->state = state; | - |
2792 | } executed: } Execution Count:830 | 830 |
2793 | | - |
2794 | /*! | - |
2795 | Returns the socket type (TCP, UDP, or other). | - |
2796 | | - |
2797 | \sa QTcpSocket, QUdpSocket | - |
2798 | */ | - |
2799 | QAbstractSocket::SocketType QAbstractSocket::socketType() const | - |
2800 | { | - |
2801 | return d_func()->socketType; executed: return d_func()->socketType; Execution Count:4930 | 4930 |
2802 | } | - |
2803 | | - |
2804 | /*! | - |
2805 | Returns the type of error that last occurred. | - |
2806 | | - |
2807 | \sa state(), errorString() | - |
2808 | */ | - |
2809 | QAbstractSocket::SocketError QAbstractSocket::error() const | - |
2810 | { | - |
2811 | return d_func()->socketError; executed: return d_func()->socketError; Execution Count:145 | 145 |
2812 | } | - |
2813 | | - |
2814 | /*! | - |
2815 | Sets the type of error that last occurred to \a socketError. | - |
2816 | | - |
2817 | \sa setSocketState(), setErrorString() | - |
2818 | */ | - |
2819 | void QAbstractSocket::setSocketError(SocketError socketError) | - |
2820 | { | - |
2821 | d_func()->socketError = socketError; executed (the execution status of this line is deduced): d_func()->socketError = socketError; | - |
2822 | } executed: } Execution Count:176 | 176 |
2823 | | - |
2824 | #ifndef QT_NO_NETWORKPROXY | - |
2825 | /*! | - |
2826 | \since 4.1 | - |
2827 | | - |
2828 | Sets the explicit network proxy for this socket to \a networkProxy. | - |
2829 | | - |
2830 | To disable the use of a proxy for this socket, use the | - |
2831 | QNetworkProxy::NoProxy proxy type: | - |
2832 | | - |
2833 | \snippet code/src_network_socket_qabstractsocket.cpp 3 | - |
2834 | | - |
2835 | The default value for the proxy is QNetworkProxy::DefaultProxy, | - |
2836 | which means the socket will use the application settings: if a | - |
2837 | proxy is set with QNetworkProxy::setApplicationProxy, it will use | - |
2838 | that; otherwise, if a factory is set with | - |
2839 | QNetworkProxyFactory::setApplicationProxyFactory, it will query | - |
2840 | that factory with type QNetworkProxyQuery::TcpSocket. | - |
2841 | | - |
2842 | \sa proxy(), QNetworkProxy, QNetworkProxyFactory::queryProxy() | - |
2843 | */ | - |
2844 | void QAbstractSocket::setProxy(const QNetworkProxy &networkProxy) | - |
2845 | { | - |
2846 | Q_D(QAbstractSocket); executed (the execution status of this line is deduced): QAbstractSocketPrivate * const d = d_func(); | - |
2847 | d->proxy = networkProxy; executed (the execution status of this line is deduced): d->proxy = networkProxy; | - |
2848 | } executed: } Execution Count:976 | 976 |
2849 | | - |
2850 | /*! | - |
2851 | \since 4.1 | - |
2852 | | - |
2853 | Returns the network proxy for this socket. | - |
2854 | By default QNetworkProxy::DefaultProxy is used, which means this | - |
2855 | socket will query the default proxy settings for the application. | - |
2856 | | - |
2857 | \sa setProxy(), QNetworkProxy, QNetworkProxyFactory | - |
2858 | */ | - |
2859 | QNetworkProxy QAbstractSocket::proxy() const | - |
2860 | { | - |
2861 | Q_D(const QAbstractSocket); executed (the execution status of this line is deduced): const QAbstractSocketPrivate * const d = d_func(); | - |
2862 | return d->proxy; executed: return d->proxy; Execution Count:2475 | 2475 |
2863 | } | - |
2864 | #endif // QT_NO_NETWORKPROXY | - |
2865 | | - |
2866 | #ifndef QT_NO_DEBUG_STREAM | - |
2867 | Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, QAbstractSocket::SocketError error) | - |
2868 | { | - |
2869 | switch (error) { | - |
2870 | case QAbstractSocket::ConnectionRefusedError: | - |
2871 | debug << "QAbstractSocket::ConnectionRefusedError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ConnectionRefusedError"; | - |
2872 | break; | 0 |
2873 | case QAbstractSocket::RemoteHostClosedError: | - |
2874 | debug << "QAbstractSocket::RemoteHostClosedError"; executed (the execution status of this line is deduced): debug << "QAbstractSocket::RemoteHostClosedError"; | - |
2875 | break; executed: break; Execution Count:23 | 23 |
2876 | case QAbstractSocket::HostNotFoundError: | - |
2877 | debug << "QAbstractSocket::HostNotFoundError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::HostNotFoundError"; | - |
2878 | break; | 0 |
2879 | case QAbstractSocket::SocketAccessError: | - |
2880 | debug << "QAbstractSocket::SocketAccessError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketAccessError"; | - |
2881 | break; | 0 |
2882 | case QAbstractSocket::SocketResourceError: | - |
2883 | debug << "QAbstractSocket::SocketResourceError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketResourceError"; | - |
2884 | break; | 0 |
2885 | case QAbstractSocket::SocketTimeoutError: | - |
2886 | debug << "QAbstractSocket::SocketTimeoutError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketTimeoutError"; | - |
2887 | break; | 0 |
2888 | case QAbstractSocket::DatagramTooLargeError: | - |
2889 | debug << "QAbstractSocket::DatagramTooLargeError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::DatagramTooLargeError"; | - |
2890 | break; | 0 |
2891 | case QAbstractSocket::NetworkError: | - |
2892 | debug << "QAbstractSocket::NetworkError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::NetworkError"; | - |
2893 | break; | 0 |
2894 | case QAbstractSocket::AddressInUseError: | - |
2895 | debug << "QAbstractSocket::AddressInUseError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::AddressInUseError"; | - |
2896 | break; | 0 |
2897 | case QAbstractSocket::SocketAddressNotAvailableError: | - |
2898 | debug << "QAbstractSocket::SocketAddressNotAvailableError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketAddressNotAvailableError"; | - |
2899 | break; | 0 |
2900 | case QAbstractSocket::UnsupportedSocketOperationError: | - |
2901 | debug << "QAbstractSocket::UnsupportedSocketOperationError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::UnsupportedSocketOperationError"; | - |
2902 | break; | 0 |
2903 | case QAbstractSocket::UnfinishedSocketOperationError: | - |
2904 | debug << "QAbstractSocket::UnfinishedSocketOperationError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::UnfinishedSocketOperationError"; | - |
2905 | break; | 0 |
2906 | case QAbstractSocket::ProxyAuthenticationRequiredError: | - |
2907 | debug << "QAbstractSocket::ProxyAuthenticationRequiredError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyAuthenticationRequiredError"; | - |
2908 | break; | 0 |
2909 | case QAbstractSocket::UnknownSocketError: | - |
2910 | debug << "QAbstractSocket::UnknownSocketError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::UnknownSocketError"; | - |
2911 | break; | 0 |
2912 | case QAbstractSocket::ProxyConnectionRefusedError: | - |
2913 | debug << "QAbstractSocket::ProxyConnectionRefusedError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyConnectionRefusedError"; | - |
2914 | break; | 0 |
2915 | case QAbstractSocket::ProxyConnectionClosedError: | - |
2916 | debug << "QAbstractSocket::ProxyConnectionClosedError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyConnectionClosedError"; | - |
2917 | break; | 0 |
2918 | case QAbstractSocket::ProxyConnectionTimeoutError: | - |
2919 | debug << "QAbstractSocket::ProxyConnectionTimeoutError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyConnectionTimeoutError"; | - |
2920 | break; | 0 |
2921 | case QAbstractSocket::ProxyNotFoundError: | - |
2922 | debug << "QAbstractSocket::ProxyNotFoundError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyNotFoundError"; | - |
2923 | break; | 0 |
2924 | case QAbstractSocket::ProxyProtocolError: | - |
2925 | debug << "QAbstractSocket::ProxyProtocolError"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ProxyProtocolError"; | - |
2926 | break; | 0 |
2927 | default: | - |
2928 | debug << "QAbstractSocket::SocketError(" << int(error) << ')'; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketError(" << int(error) << ')'; | - |
2929 | break; | 0 |
2930 | } | - |
2931 | return debug; executed: return debug; Execution Count:23 | 23 |
2932 | } | - |
2933 | | - |
2934 | Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, QAbstractSocket::SocketState state) | - |
2935 | { | - |
2936 | switch (state) { | - |
2937 | case QAbstractSocket::UnconnectedState: | - |
2938 | debug << "QAbstractSocket::UnconnectedState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::UnconnectedState"; | - |
2939 | break; | 0 |
2940 | case QAbstractSocket::HostLookupState: | - |
2941 | debug << "QAbstractSocket::HostLookupState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::HostLookupState"; | - |
2942 | break; | 0 |
2943 | case QAbstractSocket::ConnectingState: | - |
2944 | debug << "QAbstractSocket::ConnectingState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ConnectingState"; | - |
2945 | break; | 0 |
2946 | case QAbstractSocket::ConnectedState: | - |
2947 | debug << "QAbstractSocket::ConnectedState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ConnectedState"; | - |
2948 | break; | 0 |
2949 | case QAbstractSocket::BoundState: | - |
2950 | debug << "QAbstractSocket::BoundState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::BoundState"; | - |
2951 | break; | 0 |
2952 | case QAbstractSocket::ListeningState: | - |
2953 | debug << "QAbstractSocket::ListeningState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ListeningState"; | - |
2954 | break; | 0 |
2955 | case QAbstractSocket::ClosingState: | - |
2956 | debug << "QAbstractSocket::ClosingState"; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::ClosingState"; | - |
2957 | break; | 0 |
2958 | default: | - |
2959 | debug << "QAbstractSocket::SocketState(" << int(state) << ')'; never executed (the execution status of this line is deduced): debug << "QAbstractSocket::SocketState(" << int(state) << ')'; | - |
2960 | break; | 0 |
2961 | } | - |
2962 | return debug; never executed: return debug; | 0 |
2963 | } | - |
2964 | #endif | - |
2965 | | - |
2966 | QT_END_NAMESPACE | - |
2967 | | - |
2968 | #include "moc_qabstractsocket.cpp" | - |
2969 | | - |
| | |