Bonjour - Simplify work queue

This commit is contained in:
Jonathan Bagg
2017-11-06 20:54:34 -05:00
parent 1750662292
commit 87fd67c719
2 changed files with 19 additions and 24 deletions

View File

@@ -68,7 +68,7 @@ void QZeroConfPrivate::resolve(void)
{ {
DNSServiceErrorType err; DNSServiceErrorType err;
err = DNSServiceResolve(&resolver, kDNSServiceFlagsTimeout, newService.interfaceIndex(), newService.name().toUtf8(), newService.type().toUtf8(), newService.domain().toUtf8(), (DNSServiceResolveReply) resolverCallback, this); err = DNSServiceResolve(&resolver, kDNSServiceFlagsTimeout, work.head().interfaceIndex(), work.head().name().toUtf8(), work.head().type().toUtf8(), work.head().domain().toUtf8(), (DNSServiceResolveReply) resolverCallback, this);
if (err == kDNSServiceErr_NoError) { if (err == kDNSServiceErr_NoError) {
int sockfd = DNSServiceRefSockFD(resolver); int sockfd = DNSServiceRefSockFD(resolver);
if (sockfd == -1) { if (sockfd == -1) {
@@ -114,12 +114,12 @@ void DNSSD_API QZeroConfPrivate::browseCallback(DNSServiceRef, DNSServiceFlags f
zcs.setType(type); zcs.setType(type);
zcs.setDomain(domain); zcs.setDomain(domain);
zcs.setInterfaceIndex(interfaceIndex); zcs.setInterfaceIndex(interfaceIndex);
if (!ref->newService.isValid()) { if (!ref->work.size()) {
ref->newService = zcs; ref->work.enqueue(zcs);
ref->resolve(); ref->resolve();
} }
else else
ref->work.append(zcs); ref->work.enqueue(zcs);
} }
} }
else if (ref->pub->services.contains(key)) { else if (ref->pub->services.contains(key)) {
@@ -154,15 +154,15 @@ void DNSSD_API QZeroConfPrivate::resolverCallback(DNSServiceRef, DNSServiceFlags
QByteArray avahiText((const char *)txtRecord, recLen); QByteArray avahiText((const char *)txtRecord, recLen);
QList<QByteArray> pair = avahiText.split('='); QList<QByteArray> pair = avahiText.split('=');
if (pair.size() == 2) if (pair.size() == 2)
ref->newService.appendTxt(pair.at(0), pair.at(1)); ref->work.head().appendTxt(pair.at(0), pair.at(1));
else else
ref->newService.appendTxt(pair.at(0)); ref->work.head().appendTxt(pair.at(0));
txtLen-= recLen + 1; txtLen-= recLen + 1;
txtRecord+= recLen; txtRecord+= recLen;
} }
ref->newService.setHost(hostName); ref->work.head().setHost(hostName);
ref->newService.setPort(qFromBigEndian<quint16>(port)); ref->work.head().setPort(qFromBigEndian<quint16>(port));
err = DNSServiceGetAddrInfo(&ref->resolver, kDNSServiceFlagsForceMulticast, interfaceIndex, ref->protocol, hostName, (DNSServiceGetAddrInfoReply) addressReply, ref); err = DNSServiceGetAddrInfo(&ref->resolver, kDNSServiceFlagsForceMulticast, interfaceIndex, ref->protocol, hostName, (DNSServiceGetAddrInfoReply) addressReply, ref);
if (err == kDNSServiceErr_NoError) { if (err == kDNSServiceErr_NoError) {
int sockfd = DNSServiceRefSockFD(ref->resolver); int sockfd = DNSServiceRefSockFD(ref->resolver);
@@ -195,24 +195,22 @@ void DNSSD_API QZeroConfPrivate::addressReply(DNSServiceRef sdRef,
if ((flags & kDNSServiceFlagsAdd) != 0) { if ((flags & kDNSServiceFlagsAdd) != 0) {
QHostAddress hAddress(address); QHostAddress hAddress(address);
if (hAddress.protocol() == QAbstractSocket::IPv6Protocol) if (hAddress.protocol() == QAbstractSocket::IPv6Protocol)
ref->newService.setIpv6(hAddress); ref->work.head().setIpv6(hAddress);
else else
ref->newService.setIp(hAddress); ref->work.head().setIp(hAddress);
QString key = ref->newService.name() + QString::number(interfaceIndex); QString key = ref->work.head().name() + QString::number(interfaceIndex);
if (!ref->pub->services.contains(key)) { if (!ref->pub->services.contains(key)) {
ref->pub->services.insert(key, ref->newService); ref->pub->services.insert(key, ref->work.head());
emit ref->pub->serviceAdded(ref->newService); emit ref->pub->serviceAdded(ref->work.head());
} }
else else
emit ref->pub->serviceUpdated(ref->newService); emit ref->pub->serviceUpdated(ref->work.head());
} }
if (!(flags & kDNSServiceFlagsMoreComing)) { if (!(flags & kDNSServiceFlagsMoreComing))
ref->newService = QZeroConfService(); // newService resolve succeeded so don't let cleanUp delete it!
ref->cleanUp(ref->resolver); ref->cleanUp(ref->resolver);
} }
}
else else
ref->cleanUp(ref->resolver); ref->cleanUp(ref->resolver);
} }
@@ -230,12 +228,10 @@ void QZeroConfPrivate::cleanUp(DNSServiceRef toClean)
delete resolverSocket; delete resolverSocket;
resolverSocket = NULL; resolverSocket = NULL;
} }
if (work.size()) { work.dequeue();
newService = work.first(); if (work.size())
work.removeFirst();
resolve(); resolve();
} }
}
else if (toClean == browser) { else if (toClean == browser) {
browser = NULL; browser = NULL;
if (browserSocket) { if (browserSocket) {

View File

@@ -31,7 +31,7 @@
#include <QSocketNotifier> #include <QSocketNotifier>
#include <QtEndian> #include <QtEndian>
#include <QHostAddress> #include <QHostAddress>
#include <QList> #include <QQueue>
#include "qzeroconf.h" #include "qzeroconf.h"
#include <QDebug> #include <QDebug>
@@ -64,8 +64,7 @@ public:
DNSServiceRef dnssRef, browser, resolver; DNSServiceRef dnssRef, browser, resolver;
DNSServiceProtocol protocol; DNSServiceProtocol protocol;
QSocketNotifier *bs, *browserSocket, *resolverSocket, *addressSocket; QSocketNotifier *bs, *browserSocket, *resolverSocket, *addressSocket;
QZeroConfService newService; QQueue<QZeroConfService> work;
QList<QZeroConfService> work;
QByteArray txt; QByteArray txt;
public slots: public slots: