Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qabstractsocketengine.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
8
9#include "qmutex.h"
10#include "qnetworkproxy.h"
11
12QT_BEGIN_NAMESPACE
13
14QAbstractSocketEngineReceiver::~QAbstractSocketEngineReceiver() = default;
15
17{
18public:
19 QMutex mutex;
20};
21
22Q_GLOBAL_STATIC(QSocketEngineHandlerList, socketHandlers)
23
24QSocketEngineHandler::QSocketEngineHandler()
25{
26 if (!socketHandlers())
27 return;
28 QMutexLocker locker(&socketHandlers()->mutex);
29 socketHandlers()->prepend(this);
30}
31
32QSocketEngineHandler::~QSocketEngineHandler()
33{
34 if (!socketHandlers())
35 return;
36 QMutexLocker locker(&socketHandlers()->mutex);
37 socketHandlers()->removeAll(this);
38}
39
40QAbstractSocketEnginePrivate::QAbstractSocketEnginePrivate()
41 : socketError(QAbstractSocket::UnknownSocketError)
42 , hasSetSocketError(false)
43 , socketErrorString(QLatin1StringView(QT_TRANSLATE_NOOP(QSocketLayer, "Unknown error")))
44 , socketState(QAbstractSocket::UnconnectedState)
45 , socketType(QAbstractSocket::UnknownSocketType)
46 , socketProtocol(QAbstractSocket::UnknownNetworkLayerProtocol)
47 , localPort(0)
48 , peerPort(0)
49 , inboundStreamCount(0)
50 , outboundStreamCount(0)
51 , receiver(nullptr)
52{
53}
54
55QAbstractSocketEngine::QAbstractSocketEngine(QObject *parent)
56 : QObject(*new QAbstractSocketEnginePrivate(), parent)
57{
58}
59
60QAbstractSocketEngine::QAbstractSocketEngine(QAbstractSocketEnginePrivate &dd, QObject* parent)
61 : QObject(dd, parent)
62{
63}
64
65QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &proxy, QObject *parent)
66{
67#ifndef QT_NO_NETWORKPROXY
68 // proxy type must have been resolved by now
69 if (proxy.type() == QNetworkProxy::DefaultProxy)
70 return nullptr;
71#endif
72
73 QMutexLocker locker(&socketHandlers()->mutex);
74 for (int i = 0; i < socketHandlers()->size(); i++) {
75 if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketType, proxy, parent))
76 return ret;
77 }
78
79#ifndef QT_NO_NETWORKPROXY
80 // only NoProxy can have reached here
81 if (proxy.type() != QNetworkProxy::NoProxy)
82 return nullptr;
83#endif
84
85 return new QNativeSocketEngine(parent);
86}
87
88QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(qintptr socketDescripter, QObject *parent)
89{
90 QMutexLocker locker(&socketHandlers()->mutex);
91 for (int i = 0; i < socketHandlers()->size(); i++) {
92 if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketDescripter, parent))
93 return ret;
94 }
95 return new QNativeSocketEngine(parent);
96}
97
98QAbstractSocket::SocketError QAbstractSocketEngine::error() const
99{
100 return d_func()->socketError;
101}
102
103QString QAbstractSocketEngine::errorString() const
104{
105 return d_func()->socketErrorString;
106}
107
108void QAbstractSocketEngine::setError(QAbstractSocket::SocketError error, const QString &errorString) const
109{
110 Q_D(const QAbstractSocketEngine);
111 d->socketError = error;
112 d->socketErrorString = errorString;
113}
114
115void QAbstractSocketEngine::setReceiver(QAbstractSocketEngineReceiver *receiver)
116{
117 d_func()->receiver = receiver;
118}
119
120void QAbstractSocketEngine::readNotification()
121{
122 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
123 receiver->readNotification();
124}
125
126void QAbstractSocketEngine::writeNotification()
127{
128 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
129 receiver->writeNotification();
130}
131
132void QAbstractSocketEngine::exceptionNotification()
133{
134 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
135 receiver->exceptionNotification();
136}
137
138void QAbstractSocketEngine::closeNotification()
139{
140 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
141 receiver->closeNotification();
142}
143
144void QAbstractSocketEngine::connectionNotification()
145{
146 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
147 receiver->connectionNotification();
148}
149
150#ifndef QT_NO_NETWORKPROXY
151void QAbstractSocketEngine::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
152{
153 if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
154 receiver->proxyAuthenticationRequired(proxy, authenticator);
155}
156#endif
157
158
159QAbstractSocket::SocketState QAbstractSocketEngine::state() const
160{
161 return d_func()->socketState;
162}
163
164void QAbstractSocketEngine::setState(QAbstractSocket::SocketState state)
165{
166 d_func()->socketState = state;
167}
168
169QAbstractSocket::SocketType QAbstractSocketEngine::socketType() const
170{
171 return d_func()->socketType;
172}
173
174void QAbstractSocketEngine::setSocketType(QAbstractSocket::SocketType socketType)
175{
176 d_func()->socketType = socketType;
177}
178
179QAbstractSocket::NetworkLayerProtocol QAbstractSocketEngine::protocol() const
180{
181 return d_func()->socketProtocol;
182}
183
184void QAbstractSocketEngine::setProtocol(QAbstractSocket::NetworkLayerProtocol protocol)
185{
186 d_func()->socketProtocol = protocol;
187}
188
189QHostAddress QAbstractSocketEngine::localAddress() const
190{
191 return d_func()->localAddress;
192}
193
194void QAbstractSocketEngine::setLocalAddress(const QHostAddress &address)
195{
196 d_func()->localAddress = address;
197}
198
199quint16 QAbstractSocketEngine::localPort() const
200{
201 return d_func()->localPort;
202}
203
204void QAbstractSocketEngine::setLocalPort(quint16 port)
205{
206 d_func()->localPort = port;
207}
208
209QHostAddress QAbstractSocketEngine::peerAddress() const
210{
211 return d_func()->peerAddress;
212}
213
214void QAbstractSocketEngine::setPeerAddress(const QHostAddress &address)
215{
216 d_func()->peerAddress = address;
217}
218
219quint16 QAbstractSocketEngine::peerPort() const
220{
221 return d_func()->peerPort;
222}
223
224void QAbstractSocketEngine::setPeerPort(quint16 port)
225{
226 d_func()->peerPort = port;
227}
228
229int QAbstractSocketEngine::inboundStreamCount() const
230{
231 return d_func()->inboundStreamCount;
232}
233
234int QAbstractSocketEngine::outboundStreamCount() const
235{
236 return d_func()->outboundStreamCount;
237}
238
239QT_END_NAMESPACE
240
241#include "moc_qabstractsocketengine_p.cpp"