• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • dnssd
 

dnssd

  • dnssd
servicebrowser.cpp
1/* This file is part of the KDE project
2 *
3 * Copyright (C) 2004 Jakub Stachowski <qbast@go2.pl>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21#include <signal.h>
22#include <errno.h>
23#include <tqstringlist.h>
24#include <tqfile.h>
25#include "domainbrowser.h"
26#include "responder.h"
27#include "query.h"
28#include "servicebrowser.h"
29#ifdef HAVE_DNSSD
30#include <avahi-client/client.h>
31#endif
32#include <config.h>
33
34namespace DNSSD
35{
36
37const TQString ServiceBrowser::AllServices = "_services._dns-sd._udp";
38
39class ServiceBrowserPrivate
40{
41public:
42 ServiceBrowserPrivate() : m_running(false)
43 {}
44 TQValueList<RemoteService::Ptr> m_services;
45 TQValueList<RemoteService::Ptr> m_duringResolve;
46 TQStringList m_types;
47 DomainBrowser* m_domains;
48 int m_flags;
49 bool m_running;
50 bool m_finished;
51 TQDict<Query> resolvers;
52};
53
54ServiceBrowser::ServiceBrowser(const TQString& type,DomainBrowser* domains,bool autoResolve)
55{
56 if (domains) init(type,domains,autoResolve ? AutoResolve : 0);
57 else init(type,new DomainBrowser(this),autoResolve ? AutoResolve|AutoDelete : AutoDelete);
58}
59ServiceBrowser::ServiceBrowser(const TQStringList& types,DomainBrowser* domains,int flags)
60{
61 if (domains) init(types,domains,flags);
62 else init(types,new DomainBrowser(this),flags|AutoDelete);
63}
64
65void ServiceBrowser::init(const TQStringList& type,DomainBrowser* domains,int flags)
66{
67 d = new ServiceBrowserPrivate();
68 d->resolvers.setAutoDelete(true);
69 d->m_types=type;
70 d->m_flags=flags;
71 d->m_domains = domains;
72 connect(d->m_domains,TQ_SIGNAL(domainAdded(const TQString& )),this,TQ_SLOT(addDomain(const TQString& )));
73 connect(d->m_domains,TQ_SIGNAL(domainRemoved(const TQString& )),this,
74 TQ_SLOT(removeDomain(const TQString& )));
75}
76ServiceBrowser::ServiceBrowser(const TQString& type,const TQString& domain,bool autoResolve)
77{
78 init(type,new DomainBrowser(domain,false,this),autoResolve ? AutoResolve|AutoDelete : AutoDelete);
79}
80ServiceBrowser::ServiceBrowser(const TQString& type,const TQString& domain,int flags)
81{
82 init(type,new DomainBrowser(domain,false,this),flags | AutoDelete);
83}
84
85const ServiceBrowser::State ServiceBrowser::isAvailable()
86{
87#ifdef HAVE_DNSSD
88 AvahiClientState s = Responder::self().state();
89#ifdef AVAHI_API_0_6
90 return (s==AVAHI_CLIENT_FAILURE) ? Stopped : Working;
91#else
92 return (s==AVAHI_CLIENT_S_INVALID || s==AVAHI_CLIENT_DISCONNECTED) ? Stopped : Working;
93#endif
94#else
95 return Unsupported;
96#endif
97}
98ServiceBrowser::~ ServiceBrowser()
99{
100 if (d->m_flags & AutoDelete) delete d->m_domains;
101 delete d;
102}
103
104const DomainBrowser* ServiceBrowser::browsedDomains() const
105{
106 return d->m_domains;
107}
108
109void ServiceBrowser::serviceResolved(bool success)
110{
111 TQObject* sender_obj = const_cast<TQObject*>(sender());
112 RemoteService* svr = static_cast<RemoteService*>(sender_obj);
113 disconnect(svr,TQ_SIGNAL(resolved(bool)),this,TQ_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;
117 if (it != itEnd) {
118 if (success) {
119 d->m_services+=(*it);
120 emit serviceAdded(svr);
121 }
122 d->m_duringResolve.remove(it);
123 queryFinished();
124 }
125}
126
127void ServiceBrowser::startBrowse()
128{
129 if (d->m_running) return;
130 d->m_running=true;
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 )
135 addDomain(*it);
136 } else d->m_domains->startBrowse();
137}
138
139void ServiceBrowser::gotNewService(RemoteService::Ptr svr)
140{
141 if (findDuplicate(svr)==(d->m_services.end())) {
142 if (d->m_flags & AutoResolve) {
143 connect(svr,TQ_SIGNAL(resolved(bool )),this,TQ_SLOT(serviceResolved(bool )));
144 d->m_duringResolve+=svr;
145 svr->resolveAsync();
146 } else {
147 d->m_services+=svr;
148 emit serviceAdded(svr);
149 }
150 }
151}
152
153void ServiceBrowser::gotRemoveService(RemoteService::Ptr svr)
154{
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);
159 }
160}
161
162
163void ServiceBrowser::removeDomain(const TQString& domain)
164{
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())
168 // use section to skip possible trailing dot
169 if ((*it)->domain().section('.',0) == domain.section('.',0)) {
170 emit serviceRemoved(*it);
171 it = d->m_services.remove(it);
172 } else ++it;
173}
174
175void ServiceBrowser::addDomain(const TQString& domain)
176{
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) {
181 Query* b = new Query((*it),domain);
182 connect(b,TQ_SIGNAL(serviceAdded(DNSSD::RemoteService::Ptr)),this,
183 TQ_SLOT(gotNewService(DNSSD::RemoteService::Ptr)));
184 connect(b,TQ_SIGNAL(serviceRemoved(DNSSD::RemoteService::Ptr )),this,
185 TQ_SLOT(gotRemoveService(DNSSD::RemoteService::Ptr)));
186 connect(b,TQ_SIGNAL(finished()),this,TQ_SLOT(queryFinished()));
187 b->startQuery();
188 d->resolvers.insert(domain,b);
189 }
190 }
191}
192
193void ServiceBrowser::queryFinished()
194{
195 if (allFinished()) emit finished();
196}
197
198bool ServiceBrowser::allFinished()
199{
200 if (d->m_duringResolve.count()) return false;
201 bool all = true;
202 TQDictIterator<Query> it(d->resolvers);
203 for ( ; it.current(); ++it) all&=(*it)->isFinished();
204 return all;
205}
206
207const TQValueList<RemoteService::Ptr>& ServiceBrowser::services() const
208{
209 return d->m_services;
210}
211
212void ServiceBrowser::virtual_hook(int, void*)
213{}
214
215TQValueList<RemoteService::Ptr>::Iterator ServiceBrowser::findDuplicate(RemoteService::Ptr src)
216{
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;
221 return itEnd;
222}
223
224
225}
226
227#include "servicebrowser.moc"
DNSSD::DomainBrowser
Class used to provide current list of domains for browsing.
Definition: domainbrowser.h:42
DNSSD::Query
This class provides way to search for specified service type in one domain.
Definition: query.h:40
DNSSD::Query::startQuery
virtual void startQuery()
Starts query.
Definition: query.cpp:109
DNSSD::RemoteService
RemoteService class allows to resolve service announced on remote machine.
Definition: remoteservice.h:43
DNSSD::ServiceBrowser::startBrowse
virtual void startBrowse()
Starts browsing for services.
Definition: servicebrowser.cpp:127
DNSSD::ServiceBrowser::serviceAdded
void serviceAdded(DNSSD::RemoteService::Ptr)
Emitted when new service is discovered (or resolved if autoresolve is set.
DNSSD::ServiceBrowser::services
const TQValueList< RemoteService::Ptr > & services() const
Returns list of services.
Definition: servicebrowser.cpp:207
DNSSD::ServiceBrowser::finished
void finished()
Emitted when all services has been reported.
DNSSD::ServiceBrowser::serviceRemoved
void serviceRemoved(DNSSD::RemoteService::Ptr)
Emitted when service is no longer announced.
DNSSD::ServiceBrowser::addDomain
void addDomain(const TQString &domain)
Add new domain to browse.
Definition: servicebrowser.cpp:175
DNSSD::ServiceBrowser::removeDomain
void removeDomain(const TQString &domain)
Remove one domain from list of domains to browse.
Definition: servicebrowser.cpp:163
DNSSD::ServiceBrowser::browsedDomains
const DomainBrowser * browsedDomains() const
Return DomainBrowser containing domains being browsed.
Definition: servicebrowser.cpp:104
DNSSD::ServiceBrowser::AllServices
static const TQString AllServices
Special service type to search for all available service types.
Definition: servicebrowser.h:142
DNSSD::ServiceBrowser::ServiceBrowser
ServiceBrowser(const TQStringList &types, DomainBrowser *domains, int flags)
ServiceBrowser constructor.
Definition: servicebrowser.cpp:59
DNSSD::ServiceBrowser::State
State
Availability of DNS-SD services.
Definition: servicebrowser.h:75
DNSSD::ServiceBrowser::isAvailable
static const State isAvailable()
Checks availability of DNS-SD services (this also covers publishing).
Definition: servicebrowser.cpp:85

dnssd

Skip menu "dnssd"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

dnssd

Skip menu "dnssd"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for dnssd by doxygen 1.9.4
This website is maintained by Timothy Pearson.