#include #include // Qt includes #include #include // Utility includes #include #include #include namespace { const bool verboseProvider = false; } // End of constants MdnsProvider::MdnsProvider(QObject* parent) : QObject(parent) , _log(Logger::getInstance("MDNS")) , _server(nullptr) , _hostname(nullptr) { } void MdnsProvider::init() { _server.reset(new QMdnsEngine::Server()); _hostname.reset(new QMdnsEngine::Hostname(_server.data())); connect(_hostname.data(), &QMdnsEngine::Hostname::hostnameChanged, this, &MdnsProvider::onHostnameChanged); DebugIf(verboseProvider, _log, "Hostname [%s], isRegistered [%d]", _hostname->hostname().constData(), _hostname->isRegistered()); } MdnsProvider::~MdnsProvider() { _providedServiceTypes.clear(); } void MdnsProvider::publishService(const QString& serviceType, quint16 servicePort, const QByteArray& serviceName) { 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)) { 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 { Error(_log, "Not able to get hold of mDNS serviceType [%s]", type.constData()); } } } void MdnsProvider::onHostnameChanged(const QByteArray& hostname) { DebugIf(verboseProvider, _log, "mDNS-hostname changed to hostname [%s]", hostname.constData()); }