diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ else() set(KF5_MIN_VERSION "5.42.0") set(QT_MIN_VERSION "5.7.0") - set(KF5_REQUIRED_COMPONENTS I18n ConfigWidgets DBusAddons IconThemes Notifications KIO KCMUtils) + set(KF5_REQUIRED_COMPONENTS I18n ConfigWidgets DBusAddons IconThemes Notifications KIO KCMUtils DNSSD) set(KF5_OPTIONAL_COMPONENTS DocTools) if(UNIX) set(KF5_OPTIONAL_COMPONENTS ${KF5_OPTIONAL_COMPONENTS} PulseAudioQt) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -47,6 +47,7 @@ Qt5::Gui KF5::I18n KF5::ConfigCore + KF5::DNSSD ) if (BLUETOOTH_ENABLED) diff --git a/core/backends/lan/lanlinkprovider.h b/core/backends/lan/lanlinkprovider.h --- a/core/backends/lan/lanlinkprovider.h +++ b/core/backends/lan/lanlinkprovider.h @@ -34,6 +34,10 @@ #include "server.h" #include "landevicelink.h" +namespace KDNSSD { + class PublicService; +}; + class LanPairingHandler; class KDECONNECTCORE_EXPORT LanLinkProvider : public LinkProvider @@ -79,6 +83,7 @@ void onNetworkConfigurationChanged(const QNetworkConfiguration& config); void addLink(const QString& deviceId, QSslSocket* socket, NetworkPacket* receivedPacket, LanDeviceLink::ConnectionStarted connectionOrigin); + void initializeMDNS(); Server* m_server; QUdpSocket m_udpSocket; @@ -95,6 +100,7 @@ QNetworkConfiguration m_lastConfig; const bool m_testMode; QTimer m_combineBroadcastsTimer; + KDNSSD::PublicService *m_publisher = nullptr; }; #endif diff --git a/core/backends/lan/lanlinkprovider.cpp b/core/backends/lan/lanlinkprovider.cpp --- a/core/backends/lan/lanlinkprovider.cpp +++ b/core/backends/lan/lanlinkprovider.cpp @@ -28,6 +28,8 @@ #include #endif +#include + #include #include #include @@ -108,13 +110,40 @@ m_server->close(); } +void LanLinkProvider::initializeMDNS() +{ + // We leverage the existing identity packet to avoid duplicating code for reading the wanted attributes. + NetworkPacket np(QLatin1String("")); + NetworkPacket::createIdentityPacket(&np); + + QMap data; + data["protocolVersion"] = np.get(QStringLiteral("protocolVersion"), QStringLiteral("unknown")).toUtf8(); + data["type"] = np.get(QStringLiteral("deviceType"), QStringLiteral("unknown")).toUtf8(); + data["name"] = np.get(QStringLiteral("deviceName"), QStringLiteral("unknown")).toUtf8(); + data["id"] = np.get(QStringLiteral("deviceId"), QStringLiteral("unknown")).toUtf8(); + + // Restart the publishing. + delete m_publisher; + m_publisher = nullptr; + m_publisher = new KDNSSD::PublicService("KDEConnect on " + data["name"], "_kdeconnect._tcp", m_tcpPort); + m_publisher->setTextData(data); + + if (m_publisher->publish()) { + qCDebug(KDECONNECT_CORE) << "mDNS: successful publishing" << data["name"]; + } else { + qCDebug(KDECONNECT_CORE) << "mDNS: failed to publish."; + } +} + void LanLinkProvider::onNetworkChange() { if (m_combineBroadcastsTimer.isActive()) { qCDebug(KDECONNECT_CORE()) << "Preventing duplicate broadcasts"; return; } m_combineBroadcastsTimer.start(); + + initializeMDNS(); } //I'm in a new network, let's be polite and introduce myself