• 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 
34 namespace DNSSD
35 {
36 
37 const TQString ServiceBrowser::AllServices = "_services._dns-sd._udp";
38 
39 class ServiceBrowserPrivate
40 {
41 public:
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 
54 ServiceBrowser::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 }
59 ServiceBrowser::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 
65 void 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,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& )));
75 }
76 ServiceBrowser::ServiceBrowser(const TQString& type,const TQString& domain,bool autoResolve)
77 {
78  init(type,new DomainBrowser(domain,false,this),autoResolve ? AutoResolve|AutoDelete : AutoDelete);
79 }
80 ServiceBrowser::ServiceBrowser(const TQString& type,const TQString& domain,int flags)
81 {
82  init(type,new DomainBrowser(domain,false,this),flags | AutoDelete);
83 }
84 
85 const 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 }
98 ServiceBrowser::~ ServiceBrowser()
99 {
100  if (d->m_flags & AutoDelete) delete d->m_domains;
101  delete d;
102 }
103 
104 const DomainBrowser* ServiceBrowser::browsedDomains() const
105 {
106  return d->m_domains;
107 }
108 
109 void ServiceBrowser::serviceResolved(bool success)
110 {
111  TQObject* sender_obj = const_cast<TQObject*>(TQT_TQOBJECT_CONST(sender()));
112  RemoteService* svr = static_cast<RemoteService*>(sender_obj);
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;
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 
127 void 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 
139 void ServiceBrowser::gotNewService(RemoteService::Ptr svr)
140 {
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;
145  svr->resolveAsync();
146  } else {
147  d->m_services+=svr;
148  emit serviceAdded(svr);
149  }
150  }
151 }
152 
153 void 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 
163 void 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 
175 void 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,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()));
187  b->startQuery();
188  d->resolvers.insert(domain,b);
189  }
190  }
191 }
192 
193 void ServiceBrowser::queryFinished()
194 {
195  if (allFinished()) emit finished();
196 }
197 
198 bool 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 
207 const TQValueList<RemoteService::Ptr>& ServiceBrowser::services() const
208 {
209  return d->m_services;
210 }
211 
212 void ServiceBrowser::virtual_hook(int, void*)
213 {}
214 
215 TQValueList<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::Query::startQuery
virtual void startQuery()
Starts query.
Definition: query.cpp:109
DNSSD::ServiceBrowser::isAvailable
static const State isAvailable()
Checks availability of DNS-SD services (this also covers publishing).
Definition: servicebrowser.cpp:85
DNSSD::ServiceBrowser::finished
void finished()
Emitted when all services has been reported.
DNSSD::RemoteService
RemoteService class allows to resolve service announced on remote machine.
Definition: remoteservice.h:42
DNSSD::ServiceBrowser::addDomain
void addDomain(const TQString &domain)
Add new domain to browse.
Definition: servicebrowser.cpp:175
DNSSD::ServiceBrowser::startBrowse
virtual void startBrowse()
Starts browsing for services.
Definition: servicebrowser.cpp:127
DNSSD::ServiceBrowser::services
const TQValueList< RemoteService::Ptr > & services() const
Returns list of services.
Definition: servicebrowser.cpp:207
DNSSD::ServiceBrowser::ServiceBrowser
ServiceBrowser(const TQStringList &types, DomainBrowser *domains, int flags)
ServiceBrowser constructor.
Definition: servicebrowser.cpp:59
DNSSD::ServiceBrowser::AllServices
static const TQString AllServices
Special service type to search for all available service types.
Definition: servicebrowser.h:142
DNSSD::ServiceBrowser::serviceAdded
void serviceAdded(DNSSD::RemoteService::Ptr)
Emitted when new service is discovered (or resolved if autoresolve is set.
DNSSD::ServiceBrowser::browsedDomains
const DomainBrowser * browsedDomains() const
Return DomainBrowser containing domains being browsed.
Definition: servicebrowser.cpp:104
DNSSD
Definition: domainbrowser.cpp:36
DNSSD::DomainBrowser
Class used to provide current list of domains for browsing.
Definition: domainbrowser.h:41
DNSSD::Query
This class provides way to search for specified service type in one domain.
Definition: query.h:39
DNSSD::ServiceBrowser::State
State
Availability of DNS-SD services.
Definition: servicebrowser.h:75
DNSSD::ServiceBrowser::removeDomain
void removeDomain(const TQString &domain)
Remove one domain from list of domains to browse.
Definition: servicebrowser.cpp:163
DNSSD::ServiceBrowser::serviceRemoved
void serviceRemoved(DNSSD::RemoteService::Ptr)
Emitted when service is no longer announced.

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for dnssd by doxygen 1.8.8
This website is maintained by Timothy Pearson.