1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 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 The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/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 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #ifndef QABSTRACTSOCKET_H 41 #define QABSTRACTSOCKET_H 42 43 #include <QtNetwork/qtnetworkglobal.h> 44 #include <QtCore/qiodevice.h> 45 #include <QtCore/qobject.h> 46 #ifndef QT_NO_DEBUG_STREAM 47 #include <QtCore/qdebug.h> 48 #endif 49 50 QT_BEGIN_NAMESPACE 51 52 53 class QHostAddress; 54 #ifndef QT_NO_NETWORKPROXY 55 class QNetworkProxy; 56 #endif 57 class QAbstractSocketPrivate; 58 class QAuthenticator; 59 60 class Q_NETWORK_EXPORT QAbstractSocket : public QIODevice 61 { 62 Q_OBJECT 63 public: 64 enum SocketType { 65 TcpSocket, 66 UdpSocket, 67 SctpSocket, 68 UnknownSocketType = -1 69 }; 70 Q_ENUM(SocketType) 71 enum NetworkLayerProtocol { 72 IPv4Protocol, 73 IPv6Protocol, 74 AnyIPProtocol, 75 UnknownNetworkLayerProtocol = -1 76 }; 77 Q_ENUM(NetworkLayerProtocol) 78 enum SocketError { 79 ConnectionRefusedError, 80 RemoteHostClosedError, 81 HostNotFoundError, 82 SocketAccessError, 83 SocketResourceError, 84 SocketTimeoutError, /* 5 */ 85 DatagramTooLargeError, 86 NetworkError, 87 AddressInUseError, 88 SocketAddressNotAvailableError, 89 UnsupportedSocketOperationError, /* 10 */ 90 UnfinishedSocketOperationError, 91 ProxyAuthenticationRequiredError, 92 SslHandshakeFailedError, 93 ProxyConnectionRefusedError, 94 ProxyConnectionClosedError, /* 15 */ 95 ProxyConnectionTimeoutError, 96 ProxyNotFoundError, 97 ProxyProtocolError, 98 OperationError, 99 SslInternalError, /* 20 */ 100 SslInvalidUserDataError, 101 TemporaryError, 102 103 UnknownSocketError = -1 104 }; 105 Q_ENUM(SocketError) 106 enum SocketState { 107 UnconnectedState, 108 HostLookupState, 109 ConnectingState, 110 ConnectedState, 111 BoundState, 112 ListeningState, 113 ClosingState 114 }; 115 Q_ENUM(SocketState) 116 enum SocketOption { 117 LowDelayOption, // TCP_NODELAY 118 KeepAliveOption, // SO_KEEPALIVE 119 MulticastTtlOption, // IP_MULTICAST_TTL 120 MulticastLoopbackOption, // IP_MULTICAST_LOOPBACK 121 TypeOfServiceOption, //IP_TOS 122 SendBufferSizeSocketOption, //SO_SNDBUF 123 ReceiveBufferSizeSocketOption, //SO_RCVBUF 124 PathMtuSocketOption // IP_MTU 125 }; 126 Q_ENUM(SocketOption) 127 enum BindFlag { 128 DefaultForPlatform = 0x0, 129 ShareAddress = 0x1, 130 DontShareAddress = 0x2, 131 ReuseAddressHint = 0x4 132 }; 133 Q_DECLARE_FLAGS(BindMode, BindFlag) 134 enum PauseMode { 135 PauseNever = 0x0, 136 PauseOnSslErrors = 0x1 137 }; 138 Q_DECLARE_FLAGS(PauseModes, PauseMode) 139 140 QAbstractSocket(SocketType socketType, QObject *parent); 141 virtual ~QAbstractSocket(); 142 143 virtual void resume(); // to continue after proxy authentication required, SSL errors etc. 144 PauseModes pauseMode() const; 145 void setPauseMode(PauseModes pauseMode); 146 147 // ### Qt6: make the first one virtual 148 bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform); 149 bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform); 150 151 // ### Qt6: de-virtualize connectToHost(QHostAddress) overload 152 virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol); 153 virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite); 154 virtual void disconnectFromHost(); 155 156 bool isValid() const; 157 158 qint64 bytesAvailable() const override; 159 qint64 bytesToWrite() const override; 160 161 bool canReadLine() const override; // ### Qt6: remove me 162 163 quint16 localPort() const; 164 QHostAddress localAddress() const; 165 quint16 peerPort() const; 166 QHostAddress peerAddress() const; 167 QString peerName() const; 168 169 qint64 readBufferSize() const; 170 virtual void setReadBufferSize(qint64 size); 171 172 void abort(); 173 174 virtual qintptr socketDescriptor() const; 175 virtual bool setSocketDescriptor(qintptr socketDescriptor, SocketState state = ConnectedState, 176 OpenMode openMode = ReadWrite); 177 178 virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value); 179 virtual QVariant socketOption(QAbstractSocket::SocketOption option); 180 181 SocketType socketType() const; 182 SocketState state() const; 183 SocketError error() const; 184 185 // from QIODevice 186 void close() override; 187 bool isSequential() const override; 188 bool atEnd() const override; // ### Qt6: remove me 189 bool flush(); 190 191 // for synchronous access 192 virtual bool waitForConnected(int msecs = 30000); 193 bool waitForReadyRead(int msecs = 30000) override; 194 bool waitForBytesWritten(int msecs = 30000) override; 195 virtual bool waitForDisconnected(int msecs = 30000); 196 197 #ifndef QT_NO_NETWORKPROXY 198 void setProxy(const QNetworkProxy &networkProxy); 199 QNetworkProxy proxy() const; 200 QString protocolTag() const; 201 void setProtocolTag(const QString &tag); 202 #endif 203 204 Q_SIGNALS: 205 void hostFound(); 206 void connected(); 207 void disconnected(); 208 void stateChanged(QAbstractSocket::SocketState); 209 #if QT_DEPRECATED_SINCE(5,15) 210 QT_DEPRECATED_NETWORK_API_5_15_X("Use QAbstractSocket::errorOccurred(QAbstractSocket::SocketError) instead") 211 void error(QAbstractSocket::SocketError); 212 #endif 213 void errorOccurred(QAbstractSocket::SocketError); 214 #ifndef QT_NO_NETWORKPROXY 215 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); 216 #endif 217 218 protected: 219 qint64 readData(char *data, qint64 maxlen) override; 220 qint64 readLineData(char *data, qint64 maxlen) override; 221 qint64 writeData(const char *data, qint64 len) override; 222 223 void setSocketState(SocketState state); 224 void setSocketError(SocketError socketError); 225 void setLocalPort(quint16 port); 226 void setLocalAddress(const QHostAddress &address); 227 void setPeerPort(quint16 port); 228 void setPeerAddress(const QHostAddress &address); 229 void setPeerName(const QString &name); 230 231 QAbstractSocket(SocketType socketType, QAbstractSocketPrivate &dd, QObject *parent = nullptr); 232 233 private: 234 Q_DECLARE_PRIVATE(QAbstractSocket) 235 Q_DISABLE_COPY(QAbstractSocket) 236 237 Q_PRIVATE_SLOT(d_func(), void _q_connectToNextAddress()) 238 Q_PRIVATE_SLOT(d_func(), void _q_startConnecting(const QHostInfo &)) 239 Q_PRIVATE_SLOT(d_func(), void _q_abortConnectionAttempt()) 240 Q_PRIVATE_SLOT(d_func(), void _q_testConnection()) 241 }; 242 243 244 Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::BindMode) 245 Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::PauseModes) 246 247 #ifndef QT_NO_DEBUG_STREAM 248 Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketError); 249 Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketState); 250 #endif 251 252 QT_END_NAMESPACE 253 254 Q_DECLARE_METATYPE(QAbstractSocket::SocketState) 255 Q_DECLARE_METATYPE(QAbstractSocket::SocketError) 256 257 #endif // QABSTRACTSOCKET_H 258