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,
74 TQT_SLOT(removeDomain(
const TQString& )));
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);
120 emit serviceAdded(svr);
122 d->m_duringResolve.remove(it);
129 if (d->m_running)
return;
131 if (isAvailable()!=Working)
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;
148 emit serviceAdded(svr);
153 void ServiceBrowser::gotRemoveService(RemoteService::Ptr svr)
155 TQValueList<RemoteService::Ptr>::Iterator it = findDuplicate(svr);
156 if (it!=(d->m_services.end())) {
157 emit serviceRemoved(*it);
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)) {
170 emit serviceRemoved(*it);
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()
195 if (allFinished()) emit finished();
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" virtual void startQuery()
Starts query.
static const State isAvailable()
Checks availability of DNS-SD services (this also covers publishing).
const DomainBrowser * browsedDomains() const
Return DomainBrowser containing domains being browsed.
RemoteService class allows to resolve service announced on remote machine.
void addDomain(const TQString &domain)
Add new domain to browse.
virtual void startBrowse()
Starts browsing for services.
ServiceBrowser(const TQStringList &types, DomainBrowser *domains, int flags)
ServiceBrowser constructor.
static const TQString AllServices
Special service type to search for all available service types.
Class used to provide current list of domains for browsing.
This class provides way to search for specified service type in one domain.
const TQValueList< RemoteService::Ptr > & services() const
Returns list of services.
State
Availability of DNS-SD services.
void removeDomain(const TQString &domain)
Remove one domain from list of domains to browse.