00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QABSTRACTSOCKET_H
00043 #define QABSTRACTSOCKET_H
00044
00045 #include <QtCore/qiodevice.h>
00046 #include <QtCore/qobject.h>
00047 #ifndef QT_NO_DEBUG_STREAM
00048 #include <QtCore/qdebug.h>
00049 #endif
00050
00051 QT_BEGIN_HEADER
00052
00053 QT_BEGIN_NAMESPACE
00054
00055 QT_MODULE(Network)
00056
00057 class QHostAddress;
00058 #ifndef QT_NO_NETWORKPROXY
00059 class QNetworkProxy;
00060 #endif
00061 class QAbstractSocketPrivate;
00062 class QAuthenticator;
00063
00064 class Q_NETWORK_EXPORT QAbstractSocket : public QIODevice
00065 {
00066 Q_OBJECT
00067 public:
00068 enum SocketType {
00069 TcpSocket,
00070 UdpSocket,
00071 UnknownSocketType = -1
00072 };
00073 enum NetworkLayerProtocol {
00074 IPv4Protocol,
00075 IPv6Protocol,
00076 UnknownNetworkLayerProtocol = -1
00077 };
00078 enum SocketError {
00079 ConnectionRefusedError,
00080 RemoteHostClosedError,
00081 HostNotFoundError,
00082 SocketAccessError,
00083 SocketResourceError,
00084 SocketTimeoutError,
00085 DatagramTooLargeError,
00086 NetworkError,
00087 AddressInUseError,
00088 SocketAddressNotAvailableError,
00089 UnsupportedSocketOperationError,
00090 UnfinishedSocketOperationError,
00091 ProxyAuthenticationRequiredError,
00092 SslHandshakeFailedError,
00093 ProxyConnectionRefusedError,
00094 ProxyConnectionClosedError,
00095 ProxyConnectionTimeoutError,
00096 ProxyNotFoundError,
00097 ProxyProtocolError,
00098
00099 UnknownSocketError = -1
00100 };
00101 enum SocketState {
00102 UnconnectedState,
00103 HostLookupState,
00104 ConnectingState,
00105 ConnectedState,
00106 BoundState,
00107 ListeningState,
00108 ClosingState
00109 #ifdef QT3_SUPPORT
00110 ,
00111 Idle = UnconnectedState,
00112 HostLookup = HostLookupState,
00113 Connecting = ConnectingState,
00114 Connected = ConnectedState,
00115 Closing = ClosingState,
00116 Connection = ConnectedState
00117 #endif
00118 };
00119 enum SocketOption {
00120 LowDelayOption,
00121 KeepAliveOption
00122 };
00123
00124 QAbstractSocket(SocketType socketType, QObject *parent);
00125 virtual ~QAbstractSocket();
00126
00127
00128 void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite);
00129 void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
00130 void disconnectFromHost();
00131
00132 bool isValid() const;
00133
00134 qint64 bytesAvailable() const;
00135 qint64 bytesToWrite() const;
00136
00137 bool canReadLine() const;
00138
00139 quint16 localPort() const;
00140 QHostAddress localAddress() const;
00141 quint16 peerPort() const;
00142 QHostAddress peerAddress() const;
00143 QString peerName() const;
00144
00145
00146 qint64 readBufferSize() const;
00147 void setReadBufferSize(qint64 size);
00148
00149 void abort();
00150
00151
00152 int socketDescriptor() const;
00153 bool setSocketDescriptor(int socketDescriptor, SocketState state = ConnectedState,
00154 OpenMode openMode = ReadWrite);
00155
00156
00157 void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
00158 QVariant socketOption(QAbstractSocket::SocketOption option);
00159
00160 SocketType socketType() const;
00161 SocketState state() const;
00162 SocketError error() const;
00163
00164
00165 void close();
00166 bool isSequential() const;
00167 bool atEnd() const;
00168 bool flush();
00169
00170
00171
00172 bool waitForConnected(int msecs = 30000);
00173 bool waitForReadyRead(int msecs = 30000);
00174 bool waitForBytesWritten(int msecs = 30000);
00175 bool waitForDisconnected(int msecs = 30000);
00176
00177 #ifndef QT_NO_NETWORKPROXY
00178 void setProxy(const QNetworkProxy &networkProxy);
00179 QNetworkProxy proxy() const;
00180 #endif
00181
00182 Q_SIGNALS:
00183 void hostFound();
00184 void connected();
00185 void disconnected();
00186 void stateChanged(QAbstractSocket::SocketState);
00187 void error(QAbstractSocket::SocketError);
00188 #ifndef QT_NO_NETWORKPROXY
00189 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
00190 #endif
00191
00192 protected Q_SLOTS:
00193 void connectToHostImplementation(const QString &hostName, quint16 port, OpenMode mode = ReadWrite);
00194 void disconnectFromHostImplementation();
00195
00196 protected:
00197 qint64 readData(char *data, qint64 maxlen);
00198 qint64 readLineData(char *data, qint64 maxlen);
00199 qint64 writeData(const char *data, qint64 len);
00200
00201 void setSocketState(SocketState state);
00202 void setSocketError(SocketError socketError);
00203 void setLocalPort(quint16 port);
00204 void setLocalAddress(const QHostAddress &address);
00205 void setPeerPort(quint16 port);
00206 void setPeerAddress(const QHostAddress &address);
00207 void setPeerName(const QString &name);
00208
00209 QAbstractSocket(SocketType socketType, QAbstractSocketPrivate &dd, QObject *parent = 0);
00210
00211 private:
00212 Q_DECLARE_PRIVATE(QAbstractSocket)
00213 Q_DISABLE_COPY(QAbstractSocket)
00214
00215 Q_PRIVATE_SLOT(d_func(), void _q_connectToNextAddress())
00216 Q_PRIVATE_SLOT(d_func(), void _q_startConnecting(const QHostInfo &))
00217 Q_PRIVATE_SLOT(d_func(), void _q_abortConnectionAttempt())
00218 Q_PRIVATE_SLOT(d_func(), void _q_testConnection())
00219 Q_PRIVATE_SLOT(d_func(), void _q_forceDisconnect())
00220
00221 #ifdef QT3_SUPPORT
00222 public:
00223 enum Error {
00224 ErrConnectionRefused = ConnectionRefusedError,
00225 ErrHostNotFound = HostNotFoundError,
00226 ErrSocketRead = UnknownSocketError
00227 };
00228 inline QT3_SUPPORT int socket() const { return socketDescriptor(); }
00229 inline QT3_SUPPORT void setSocket(int socket) { setSocketDescriptor(socket); }
00230 inline QT3_SUPPORT qulonglong waitForMore(int msecs, bool *timeout = 0) const
00231 {
00232 QAbstractSocket *that = const_cast<QAbstractSocket *>(this);
00233 if (that->waitForReadyRead(msecs))
00234 return qulonglong(bytesAvailable());
00235 if (error() == SocketTimeoutError && timeout)
00236 *timeout = true;
00237 return 0;
00238 }
00239 typedef SocketState State;
00240 Q_SIGNALS:
00241 QT_MOC_COMPAT void connectionClosed();
00242 QT_MOC_COMPAT void delayedCloseFinished();
00243
00244
00245 #endif
00246 };
00247
00248 #ifndef QT_NO_DEBUG_STREAM
00249 Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketError);
00250 Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketState);
00251 #endif
00252
00253 QT_END_NAMESPACE
00254
00255 QT_END_HEADER
00256
00257 #endif // QABSTRACTSOCKET_H