/src/qtbase/src/network/socket/qnativesocketengine_p.h
Line | Count | Source |
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 QNATIVESOCKETENGINE_P_H |
7 | | #define QNATIVESOCKETENGINE_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/qnetworkinterface.h" |
23 | | #include "private/qabstractsocketengine_p.h" |
24 | | #include "qplatformdefs.h" |
25 | | |
26 | | #ifndef Q_OS_WIN |
27 | | # include <netinet/in.h> |
28 | | #else |
29 | | # include <winsock2.h> |
30 | | # include <ws2tcpip.h> |
31 | | # include <mswsock.h> |
32 | | #endif |
33 | | |
34 | | QT_BEGIN_NAMESPACE |
35 | | |
36 | | #ifdef Q_OS_WIN |
37 | | # define QT_SOCKLEN_T int |
38 | | # define QT_SOCKOPTLEN_T int |
39 | | #endif |
40 | | |
41 | | namespace { |
42 | | namespace SetSALen { |
43 | | template <typename T> void set(T *sa, typename std::enable_if<(&T::sa_len, true), QT_SOCKLEN_T>::type len) |
44 | | { sa->sa_len = len; } |
45 | | template <typename T> void set(T *sa, typename std::enable_if<(&T::sin_len, true), QT_SOCKLEN_T>::type len) |
46 | | { sa->sin_len = len; } |
47 | | template <typename T> void set(T *sin6, typename std::enable_if<(&T::sin6_len, true), QT_SOCKLEN_T>::type len) |
48 | | { sin6->sin6_len = len; } |
49 | 0 | template <typename T> void set(T *, ...) {}Unexecuted instantiation: qdtls_openssl.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...) Unexecuted instantiation: qdtls_openssl.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...) Unexecuted instantiation: qabstractsocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...) Unexecuted instantiation: qabstractsocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...) Unexecuted instantiation: qnativesocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...) Unexecuted instantiation: qnativesocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...) Unexecuted instantiation: qnativesocketengine_unix.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...) Unexecuted instantiation: qnativesocketengine_unix.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...) |
50 | | } |
51 | | |
52 | | inline QT_SOCKLEN_T setSockaddr(sockaddr_in *sin, const QHostAddress &addr, quint16 port = 0) |
53 | 0 | { |
54 | 0 | *sin = {}; |
55 | 0 | SetSALen::set(sin, sizeof(*sin)); |
56 | 0 | sin->sin_family = AF_INET; |
57 | 0 | sin->sin_port = htons(port); |
58 | 0 | sin->sin_addr.s_addr = htonl(addr.toIPv4Address()); |
59 | 0 | return sizeof(*sin); |
60 | 0 | } Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short) Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short) |
61 | | |
62 | | inline QT_SOCKLEN_T setSockaddr(sockaddr_in6 *sin6, const QHostAddress &addr, quint16 port = 0) |
63 | 0 | { |
64 | 0 | *sin6 = {}; |
65 | 0 | SetSALen::set(sin6, sizeof(*sin6)); |
66 | 0 | sin6->sin6_family = AF_INET6; |
67 | 0 | sin6->sin6_port = htons(port); |
68 | 0 | memcpy(sin6->sin6_addr.s6_addr, addr.toIPv6Address().c, sizeof(sin6->sin6_addr)); |
69 | 0 | #if QT_CONFIG(networkinterface) |
70 | 0 | sin6->sin6_scope_id = QNetworkInterface::interfaceIndexFromName(addr.scopeId()); |
71 | | #else |
72 | | // it had better be a number then, if it is not empty |
73 | | sin6->sin6_scope_id = addr.scopeId().toUInt(); |
74 | | #endif |
75 | 0 | return sizeof(*sin6); |
76 | 0 | } Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short) Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short) |
77 | | |
78 | | inline QT_SOCKLEN_T setSockaddr(sockaddr *sa, const QHostAddress &addr, quint16 port = 0) |
79 | 0 | { |
80 | 0 | switch (addr.protocol()) { |
81 | 0 | case QHostAddress::IPv4Protocol: |
82 | 0 | return setSockaddr(reinterpret_cast<sockaddr_in *>(sa), addr, port); |
83 | | |
84 | 0 | case QHostAddress::IPv6Protocol: |
85 | 0 | case QHostAddress::AnyIPProtocol: |
86 | 0 | return setSockaddr(reinterpret_cast<sockaddr_in6 *>(sa), addr, port); |
87 | | |
88 | 0 | case QHostAddress::UnknownNetworkLayerProtocol: |
89 | 0 | break; |
90 | 0 | } |
91 | 0 | *sa = {}; |
92 | 0 | sa->sa_family = AF_UNSPEC; |
93 | 0 | return 0; |
94 | 0 | } Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short) Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short) Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short) |
95 | | } // unnamed namespace |
96 | | |
97 | | class QNativeSocketEnginePrivate; |
98 | | #ifndef QT_NO_NETWORKINTERFACE |
99 | | class QNetworkInterface; |
100 | | #endif |
101 | | |
102 | | class Q_AUTOTEST_EXPORT QNativeSocketEngine : public QAbstractSocketEngine |
103 | | { |
104 | 0 | Q_OBJECT |
105 | 0 | public: |
106 | 0 | QNativeSocketEngine(QObject *parent = nullptr); |
107 | 0 | ~QNativeSocketEngine(); |
108 | 0 |
|
109 | 0 | bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) override; |
110 | 0 | bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) override; |
111 | 0 |
|
112 | 0 | qintptr socketDescriptor() const override; |
113 | 0 |
|
114 | 0 | bool isValid() const override; |
115 | 0 |
|
116 | 0 | bool connectToHost(const QHostAddress &address, quint16 port) override; |
117 | 0 | bool connectToHostByName(const QString &name, quint16 port) override; |
118 | 0 | bool bind(const QHostAddress &address, quint16 port) override; |
119 | 0 | bool listen(int backlog) override; |
120 | 0 | qintptr accept() override; |
121 | 0 | void close() override; |
122 | 0 |
|
123 | 0 | qint64 bytesAvailable() const override; |
124 | 0 |
|
125 | 0 | qint64 read(char *data, qint64 maxlen) override; |
126 | 0 | qint64 write(const char *data, qint64 len) override; |
127 | 0 |
|
128 | 0 | #ifndef QT_NO_UDPSOCKET |
129 | 0 | #ifndef QT_NO_NETWORKINTERFACE |
130 | 0 | bool joinMulticastGroup(const QHostAddress &groupAddress, |
131 | 0 | const QNetworkInterface &iface) override; |
132 | 0 | bool leaveMulticastGroup(const QHostAddress &groupAddress, |
133 | 0 | const QNetworkInterface &iface) override; |
134 | 0 | QNetworkInterface multicastInterface() const override; |
135 | 0 | bool setMulticastInterface(const QNetworkInterface &iface) override; |
136 | 0 | #endif |
137 | 0 |
|
138 | 0 | bool hasPendingDatagrams() const override; |
139 | 0 | qint64 pendingDatagramSize() const override; |
140 | 0 | #endif // QT_NO_UDPSOCKET |
141 | 0 |
|
142 | 0 | qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader * = nullptr, |
143 | 0 | PacketHeaderOptions = WantNone) override; |
144 | 0 | qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &) override; |
145 | 0 | qint64 bytesToWrite() const override; |
146 | 0 |
|
147 | 0 | #if 0 // currently unused |
148 | 0 | qint64 receiveBufferSize() const; |
149 | 0 | void setReceiveBufferSize(qint64 bufferSize); |
150 | 0 |
|
151 | 0 | qint64 sendBufferSize() const; |
152 | 0 | void setSendBufferSize(qint64 bufferSize); |
153 | 0 | #endif |
154 | 0 |
|
155 | 0 | int option(SocketOption option) const override; |
156 | 0 | bool setOption(SocketOption option, int value) override; |
157 | 0 |
|
158 | 0 | bool waitForRead(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout}, |
159 | 0 | bool *timedOut = nullptr) override; |
160 | 0 | bool waitForWrite(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout}, |
161 | 0 | bool *timedOut = nullptr) override; |
162 | 0 | bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite, |
163 | 0 | bool checkRead, bool checkWrite, |
164 | 0 | QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout}, |
165 | 0 | bool *timedOut = nullptr) override; |
166 | 0 |
|
167 | 0 | bool isReadNotificationEnabled() const override; |
168 | 0 | void setReadNotificationEnabled(bool enable) override; |
169 | 0 | bool isWriteNotificationEnabled() const override; |
170 | 0 | void setWriteNotificationEnabled(bool enable) override; |
171 | 0 | bool isExceptionNotificationEnabled() const override; |
172 | 0 | void setExceptionNotificationEnabled(bool enable) override; |
173 | 0 |
|
174 | 0 | public Q_SLOTS: |
175 | 0 | // non-virtual override; |
176 | 0 | void connectionNotification(); |
177 | 0 |
|
178 | 0 | private: |
179 | | Q_DECLARE_PRIVATE(QNativeSocketEngine) Unexecuted instantiation: QNativeSocketEngine::d_func() Unexecuted instantiation: QNativeSocketEngine::d_func() const |
180 | | Q_DISABLE_COPY_MOVE(QNativeSocketEngine) |
181 | | }; |
182 | | |
183 | | QT_END_NAMESPACE |
184 | | |
185 | | #endif // QNATIVESOCKETENGINE_P_H |