23 #include <tqstringlist.h>
25 #include "domainbrowser.h"
26 #include "responder.h"
28 #include "servicebrowser.h"
30 #include <avahi-client/client.h>
39 class ServiceBrowserPrivate
42 ServiceBrowserPrivate() : m_running(false)
44 TQValueList<RemoteService::Ptr> m_services;
45 TQValueList<RemoteService::Ptr> m_duringResolve;
47 DomainBrowser* m_domains;
51 TQDict<Query> resolvers;
56 if (domains) init(type,domains,autoResolve ? AutoResolve : 0);
57 else init(type,
new DomainBrowser(
this),autoResolve ? AutoResolve|AutoDelete : AutoDelete);
61 if (domains) init(types,domains,flags);
65 void ServiceBrowser::init(
const TQStringList& type,
DomainBrowser* domains,
int flags)
67 d =
new ServiceBrowserPrivate();
68 d->resolvers.setAutoDelete(
true);
71 d->m_domains = domains;
72 connect(d->m_domains,TQT_SIGNAL(domainAdded(
const TQString& )),
this,TQT_SLOT(
addDomain(
const TQString& )));
73 connect(d->m_domains,TQT_SIGNAL(domainRemoved(
const TQString& )),
this,
78 init(type,
new DomainBrowser(domain,
false,
this),autoResolve ? AutoResolve|AutoDelete : AutoDelete);
82 init(type,
new DomainBrowser(domain,
false,
this),flags | AutoDelete);
88 AvahiClientState s = Responder::self().state();
90 return (s==AVAHI_CLIENT_FAILURE) ? Stopped : Working;
92 return (s==AVAHI_CLIENT_S_INVALID || s==AVAHI_CLIENT_DISCONNECTED) ? Stopped : Working;
98 ServiceBrowser::~ ServiceBrowser()
100 if (d->m_flags & AutoDelete)
delete d->m_domains;
109 void ServiceBrowser::serviceResolved(
bool success)
111 TQObject* sender_obj =
const_cast<TQObject*
>(TQT_TQOBJECT_CONST(sender()));
113 disconnect(svr,TQT_SIGNAL(resolved(
bool)),
this,TQT_SLOT(serviceResolved(
bool)));
114 TQValueList<RemoteService::Ptr>::Iterator it = d->m_duringResolve.begin();
115 TQValueList<RemoteService::Ptr>::Iterator itEnd = d->m_duringResolve.end();
116 while ( it!= itEnd && svr!= (*it)) ++it;
119 d->m_services+=(*it);
122 d->m_duringResolve.remove(it);
129 if (d->m_running)
return;
132 if (d->m_domains->isRunning()) {
133 TQStringList::const_iterator itEnd = d->m_domains->domains().end();
134 for ( TQStringList::const_iterator it = d->m_domains->domains().begin(); it != itEnd; ++it )
136 }
else d->m_domains->startBrowse();
139 void ServiceBrowser::gotNewService(RemoteService::Ptr svr)
141 if (findDuplicate(svr)==(d->m_services.end())) {
142 if (d->m_flags & AutoResolve) {
143 connect(svr,TQT_SIGNAL(resolved(
bool )),
this,TQT_SLOT(serviceResolved(
bool )));
144 d->m_duringResolve+=svr;
153 void ServiceBrowser::gotRemoveService(RemoteService::Ptr svr)
155 TQValueList<RemoteService::Ptr>::Iterator it = findDuplicate(svr);
156 if (it!=(d->m_services.end())) {
158 d->m_services.remove(it);
165 while (d->resolvers[domain]) d->resolvers.remove(domain);
166 TQValueList<RemoteService::Ptr>::Iterator it = d->m_services.begin();
167 while (it!=d->m_services.end())
169 if ((*it)->domain().section(
'.',0) == domain.section(
'.',0)) {
171 it = d->m_services.remove(it);
177 if (!d->m_running)
return;
178 if (!(d->resolvers[domain])) {
179 TQStringList::ConstIterator itEnd = d->m_types.end();
180 for (TQStringList::ConstIterator it=d->m_types.begin(); it!=itEnd; ++it) {
182 connect(b,TQT_SIGNAL(
serviceAdded(DNSSD::RemoteService::Ptr)),
this,
183 TQT_SLOT(gotNewService(DNSSD::RemoteService::Ptr)));
184 connect(b,TQT_SIGNAL(
serviceRemoved(DNSSD::RemoteService::Ptr )),
this,
185 TQT_SLOT(gotRemoveService(DNSSD::RemoteService::Ptr)));
186 connect(b,TQT_SIGNAL(
finished()),
this,TQT_SLOT(queryFinished()));
188 d->resolvers.insert(domain,b);
193 void ServiceBrowser::queryFinished()
198 bool ServiceBrowser::allFinished()
200 if (d->m_duringResolve.count())
return false;
202 TQDictIterator<Query> it(d->resolvers);
203 for ( ; it.current(); ++it) all&=(*it)->isFinished();
209 return d->m_services;
212 void ServiceBrowser::virtual_hook(
int,
void*)
215 TQValueList<RemoteService::Ptr>::Iterator ServiceBrowser::findDuplicate(RemoteService::Ptr src)
217 TQValueList<RemoteService::Ptr>::Iterator itEnd = d->m_services.end();
218 for (TQValueList<RemoteService::Ptr>::Iterator it = d->m_services.begin(); it!=itEnd; ++it)
219 if ((src->type()==(*it)->type()) && (src->serviceName()==(*it)->serviceName()) &&
220 (src->domain() == (*it)->domain()))
return it;
227 #include "servicebrowser.moc"