File indexing completed on 2024-05-05 04:58:43
0001 /** 0002 * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #ifndef LANLINKPROVIDER_H 0008 #define LANLINKPROVIDER_H 0009 0010 #include <QNetworkInformation> 0011 #include <QObject> 0012 #include <QSslSocket> 0013 #include <QTcpServer> 0014 #include <QTimer> 0015 #include <QUdpSocket> 0016 0017 #include "backends/linkprovider.h" 0018 #include "kdeconnectcore_export.h" 0019 #include "landevicelink.h" 0020 #include "server.h" 0021 #ifdef KDECONNECT_MDNS 0022 #include "mdnsdiscovery.h" 0023 #endif 0024 0025 class KDECONNECTCORE_EXPORT LanLinkProvider : public LinkProvider 0026 { 0027 Q_OBJECT 0028 0029 public: 0030 /** 0031 * @param testMode Some special overrides needed while testing 0032 */ 0033 LanLinkProvider(bool testMode = false); 0034 ~LanLinkProvider() override; 0035 0036 QString name() override 0037 { 0038 return QStringLiteral("LanLinkProvider"); 0039 } 0040 0041 int priority() override 0042 { 0043 return 20; 0044 } 0045 0046 void sendUdpIdentityPacket(const QList<QHostAddress> &addresses); 0047 0048 static void configureSslSocket(QSslSocket *socket, const QString &deviceId, bool isDeviceTrusted); 0049 static void configureSocket(QSslSocket *socket); 0050 0051 /** 0052 * This is the default UDP port both for broadcasting and receiving identity packets 0053 */ 0054 const static quint16 UDP_PORT = 1716; 0055 const static quint16 MIN_TCP_PORT = 1716; 0056 const static quint16 MAX_TCP_PORT = 1764; 0057 0058 public Q_SLOTS: 0059 void onNetworkChange() override; 0060 void onLinkDestroyed(const QString &deviceId, DeviceLink *oldPtr) override; 0061 void onStart() override; 0062 void onStop() override; 0063 void tcpSocketConnected(); 0064 void encrypted(); 0065 void connectError(QAbstractSocket::SocketError socketError); 0066 0067 private Q_SLOTS: 0068 void udpBroadcastReceived(); 0069 void newConnection(); 0070 void dataReceived(); 0071 void sslErrors(const QList<QSslError> &errors); 0072 void combinedOnNetworkChange(); 0073 0074 private: 0075 void addLink(QSslSocket *socket, const DeviceInfo &deviceInfo); 0076 QList<QHostAddress> getBroadcastAddresses(); 0077 void sendUdpIdentityPacket(QUdpSocket &socket, const QList<QHostAddress> &addresses); 0078 void broadcastUdpIdentityPacket(); 0079 0080 Server *m_server; 0081 QUdpSocket m_udpSocket; 0082 quint16 m_tcpPort; 0083 0084 QMap<QString, LanDeviceLink *> m_links; 0085 0086 struct PendingConnect { 0087 NetworkPacket *np; 0088 QHostAddress sender; 0089 }; 0090 QMap<QSslSocket *, PendingConnect> m_receivedIdentityPackets; 0091 QMap<QString, qint64> m_lastConnectionTime; 0092 const bool m_testMode; 0093 QTimer m_combineNetworkChangeTimer; 0094 0095 #ifdef KDECONNECT_MDNS 0096 MdnsDiscovery m_mdnsDiscovery; 0097 #endif 0098 }; 0099 0100 #endif