diff --git a/bonjour.cpp b/bonjour.cpp index 88eb3cc..b7c364d 100644 --- a/bonjour.cpp +++ b/bonjour.cpp @@ -103,50 +103,62 @@ void QZeroConfPrivate::resolve(QZeroConfService zcs) void DNSSD_API QZeroConfPrivate::registerCallback(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *, const char *, const char *, void *userdata) { - QZeroConfPrivate *ref = static_cast(userdata); - - if (errorCode == kDNSServiceErr_NoError) { - emit ref->pub->servicePublished(); - } - else { - ref->cleanUp(ref->dnssRef); - emit ref->pub->error(QZeroConf::serviceRegistrationFailed); - } + QObject *base = static_cast(userdata); + QZeroConfPrivate *ref = dynamic_cast(base); + if (ref) { + if (errorCode == kDNSServiceErr_NoError) { + emit ref->pub->servicePublished(); + } + else { + ref->cleanUp(ref->dnssRef); + emit ref->pub->error(QZeroConf::serviceRegistrationFailed); + } + } + else { + qDebug() << __FUNCTION__ << "userdata is corrupted"; + } } void DNSSD_API QZeroConfPrivate::browseCallback(DNSServiceRef, DNSServiceFlags flags, quint32 interfaceIndex, DNSServiceErrorType err, const char *name, const char *type, const char *domain, void *userdata) { - QString key; - QZeroConfService zcs; - QZeroConfPrivate *ref = static_cast(userdata); - - //qDebug() << name; - if (err == kDNSServiceErr_NoError) { - key = name + QString::number(interfaceIndex); - if (flags & kDNSServiceFlagsAdd) { - if (!ref->pub->services.contains(key)) { - zcs = QZeroConfService::create(); - zcs->m_name = name; - zcs->m_type = type; - zcs->m_domain = domain; - zcs->m_interfaceIndex = interfaceIndex; - ref->resolve(zcs); - } - } - else if (ref->pub->services.contains(key)) { - zcs = ref->pub->services[key]; - ref->pub->services.remove(key); - if (ref->resolvers.contains(key)) - ref->resolvers[key]->cleanUp(); - emit ref->pub->serviceRemoved(zcs); - } - } - else { - ref->cleanUp(ref->browser); - emit ref->pub->error(QZeroConf::browserFailed); - } + QString key; + QZeroConfService zcs; + + QObject *base = static_cast(userdata); + QZeroConfPrivate *ref = dynamic_cast(base); + + if (ref) { + //qDebug() << name; + if (err == kDNSServiceErr_NoError) { + key = name + QString::number(interfaceIndex); + if (flags & kDNSServiceFlagsAdd) { + if (!ref->pub->services.contains(key)) { + zcs = QZeroConfService::create(); + zcs->m_name = name; + zcs->m_type = type; + zcs->m_domain = domain; + zcs->m_interfaceIndex = interfaceIndex; + ref->resolve(zcs); + } + } + else if (ref->pub->services.contains(key)) { + zcs = ref->pub->services[key]; + ref->pub->services.remove(key); + if (ref->resolvers.contains(key)) + ref->resolvers[key]->cleanUp(); + emit ref->pub->serviceRemoved(zcs); + } + } + else { + ref->cleanUp(ref->browser); + emit ref->pub->error(QZeroConf::browserFailed); + } + } + else { + qDebug() << __FUNCTION__ << "userdata is corrupted"; + } } void DNSSD_API QZeroConfPrivate::resolverCallback(DNSServiceRef, DNSServiceFlags, @@ -154,7 +166,12 @@ void DNSSD_API QZeroConfPrivate::resolverCallback(DNSServiceRef, DNSServiceFlags const char *hostName, quint16 port, quint16 txtLen, const unsigned char *txtRecord, void *userdata) { - Resolver *resolver = static_cast(userdata); + QObject *base = static_cast(userdata); + Resolver *resolver = dynamic_cast(base); + if (!resolver) { + qDebug() << __FUNCTION__ << "userdata is corrupted"; + return; + } if (err != kDNSServiceErr_NoError) { resolver->cleanUp(); @@ -211,12 +228,14 @@ void DNSSD_API QZeroConfPrivate::addressReply(DNSServiceRef sdRef, Q_UNUSED(ttl) Q_UNUSED(hostName) - Resolver *resolver = static_cast(userdata); + QObject *base = static_cast(userdata); + Resolver *resolver = dynamic_cast(base); - if (err == kDNSServiceErr_NoError) { - if ((flags & kDNSServiceFlagsAdd) != 0) { - QHostAddress hAddress(address); - resolver->zcs->setIp(hAddress); + if (resolver) { + if (err == kDNSServiceErr_NoError) { + if ((flags & kDNSServiceFlagsAdd) != 0) { + QHostAddress hAddress(address); + resolver->zcs->setIp(hAddress); QString key = resolver->zcs->name() + QString::number(interfaceIndex); if (!resolver->ref->pub->services.contains(key)) { @@ -226,30 +245,37 @@ void DNSSD_API QZeroConfPrivate::addressReply(DNSServiceRef sdRef, else emit resolver->ref->pub->serviceUpdated(resolver->zcs); - } - } - else - resolver->cleanUp(); + } + } + else { + resolver->cleanUp(); + } + } + else { + qDebug() << __FUNCTION__ << "userdata is corrupted"; + } } void QZeroConfPrivate::cleanUp(DNSServiceRef toClean) { - if (!toClean) - return; - else if (toClean == browser) { - browser = nullptr; - browserNotifier.clear(); - for (auto resolver : resolvers) - resolver->cleanUp(); - resolvers.clear(); - for (auto service : pub->services) - emit pub->serviceRemoved(service); - pub->services.clear(); - } - else if (toClean == dnssRef) { - dnssRef = nullptr; - serviceNotifier.clear(); - } + if (!toClean) + return; + else if (toClean == browser) { + browser = nullptr; + browserNotifier.clear(); + const QList resolverList = resolvers.values(); + for (Resolver *resolver : resolverList) + resolver->cleanUp(); + resolvers.clear(); + const QList serviceList = pub->services.values(); + pub->services.clear(); + for (const QZeroConfService &service : serviceList) + emit pub->serviceRemoved(service); + } + else if (toClean == dnssRef) { + dnssRef = nullptr; + serviceNotifier.clear(); + } DNSServiceRefDeallocate(toClean); }