23 #include <tqeventloop.h> 24 #include <tqapplication.h> 26 #ifdef HAVE_SYS_TYPES_H 27 #include <sys/types.h> 29 #include <netinet/in.h> 31 #include <avahi-client/client.h> 32 #include <avahi-common/strlst.h> 34 #include <avahi-client/lookup.h> 37 #include "remoteservice.h" 38 #include "responder.h" 45 void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
46 const char* name,
const char* type,
const char* domain,
const char* hostname,
const AvahiAddress* a,
47 uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags,
void* context);
49 void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
50 const char* name,
const char* type,
const char* domain,
const char* hostname,
const AvahiAddress* a,
51 uint16_t port, AvahiStringList* txt,
void* context);
55 class RemoteServicePrivate :
public Responder
58 RemoteServicePrivate() : m_resolved(false), m_running(false)
66 AvahiServiceResolver* m_resolver;
69 if (m_resolver) avahi_service_resolver_free(m_resolver);
78 d =
new RemoteServicePrivate();
83 d =
new RemoteServicePrivate();
88 d =
new RemoteServicePrivate();
89 if (!url.isValid())
return;
90 if (url.protocol()!=
"invitation")
return;
91 if (!url.hasPath())
return;
92 m_hostName = url.host();
94 m_type = url.path().section(
'/',1,1);
95 m_serviceName = url.path().section(
'/',2);
100 RemoteService::~RemoteService()
103 if (d->m_resolver) avahi_service_resolver_free(d->m_resolver);
111 while (d->m_running && !d->m_resolved) Responder::self().process();
115 return d->m_resolved;
120 if (d->m_running)
return;
121 d->m_resolved =
false;
125 d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
126 m_serviceName.utf8(), m_type.ascii(), domainToDNS(m_domain), AVAHI_PROTO_UNSPEC, AVAHI_LOOKUP_NO_ADDRESS,
127 resolve_callback,
this);
129 d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
130 m_serviceName.utf8(), m_type.ascii(), m_domain.utf8(), AVAHI_PROTO_UNSPEC, resolve_callback,
this);
132 if (d->m_resolver) d->m_running=
true;
139 return d->m_resolved;
142 void RemoteService::customEvent(TQCustomEvent* event)
144 if (event->type() == TQEvent::User+SD_ERROR) {
151 if (event->type() == TQEvent::User+SD_RESOLVE) {
152 ResolveEvent* rev =
static_cast<ResolveEvent*
>(event);
153 m_hostName = rev->m_hostname;
154 m_port = rev->m_port;
156 d->m_resolved =
true;
161 void RemoteService::virtual_hook(
int,
void*)
166 TQDataStream & operator<< (TQDataStream & s,
const RemoteService & a)
168 s << (static_cast<ServiceBase>(a));
169 TQ_INT8
resolved = a.d->m_resolved ? 1:0;
174 TQDataStream & operator>> (TQDataStream & s,
RemoteService & a)
181 operator>>(s,(static_cast<ServiceBase&>(a)));
183 a.d->m_resolved = (resolved == 1);
189 void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
190 const char*,
const char*,
const char*,
const char* hostname,
const AvahiAddress*,
191 uint16_t
port, AvahiStringList* txt, AvahiLookupResultFlags,
void* context)
193 void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
194 const char*,
const char*,
const char*,
const char* hostname,
const AvahiAddress*,
195 uint16_t port, AvahiStringList* txt,
void* context)
198 TQObject *obj =
reinterpret_cast<TQObject*
>(context);
199 if (e != AVAHI_RESOLVER_FOUND) {
201 TQApplication::sendEvent(obj, &err);
204 TQMap<TQString,TQString> map;
208 if (avahi_string_list_get_pair(txt,&key,&value,&size))
break;
209 map[TQString::fromUtf8(key)]=(value) ? TQString::fromUtf8(value) : TQString::null;
212 ResolveEvent rev(DNSToDomain(hostname),port,map);
213 TQApplication::sendEvent(obj, &rev);
220 #include "remoteservice.moc" void resolveAsync()
Resolves host name and port of service.
RemoteService(const TQString &label)
Creates unresolved service from given DNS label.
This class is used to carry information about service.
RemoteService class allows to resolve service announced on remote machine.
unsigned short port() const
Returns port number.
bool isResolved() const
Returns true if service has been successfully resolved.
TQMap< TQString, TQString > m_textData
Map of TXT properties.
bool resolve()
Synchronous version of resolveAsync().
void resolved(bool)
Emitted when resolving is complete.