1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2016 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6#ifndef QABSTRACTSOCKETENGINE_P_H
7#define QABSTRACTSOCKETENGINE_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtNetwork/private/qtnetworkglobal_p.h>
21#include "QtNetwork/qhostaddress.h"
22#include "QtNetwork/qabstractsocket.h"
23#include <QtCore/qdeadlinetimer.h>
24#include "private/qnetworkdatagram_p.h"
25#include "private/qobject_p.h"
26
27QT_BEGIN_NAMESPACE
28
29class QAuthenticator;
30class QAbstractSocketEnginePrivate;
31#ifndef QT_NO_NETWORKINTERFACE
32class QNetworkInterface;
33#endif
34class QNetworkProxy;
35
36class QAbstractSocketEngineReceiver {
37public:
38 virtual ~QAbstractSocketEngineReceiver(){}
39 virtual void readNotification()= 0;
40 virtual void writeNotification()= 0;
41 virtual void closeNotification()= 0;
42 virtual void exceptionNotification()= 0;
43 virtual void connectionNotification()= 0;
44#ifndef QT_NO_NETWORKPROXY
45 virtual void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)= 0;
46#endif
47};
48
49static constexpr std::chrono::seconds DefaultTimeout{30};
50
51class Q_AUTOTEST_EXPORT QAbstractSocketEngine : public QObject
52{
53 Q_OBJECT
54 Q_MOC_INCLUDE(<QtNetwork/qauthenticator.h>)
55public:
56
57 static QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &, QObject *parent);
58 static QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent);
59
60 QAbstractSocketEngine(QObject *parent = nullptr);
61
62 enum SocketOption {
63 NonBlockingSocketOption,
64 BroadcastSocketOption,
65 ReceiveBufferSocketOption,
66 SendBufferSocketOption,
67 AddressReusable,
68 BindExclusively,
69 ReceiveOutOfBandData,
70 LowDelayOption,
71 KeepAliveOption,
72 MulticastTtlOption,
73 MulticastLoopbackOption,
74 TypeOfServiceOption,
75 ReceivePacketInformation,
76 ReceiveHopLimit,
77 MaxStreamsSocketOption,
78 PathMtuInformation
79 };
80
81 enum PacketHeaderOption {
82 WantNone = 0,
83 WantDatagramSender = 0x01,
84 WantDatagramDestination = 0x02,
85 WantDatagramHopLimit = 0x04,
86 WantStreamNumber = 0x08,
87 WantEndOfRecord = 0x10,
88
89 WantAll = 0xff
90 };
91 Q_DECLARE_FLAGS(PacketHeaderOptions, PacketHeaderOption)
92
93 virtual bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) = 0;
94
95 virtual bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) = 0;
96
97 virtual qintptr socketDescriptor() const = 0;
98
99 virtual bool isValid() const = 0;
100
101 virtual bool connectToHost(const QHostAddress &address, quint16 port) = 0;
102 virtual bool connectToHostByName(const QString &name, quint16 port) = 0;
103 virtual bool bind(const QHostAddress &address, quint16 port) = 0;
104 virtual bool listen(int backlog) = 0;
105 virtual qintptr accept() = 0;
106 virtual void close() = 0;
107
108 virtual qint64 bytesAvailable() const = 0;
109
110 virtual qint64 read(char *data, qint64 maxlen) = 0;
111 virtual qint64 write(const char *data, qint64 len) = 0;
112
113#ifndef QT_NO_UDPSOCKET
114#ifndef QT_NO_NETWORKINTERFACE
115 virtual bool joinMulticastGroup(const QHostAddress &groupAddress,
116 const QNetworkInterface &iface) = 0;
117 virtual bool leaveMulticastGroup(const QHostAddress &groupAddress,
118 const QNetworkInterface &iface) = 0;
119 virtual QNetworkInterface multicastInterface() const = 0;
120 virtual bool setMulticastInterface(const QNetworkInterface &iface) = 0;
121#endif // QT_NO_NETWORKINTERFACE
122
123 virtual bool hasPendingDatagrams() const = 0;
124 virtual qint64 pendingDatagramSize() const = 0;
125#endif // QT_NO_UDPSOCKET
126
127 virtual qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader *header = nullptr,
128 PacketHeaderOptions = WantNone) = 0;
129 virtual qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &header) = 0;
130 virtual qint64 bytesToWrite() const = 0;
131
132 virtual int option(SocketOption option) const = 0;
133 virtual bool setOption(SocketOption option, int value) = 0;
134
135 virtual bool waitForRead(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
136 bool *timedOut = nullptr) = 0;
137 virtual bool waitForWrite(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
138 bool *timedOut = nullptr) = 0;
139 virtual bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
140 bool checkRead, bool checkWrite,
141 QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
142 bool *timedOut = nullptr) = 0;
143
144 QAbstractSocket::SocketError error() const;
145 QString errorString() const;
146 QAbstractSocket::SocketState state() const;
147 QAbstractSocket::SocketType socketType() const;
148 QAbstractSocket::NetworkLayerProtocol protocol() const;
149
150 QHostAddress localAddress() const;
151 quint16 localPort() const;
152 QHostAddress peerAddress() const;
153 quint16 peerPort() const;
154 int inboundStreamCount() const;
155 int outboundStreamCount() const;
156
157 virtual bool isReadNotificationEnabled() const = 0;
158 virtual void setReadNotificationEnabled(bool enable) = 0;
159 virtual bool isWriteNotificationEnabled() const = 0;
160 virtual void setWriteNotificationEnabled(bool enable) = 0;
161 virtual bool isExceptionNotificationEnabled() const = 0;
162 virtual void setExceptionNotificationEnabled(bool enable) = 0;
163
164public Q_SLOTS:
165 void readNotification();
166 void writeNotification();
167 void closeNotification();
168 void exceptionNotification();
169 void connectionNotification();
170#ifndef QT_NO_NETWORKPROXY
171 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
172#endif
173
174public:
175 void setReceiver(QAbstractSocketEngineReceiver *receiver);
176protected:
177 QAbstractSocketEngine(QAbstractSocketEnginePrivate &dd, QObject* parent = nullptr);
178
179 void setError(QAbstractSocket::SocketError error, const QString &errorString) const;
180 void setState(QAbstractSocket::SocketState state);
181 void setSocketType(QAbstractSocket::SocketType socketType);
182 void setProtocol(QAbstractSocket::NetworkLayerProtocol protocol);
183 void setLocalAddress(const QHostAddress &address);
184 void setLocalPort(quint16 port);
185 void setPeerAddress(const QHostAddress &address);
186 void setPeerPort(quint16 port);
187
188private:
189 Q_DECLARE_PRIVATE(QAbstractSocketEngine)
190 Q_DISABLE_COPY_MOVE(QAbstractSocketEngine)
191};
192
193class QAbstractSocketEnginePrivate : public QObjectPrivate
194{
195 Q_DECLARE_PUBLIC(QAbstractSocketEngine)
196public:
197 QAbstractSocketEnginePrivate();
198
199 mutable QAbstractSocket::SocketError socketError;
200 mutable bool hasSetSocketError;
201 mutable QString socketErrorString;
202 QAbstractSocket::SocketState socketState;
203 QAbstractSocket::SocketType socketType;
204 QAbstractSocket::NetworkLayerProtocol socketProtocol;
205 QHostAddress localAddress;
206 quint16 localPort;
207 QHostAddress peerAddress;
208 quint16 peerPort;
209 int inboundStreamCount;
210 int outboundStreamCount;
211 QAbstractSocketEngineReceiver *receiver;
212};
213
214
215class Q_AUTOTEST_EXPORT QSocketEngineHandler
216{
217protected:
218 QSocketEngineHandler();
219 virtual ~QSocketEngineHandler();
220 virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,
221 const QNetworkProxy &, QObject *parent) = 0;
222 virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent) = 0;
223
224private:
225 friend class QAbstractSocketEngine;
226};
227
228Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocketEngine::PacketHeaderOptions)
229
230QT_END_NAMESPACE
231
232#endif // QABSTRACTSOCKETENGINE_P_H
233

source code of qtbase/src/network/socket/qabstractsocketengine_p.h