From e8f19e21c45ed97104a63d01ac426b16565f9f9a Mon Sep 17 00:00:00 2001 From: LordGrey <48840279+Lord-Grey@users.noreply.github.com> Date: Sat, 30 Dec 2023 19:27:53 +0100 Subject: [PATCH] Change mDNS to Qt SmartPointers --- include/mdns/MdnsBrowser.h | 14 ++++---- include/mdns/MdnsProvider.h | 7 ++-- libsrc/mdns/MdnsBrowser.cpp | 52 +++++++++++++-------------- libsrc/mdns/MdnsProvider.cpp | 68 +++++++++++++++++------------------- 4 files changed, 67 insertions(+), 74 deletions(-) diff --git a/include/mdns/MdnsBrowser.h b/include/mdns/MdnsBrowser.h index 16376ddc..a5071b13 100644 --- a/include/mdns/MdnsBrowser.h +++ b/include/mdns/MdnsBrowser.h @@ -2,7 +2,6 @@ #define MDNS_BROWSER_H #include -#include #include #include @@ -16,6 +15,9 @@ // Qt includes #include #include +#include +#include +#include // Utility includes #include @@ -24,15 +26,12 @@ namespace { constexpr std::chrono::milliseconds DEFAULT_DISCOVER_TIMEOUT{ 500 }; constexpr std::chrono::milliseconds DEFAULT_ADDRESS_RESOLVE_TIMEOUT{ 1000 }; - -} //End of constants +} // End of constants class MdnsBrowser : public QObject { Q_OBJECT - // Run MdnsBrowser as singleton - private: /// /// @brief Browse for hyperion services in bonjour, constructed from HyperionDaemon @@ -58,7 +57,6 @@ public: QMdnsEngine::Service getFirstService(const QByteArray& serviceType, const QString& filter = ".*", const std::chrono::milliseconds waitTime = DEFAULT_DISCOVER_TIMEOUT) const; QJsonArray getServicesDiscoveredJson(const QByteArray& serviceType, const QString& filter = ".*", const std::chrono::milliseconds waitTime = std::chrono::milliseconds{ 0 }) const; - void printCache(const QByteArray& name = QByteArray(), quint16 type = QMdnsEngine::ANY) const; public slots: @@ -109,9 +107,9 @@ private: QMdnsEngine::Server _server; QMdnsEngine::Cache _cache; - QMdnsEngine::Resolver* _resolver; + QSharedPointer _resolver; - QMap _browsedServiceTypes; + QMap> _browsedServiceTypes; }; #endif // MDNSBROWSER_H diff --git a/include/mdns/MdnsProvider.h b/include/mdns/MdnsProvider.h index 80deb7c1..c3e328c7 100644 --- a/include/mdns/MdnsProvider.h +++ b/include/mdns/MdnsProvider.h @@ -9,6 +9,7 @@ // Qt includes #include #include +#include // Utility includes #include @@ -41,11 +42,11 @@ private: /// The logger instance for mDNS-Service Logger* _log; - QMdnsEngine::Server* _server; - QMdnsEngine::Hostname* _hostname; + QScopedPointer _server; + QScopedPointer _hostname; /// map of services provided - QMap _providedServiceTypes; + QMap> _providedServiceTypes; }; #endif // MDNSPROVIDER_H diff --git a/libsrc/mdns/MdnsBrowser.cpp b/libsrc/mdns/MdnsBrowser.cpp index dab5092a..6bf3e233 100644 --- a/libsrc/mdns/MdnsBrowser.cpp +++ b/libsrc/mdns/MdnsBrowser.cpp @@ -2,9 +2,8 @@ #include #include -//Qt includes +// Qt includes #include - #include #include #include @@ -19,7 +18,8 @@ namespace { const bool verboseBrowser = false; -} //End of constants + const int SERVICE_LOOKUP_RETRIES = 5; +} // End of constants MdnsBrowser::MdnsBrowser(QObject* parent) : QObject(parent) @@ -30,11 +30,7 @@ MdnsBrowser::MdnsBrowser(QObject* parent) MdnsBrowser::~MdnsBrowser() { - qDeleteAll(_browsedServiceTypes); _browsedServiceTypes.clear(); - - disconnect(_resolver, &QMdnsEngine::Resolver::resolved, this, &MdnsBrowser::onHostNameResolved); - delete _resolver; } void MdnsBrowser::browseForServiceType(const QByteArray& serviceType) @@ -42,11 +38,11 @@ void MdnsBrowser::browseForServiceType(const QByteArray& serviceType) if (!_browsedServiceTypes.contains(serviceType)) { DebugIf(verboseBrowser, _log, "Start new mDNS browser for serviceType [%s], Thread: %s", serviceType.constData(), QSTRING_CSTR(QThread::currentThread()->objectName())); - QMdnsEngine::Browser* newBrowser = new QMdnsEngine::Browser(&_server, serviceType, &_cache); + QSharedPointer newBrowser = QSharedPointer::create(&_server, serviceType, &_cache); - QObject::connect(newBrowser, &QMdnsEngine::Browser::serviceAdded, this, &MdnsBrowser::onServiceAdded); - QObject::connect(newBrowser, &QMdnsEngine::Browser::serviceUpdated, this, &MdnsBrowser::onServiceUpdated); - QObject::connect(newBrowser, &QMdnsEngine::Browser::serviceRemoved, this, &MdnsBrowser::onServiceRemoved); + QObject::connect(newBrowser.get(), &QMdnsEngine::Browser::serviceAdded, this, &MdnsBrowser::onServiceAdded); + QObject::connect(newBrowser.get(), &QMdnsEngine::Browser::serviceUpdated, this, &MdnsBrowser::onServiceUpdated); + QObject::connect(newBrowser.get(), &QMdnsEngine::Browser::serviceRemoved, this, &MdnsBrowser::onServiceRemoved); _browsedServiceTypes.insert(serviceType, newBrowser); } @@ -128,8 +124,8 @@ QHostAddress MdnsBrowser::getHostFirstAddress(const QByteArray& hostname) { DebugIf(verboseBrowser, _log, "IP-address for hostname [%s] not yet in cache, start resolver.", toBeResolvedHostName.constData()); qRegisterMetaType("Message"); - _resolver = new QMdnsEngine::Resolver(&_server, toBeResolvedHostName, &_cache); - connect(_resolver, &QMdnsEngine::Resolver::resolved, this, &MdnsBrowser::onHostNameResolved); + _resolver.reset(new QMdnsEngine::Resolver(&_server, toBeResolvedHostName, &_cache)); + connect(_resolver.get(), &QMdnsEngine::Resolver::resolved, this, &MdnsBrowser::onHostNameResolved); } } } @@ -153,7 +149,7 @@ void MdnsBrowser::onHostNameResolved(const QHostAddress& address) bool MdnsBrowser::resolveAddress(Logger* log, const QString& hostname, QHostAddress& hostAddress, std::chrono::milliseconds timeout) { - DebugIf(verboseBrowser, _log, "Get address for hostname [%s], Thread: %s", QSTRING_CSTR(hostname), QSTRING_CSTR(QThread::currentThread()->objectName())); + DebugIf(verboseBrowser, log, "Get address for hostname [%s], Thread: %s", QSTRING_CSTR(hostname), QSTRING_CSTR(QThread::currentThread()->objectName())); bool isHostAddressOK{ false }; if (hostname.endsWith(".local") || hostname.endsWith(".local.")) @@ -162,20 +158,20 @@ bool MdnsBrowser::resolveAddress(Logger* log, const QString& hostname, QHostAddr if (hostAddress.isNull()) { - DebugIf(verboseBrowser, _log, "Wait for resolver on hostname [%s]", QSTRING_CSTR(hostname)); + DebugIf(verboseBrowser, log, "Wait for resolver on hostname [%s]", QSTRING_CSTR(hostname)); QEventLoop loop; - QTimer t; - QObject::connect(&MdnsBrowser::getInstance(), &MdnsBrowser::addressResolved, &loop, &QEventLoop::quit); + QTimer timer; + QObject::connect(&MdnsBrowser::getInstance(), &MdnsBrowser::addressResolved, &loop, &QEventLoop::quit); weakConnect(&MdnsBrowser::getInstance(), &MdnsBrowser::addressResolved, - [&hostAddress, hostname](const QHostAddress& resolvedAddress) { - DebugIf(verboseBrowser, Logger::getInstance("MDNS"), "Resolver resolved hostname [%s] to address [%s], Thread: %s", QSTRING_CSTR(hostname), QSTRING_CSTR(resolvedAddress.toString()), QSTRING_CSTR(QThread::currentThread()->objectName())); + [&hostAddress, hostname, log](const QHostAddress& resolvedAddress) { + DebugIf(verboseBrowser, log, "Resolver resolved hostname [%s] to address [%s], Thread: %s", QSTRING_CSTR(hostname), QSTRING_CSTR(resolvedAddress.toString()), QSTRING_CSTR(QThread::currentThread()->objectName())); hostAddress = resolvedAddress; }); - QTimer::connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit); - t.start(static_cast(timeout.count())); + QTimer::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + timer.start(static_cast(timeout.count())); loop.exec(); } @@ -210,8 +206,8 @@ QMdnsEngine::Record MdnsBrowser::getServiceInstanceRecord(const QByteArray& serv } QMdnsEngine::Record srvRecord; - bool found{ false }; - int retries = 5; + bool found { false }; + int retries { SERVICE_LOOKUP_RETRIES }; do { if (_cache.lookupRecord(service, QMdnsEngine::SRV, srvRecord)) @@ -323,7 +319,7 @@ QJsonArray MdnsBrowser::getServicesDiscoveredJson(const QByteArray& serviceType, QJsonArray result; - QRegularExpression regEx(filter); + static QRegularExpression regEx(filter); if (!regEx.isValid()) { QString errorString = regEx.errorString(); int errorOffset = regEx.patternErrorOffset(); @@ -397,10 +393,10 @@ QJsonArray MdnsBrowser::getServicesDiscoveredJson(const QByteArray& serviceType, QMap txtAttributes = txtRecord.attributes(); QVariantMap txtMap; - QMapIterator i(txtAttributes); - while (i.hasNext()) { - i.next(); - txtMap.insert(i.key(), i.value()); + QMapIterator iterator(txtAttributes); + while (iterator.hasNext()) { + iterator.next(); + txtMap.insert(iterator.key(), iterator.value()); } obj.insert("txt", QJsonObject::fromVariantMap(txtMap)); } diff --git a/libsrc/mdns/MdnsProvider.cpp b/libsrc/mdns/MdnsProvider.cpp index 953d3b60..b894cac8 100644 --- a/libsrc/mdns/MdnsProvider.cpp +++ b/libsrc/mdns/MdnsProvider.cpp @@ -1,7 +1,7 @@ #include #include -//Qt includes +// Qt includes #include #include @@ -12,7 +12,7 @@ namespace { const bool verboseProvider = false; -} //End of constants +} // End of constants MdnsProvider::MdnsProvider(QObject* parent) : QObject(parent) @@ -24,61 +24,59 @@ MdnsProvider::MdnsProvider(QObject* parent) void MdnsProvider::init() { - _server = new QMdnsEngine::Server(); - _hostname = new QMdnsEngine::Hostname(_server); + _server.reset(new QMdnsEngine::Server()); + _hostname.reset(new QMdnsEngine::Hostname(_server.data())); - connect(_hostname, &QMdnsEngine::Hostname::hostnameChanged, this, &MdnsProvider::onHostnameChanged); + connect(_hostname.data(), &QMdnsEngine::Hostname::hostnameChanged, this, &MdnsProvider::onHostnameChanged); DebugIf(verboseProvider, _log, "Hostname [%s], isRegistered [%d]", _hostname->hostname().constData(), _hostname->isRegistered()); } MdnsProvider::~MdnsProvider() { - disconnect(_hostname, &QMdnsEngine::Hostname::hostnameChanged, this, &MdnsProvider::onHostnameChanged); - - qDeleteAll(_providedServiceTypes); _providedServiceTypes.clear(); - - delete _hostname; - delete _server; } void MdnsProvider::publishService(const QString& serviceType, quint16 servicePort, const QByteArray& serviceName) { - QMdnsEngine::Provider* provider(nullptr); - QByteArray type = MdnsServiceRegister::getServiceType(serviceType); + if (!type.isEmpty()) { DebugIf(verboseProvider, _log, "Publish new mDNS serviceType [%s], Thread: %s", type.constData(), QSTRING_CSTR(QThread::currentThread()->objectName())); if (!_providedServiceTypes.contains(type)) { - provider = new QMdnsEngine::Provider(_server, _hostname); - _providedServiceTypes.insert(type, provider); + QSharedPointer newProvider = QSharedPointer::create(_server.data(), _hostname.data()); + _providedServiceTypes.insert(type, newProvider); + + } + + QSharedPointer provider = _providedServiceTypes.value(type); + if (!provider.isNull()) + { + QMdnsEngine::Service service; + service.setType(type); + service.setPort(servicePort); + + QByteArray name(QHostInfo::localHostName().toUtf8()); + if (!serviceName.isEmpty()) + { + name.prepend(serviceName + "@"); + } + service.setName(name); + + QByteArray uuid = AuthManager::getInstance()->getID().toUtf8(); + const QMap attributes = {{"id", uuid}, {"version", HYPERION_VERSION}}; + service.setAttributes(attributes); + + DebugIf(verboseProvider, _log, "[%s], Name: [%s], Port: [%u] ", service.type().constData(), service.name().constData(), service.port()); + + provider->update(service); } else { - provider = _providedServiceTypes[type]; + Error(_log, "Not able to get hold of mDNS serviceType [%s]", type.constData()); } - - QMdnsEngine::Service service; - service.setType(type); - service.setPort(servicePort); - - QByteArray name(QHostInfo::localHostName().toUtf8()); - if (!serviceName.isEmpty()) - { - name.prepend(serviceName + "@"); - } - service.setName(name); - - QByteArray id = AuthManager::getInstance()->getID().toUtf8(); - const QMap attributes = { {"id", id}, {"version", HYPERION_VERSION} }; - service.setAttributes(attributes); - - DebugIf(verboseProvider, _log, "[%s], Name: [%s], Port: [%u] ", service.type().constData(), service.name().constData(), service.port()); - - provider->update(service); } }