1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Copyright (C) 2016 Intel Corporation.
5 ** Contact: https://www.qt.io/licensing/
6 **
7 ** This file is part of the QtNetwork module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see https://www.qt.io/terms-conditions. For further
16 ** information use the contact form at https://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or (at your option) the GNU General
29 ** Public license version 3 or any later version approved by the KDE Free
30 ** Qt Foundation. The licenses are as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32 ** included in the packaging of this file. Please review the following
33 ** information to ensure the GNU General Public License requirements will
34 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35 ** https://www.gnu.org/licenses/gpl-3.0.html.
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #ifndef QABSTRACTSOCKETENGINE_P_H
42 #define QABSTRACTSOCKETENGINE_P_H
43 
44 //
45 //  W A R N I N G
46 //  -------------
47 //
48 // This file is not part of the Qt API.  It exists purely as an
49 // implementation detail.  This header file may change from version to
50 // version without notice, or even be removed.
51 //
52 // We mean it.
53 //
54 
55 #include <QtNetwork/private/qtnetworkglobal_p.h>
56 #include "QtNetwork/qhostaddress.h"
57 #include "QtNetwork/qabstractsocket.h"
58 #include "private/qobject_p.h"
59 #include "private/qnetworkdatagram_p.h"
60 
61 QT_BEGIN_NAMESPACE
62 
63 class QAuthenticator;
64 class QAbstractSocketEnginePrivate;
65 #ifndef QT_NO_NETWORKINTERFACE
66 class QNetworkInterface;
67 #endif
68 class QNetworkProxy;
69 
70 class QAbstractSocketEngineReceiver {
71 public:
~QAbstractSocketEngineReceiver()72     virtual ~QAbstractSocketEngineReceiver(){}
73     virtual void readNotification()= 0;
74     virtual void writeNotification()= 0;
75     virtual void closeNotification()= 0;
76     virtual void exceptionNotification()= 0;
77     virtual void connectionNotification()= 0;
78 #ifndef QT_NO_NETWORKPROXY
79     virtual void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)= 0;
80 #endif
81 };
82 
83 class Q_AUTOTEST_EXPORT QAbstractSocketEngine : public QObject
84 {
85     Q_OBJECT
86 public:
87 
88     static QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &, QObject *parent);
89     static QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent);
90 
91     QAbstractSocketEngine(QObject *parent = nullptr);
92 
93     enum SocketOption {
94         NonBlockingSocketOption,
95         BroadcastSocketOption,
96         ReceiveBufferSocketOption,
97         SendBufferSocketOption,
98         AddressReusable,
99         BindExclusively,
100         ReceiveOutOfBandData,
101         LowDelayOption,
102         KeepAliveOption,
103         MulticastTtlOption,
104         MulticastLoopbackOption,
105         TypeOfServiceOption,
106         ReceivePacketInformation,
107         ReceiveHopLimit,
108         MaxStreamsSocketOption,
109         PathMtuInformation
110     };
111 
112     enum PacketHeaderOption {
113         WantNone = 0,
114         WantDatagramSender = 0x01,
115         WantDatagramDestination = 0x02,
116         WantDatagramHopLimit = 0x04,
117         WantStreamNumber = 0x08,
118         WantEndOfRecord = 0x10,
119 
120         WantAll = 0xff
121     };
122     Q_DECLARE_FLAGS(PacketHeaderOptions, PacketHeaderOption)
123 
124     virtual bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) = 0;
125 
126     virtual bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) = 0;
127 
128     virtual qintptr socketDescriptor() const = 0;
129 
130     virtual bool isValid() const = 0;
131 
132     virtual bool connectToHost(const QHostAddress &address, quint16 port) = 0;
133     virtual bool connectToHostByName(const QString &name, quint16 port) = 0;
134     virtual bool bind(const QHostAddress &address, quint16 port) = 0;
135     virtual bool listen() = 0;
136     virtual int accept() = 0;
137     virtual void close() = 0;
138 
139     virtual qint64 bytesAvailable() const = 0;
140 
141     virtual qint64 read(char *data, qint64 maxlen) = 0;
142     virtual qint64 write(const char *data, qint64 len) = 0;
143 
144 #ifndef QT_NO_UDPSOCKET
145 #ifndef QT_NO_NETWORKINTERFACE
146     virtual bool joinMulticastGroup(const QHostAddress &groupAddress,
147                                     const QNetworkInterface &iface) = 0;
148     virtual bool leaveMulticastGroup(const QHostAddress &groupAddress,
149                                      const QNetworkInterface &iface) = 0;
150     virtual QNetworkInterface multicastInterface() const = 0;
151     virtual bool setMulticastInterface(const QNetworkInterface &iface) = 0;
152 #endif // QT_NO_NETWORKINTERFACE
153 
154     virtual bool hasPendingDatagrams() const = 0;
155     virtual qint64 pendingDatagramSize() const = 0;
156 #endif // QT_NO_UDPSOCKET
157 
158     virtual qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader *header = nullptr,
159                                 PacketHeaderOptions = WantNone) = 0;
160     virtual qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &header) = 0;
161     virtual qint64 bytesToWrite() const = 0;
162 
163     virtual int option(SocketOption option) const = 0;
164     virtual bool setOption(SocketOption option, int value) = 0;
165 
166     virtual bool waitForRead(int msecs = 30000, bool *timedOut = nullptr) = 0;
167     virtual bool waitForWrite(int msecs = 30000, bool *timedOut = nullptr) = 0;
168     virtual bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
169                             bool checkRead, bool checkWrite,
170                             int msecs = 30000, bool *timedOut = nullptr) = 0;
171 
172     QAbstractSocket::SocketError error() const;
173     QString errorString() const;
174     QAbstractSocket::SocketState state() const;
175     QAbstractSocket::SocketType socketType() const;
176     QAbstractSocket::NetworkLayerProtocol protocol() const;
177 
178     QHostAddress localAddress() const;
179     quint16 localPort() const;
180     QHostAddress peerAddress() const;
181     quint16 peerPort() const;
182     int inboundStreamCount() const;
183     int outboundStreamCount() const;
184 
185     virtual bool isReadNotificationEnabled() const = 0;
186     virtual void setReadNotificationEnabled(bool enable) = 0;
187     virtual bool isWriteNotificationEnabled() const = 0;
188     virtual void setWriteNotificationEnabled(bool enable) = 0;
189     virtual bool isExceptionNotificationEnabled() const = 0;
190     virtual void setExceptionNotificationEnabled(bool enable) = 0;
191 
192 public Q_SLOTS:
193     void readNotification();
194     void writeNotification();
195     void closeNotification();
196     void exceptionNotification();
197     void connectionNotification();
198 #ifndef QT_NO_NETWORKPROXY
199     void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
200 #endif
201 
202 public:
203     void setReceiver(QAbstractSocketEngineReceiver *receiver);
204 protected:
205     QAbstractSocketEngine(QAbstractSocketEnginePrivate &dd, QObject* parent = nullptr);
206 
207     void setError(QAbstractSocket::SocketError error, const QString &errorString) const;
208     void setState(QAbstractSocket::SocketState state);
209     void setSocketType(QAbstractSocket::SocketType socketType);
210     void setProtocol(QAbstractSocket::NetworkLayerProtocol protocol);
211     void setLocalAddress(const QHostAddress &address);
212     void setLocalPort(quint16 port);
213     void setPeerAddress(const QHostAddress &address);
214     void setPeerPort(quint16 port);
215 
216 private:
217     Q_DECLARE_PRIVATE(QAbstractSocketEngine)
218     Q_DISABLE_COPY_MOVE(QAbstractSocketEngine)
219 };
220 
221 class QAbstractSocketEnginePrivate : public QObjectPrivate
222 {
223     Q_DECLARE_PUBLIC(QAbstractSocketEngine)
224 public:
225     QAbstractSocketEnginePrivate();
226 
227     mutable QAbstractSocket::SocketError socketError;
228     mutable bool hasSetSocketError;
229     mutable QString socketErrorString;
230     QAbstractSocket::SocketState socketState;
231     QAbstractSocket::SocketType socketType;
232     QAbstractSocket::NetworkLayerProtocol socketProtocol;
233     QHostAddress localAddress;
234     quint16 localPort;
235     QHostAddress peerAddress;
236     quint16 peerPort;
237     int inboundStreamCount;
238     int outboundStreamCount;
239     QAbstractSocketEngineReceiver *receiver;
240 };
241 
242 
243 class Q_AUTOTEST_EXPORT QSocketEngineHandler
244 {
245 protected:
246     QSocketEngineHandler();
247     virtual ~QSocketEngineHandler();
248     virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,
249                                                       const QNetworkProxy &, QObject *parent) = 0;
250     virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent) = 0;
251 
252 private:
253     friend class QAbstractSocketEngine;
254 };
255 
256 Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocketEngine::PacketHeaderOptions)
257 
258 QT_END_NAMESPACE
259 
260 #endif // QABSTRACTSOCKETENGINE_P_H
261