From b49467220811059ea85f1a31eeecb6797dc753e2 Mon Sep 17 00:00:00 2001 From: "Jonas M. Gastal" Date: Tue, 27 Dec 2011 18:00:18 -0200 Subject: Emit error if trying to connect while socket is connected or connecting. This applies to both local and abstract sockets. Task-number: QTBUG-22450 Change-Id: I5c58d68da95ffb6bcde5be510853359b288e5984 Reviewed-by: Thiago Macieira Reviewed-by: Peter Hartmann --- src/network/socket/qabstractsocket.cpp | 5 +++++ src/network/socket/qabstractsocket.h | 1 + src/network/socket/qlocalsocket.cpp | 2 ++ src/network/socket/qlocalsocket.h | 3 ++- src/network/socket/qlocalsocket_tcp.cpp | 3 +++ src/network/socket/qlocalsocket_unix.cpp | 10 ++++++++-- src/network/socket/qlocalsocket_win.cpp | 5 ++++- 7 files changed, 25 insertions(+), 4 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index f84153a7bd..b8e301523f 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -315,6 +315,8 @@ proxy) was not found. \value ProxyProtocolError The connection negotiation with the proxy server because the response from the proxy server could not be understood. + \value OperationError An operation was attempted while the socket was in a state that + did not permit it. \value UnknownSocketError An unidentified error occurred. \sa QAbstractSocket::error() @@ -1497,6 +1499,9 @@ void QAbstractSocket::connectToHostImplementation(const QString &hostName, quint if (d->state == ConnectedState || d->state == ConnectingState || d->state == ClosingState || d->state == HostLookupState) { qWarning("QAbstractSocket::connectToHost() called when already looking up or connecting/connected to \"%s\"", qPrintable(hostName)); + d->socketError = QAbstractSocket::OperationError; + setErrorString(QAbstractSocket::tr("Trying to connect while connection is in progress")); + emit error(d->socketError); return; } diff --git a/src/network/socket/qabstractsocket.h b/src/network/socket/qabstractsocket.h index e3c27e34b0..15e24de59c 100644 --- a/src/network/socket/qabstractsocket.h +++ b/src/network/socket/qabstractsocket.h @@ -97,6 +97,7 @@ public: ProxyConnectionTimeoutError, ProxyNotFoundError, ProxyProtocolError, + OperationError, UnknownSocketError = -1 }; diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp index 219d2aa8ad..93c98b7ab6 100644 --- a/src/network/socket/qlocalsocket.cpp +++ b/src/network/socket/qlocalsocket.cpp @@ -419,6 +419,8 @@ bool QLocalSocket::isSequential() const \value ConnectionError An error occurred with the connection. \value UnsupportedSocketOperationError The requested socket operation is not supported by the local operating system. + \value OperationError An operation was attempted while the socket was in a state that + did not permit it. \value UnknownSocketError An unidentified error occurred. */ diff --git a/src/network/socket/qlocalsocket.h b/src/network/socket/qlocalsocket.h index 74c54bf873..4025f9b93d 100644 --- a/src/network/socket/qlocalsocket.h +++ b/src/network/socket/qlocalsocket.h @@ -72,7 +72,8 @@ public: DatagramTooLargeError = QAbstractSocket::DatagramTooLargeError, ConnectionError = QAbstractSocket::NetworkError, UnsupportedSocketOperationError = QAbstractSocket::UnsupportedSocketOperationError, - UnknownSocketError = QAbstractSocket::UnknownSocketError + UnknownSocketError = QAbstractSocket::UnknownSocketError, + OperationError = QAbstractSocket::OperationError }; enum LocalSocketState diff --git a/src/network/socket/qlocalsocket_tcp.cpp b/src/network/socket/qlocalsocket_tcp.cpp index 38d2b627b1..4585fddbc3 100644 --- a/src/network/socket/qlocalsocket_tcp.cpp +++ b/src/network/socket/qlocalsocket_tcp.cpp @@ -155,6 +155,9 @@ QString QLocalSocketPrivate::generateErrorString(QLocalSocket::LocalSocketError case QLocalSocket::UnsupportedSocketOperationError: errorString = QLocalSocket::tr("%1: The socket operation is not supported").arg(function); break; + case QLocalSocket::OperationError: + errorString = QLocalSocket::tr("%1: Operation not permitted when socket is in this state").arg(function); + break; case QLocalSocket::UnknownSocketError: default: errorString = QLocalSocket::tr("%1: Unknown error").arg(function); diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp index 1bdf604eb1..ae8ec83474 100644 --- a/src/network/socket/qlocalsocket_unix.cpp +++ b/src/network/socket/qlocalsocket_unix.cpp @@ -162,6 +162,9 @@ QString QLocalSocketPrivate::generateErrorString(QLocalSocket::LocalSocketError case QLocalSocket::UnsupportedSocketOperationError: errorString = QLocalSocket::tr("%1: The socket operation is not supported").arg(function); break; + case QLocalSocket::OperationError: + errorString = QLocalSocket::tr("%1: Operation not permitted when socket is in this state").arg(function); + break; case QLocalSocket::UnknownSocketError: default: errorString = QLocalSocket::tr("%1: Unknown error %2").arg(function).arg(errno); @@ -221,9 +224,12 @@ void QLocalSocketPrivate::errorOccurred(QLocalSocket::LocalSocketError error, co void QLocalSocket::connectToServer(const QString &name, OpenMode openMode) { Q_D(QLocalSocket); - if (state() == ConnectedState - || state() == ConnectingState) + if (state() == ConnectedState || state() == ConnectingState) { + QString errorString = d->generateErrorString(QLocalSocket::OperationError, QLatin1String("QLocalSocket::connectToserver")); + setErrorString(errorString); + emit error(QLocalSocket::OperationError); return; + } d->errorString.clear(); d->unixSocket.setSocketState(QAbstractSocket::ConnectingState); diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index e049f68c2f..8b18c13d65 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -131,8 +131,11 @@ void QLocalSocketPrivate::destroyPipeHandles() void QLocalSocket::connectToServer(const QString &name, OpenMode openMode) { Q_D(QLocalSocket); - if (state() == ConnectedState || state() == ConnectingState) + if (state() == ConnectedState || state() == ConnectingState) { + setErrorString("Trying to connect while connection is in progress"); + emit error(QLocalSocket::OperationError); return; + } d->error = QLocalSocket::UnknownSocketError; d->errorString = QString(); -- cgit v1.2.3