mirror of
https://github.com/jbagg/QtZeroConf.git
synced 2025-08-02 10:54:27 +02:00
Bonjour - Simplify work queue
This commit is contained in:
38
bonjour.cpp
38
bonjour.cpp
@@ -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) {
|
||||||
|
@@ -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:
|
||||||
|
Reference in New Issue
Block a user