27
27
#include <sys/types.h>
29
29
#include <netinet/in.h>
30
#include <avahi-client/client.h>
31
#include <avahi-common/strlst.h>
33
#include <avahi-client/lookup.h>
30
35
#include "remoteservice.h"
31
36
#include "responder.h"
32
37
#include "sdevent.h"
38
void resolve_callback ( DNSServiceRef,
41
DNSServiceErrorType errorCode,
43
const char *hosttarget,
46
const unsigned char *txtRecord,
42
void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
43
const char* name, const char* type, const char* domain, const char* hostname, const AvahiAddress* a,
44
uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags, void* context);
46
void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
47
const char* name, const char* type, const char* domain, const char* hostname, const AvahiAddress* a,
48
uint16_t port, AvahiStringList* txt, void* context);
51
51
class RemoteServicePrivate : public Responder
54
RemoteServicePrivate() : Responder(), m_resolved(false)
54
RemoteServicePrivate() : m_resolved(false), m_running(false), m_resolver(0) {}
57
AvahiServiceResolver* m_resolver;
60
if (m_resolver) avahi_service_resolver_free(m_resolver);
59
65
RemoteService::RemoteService(const QString& label)
84
90
RemoteService::~RemoteService()
92
if (d->m_resolver) avahi_service_resolver_free(d->m_resolver);
89
96
bool RemoteService::resolve()
92
while (d->isRunning() && !d->m_resolved) d->process();
99
while (d->m_running && !d->m_resolved) Responder::self().process();
94
101
return d->m_resolved;
97
104
void RemoteService::resolveAsync()
99
if (d->isRunning()) return;
106
if (d->m_running) return;
100
107
d->m_resolved = false;
101
kdDebug() << this << ":Starting resolve of : " << m_serviceName << " " << m_type << " " << m_domain << "\n";
104
if (DNSServiceResolve(&ref,0,0,m_serviceName.utf8(), m_type.ascii(),
105
domainToDNS(m_domain),(DNSServiceResolveReply)resolve_callback,reinterpret_cast<void*>(this))
106
== kDNSServiceErr_NoError) d->setRef(ref);
108
// FIXME: first protocol should be set?
110
d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
111
m_serviceName.utf8(), m_type.ascii(), domainToDNS(m_domain), AVAHI_PROTO_UNSPEC, AVAHI_LOOKUP_NO_ADDRESS,
112
resolve_callback, this);
114
d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
115
m_serviceName.utf8(), m_type.ascii(), m_domain.utf8(), AVAHI_PROTO_UNSPEC, resolve_callback, this);
108
if (!d->isRunning()) emit resolved(false);
117
if (d->m_resolver) d->m_running=true;
118
else emit resolved(false);
111
121
bool RemoteService::isResolved() const
159
void resolve_callback ( DNSServiceRef,
162
DNSServiceErrorType errorCode,
164
const char *hosttarget,
167
const unsigned char *txtRecord,
168
void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
169
const char*, const char*, const char*, const char* hostname, const AvahiAddress*,
170
uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags, void* context)
172
void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
173
const char*, const char*, const char*, const char* hostname, const AvahiAddress*,
174
uint16_t port, AvahiStringList* txt, void* context)
171
177
QObject *obj = reinterpret_cast<QObject*>(context);
172
if (errorCode != kDNSServiceErr_NoError) {
178
if (e != AVAHI_RESOLVER_FOUND) {
174
180
QApplication::sendEvent(obj, &err);
179
unsigned char valueLen;
180
kdDebug() << "Resolve callback\n";
181
183
QMap<QString,QString> map;
182
const void *voidValue = 0;
183
while (TXTRecordGetItemAtIndex(txtLen,txtRecord,index++,256,key,&valueLen,
184
&voidValue) == kDNSServiceErr_NoError)
186
if (voidValue) map[QString::fromUtf8(key)]=QString::fromUtf8((const char*)voidValue,valueLen);
187
else map[QString::fromUtf8(key)]=QString::null;
189
ResolveEvent rev(DNSToDomain(hosttarget),ntohs(port),map);
187
if (avahi_string_list_get_pair(txt,&key,&value,&size)) break;
188
map[QString::fromUtf8(key)]=(value) ? QString::fromUtf8(value) : QString::null;
191
ResolveEvent rev(DNSToDomain(hostname),port,map);
190
192
QApplication::sendEvent(obj, &rev);