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

dnssd

  • dnssd
query.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 "query.h"
22 #include "responder.h"
23 #include "remoteservice.h"
24 #include "sdevent.h"
25 #include <tqdatetime.h>
26 #include <tqapplication.h>
27 #include <tqtimer.h>
28 
29 #ifdef HAVE_DNSSD
30 #include <avahi-client/client.h>
31 #ifdef AVAHI_API_0_6
32 #include <avahi-client/lookup.h>
33 #endif
34 #endif
35 
36 #define TIMEOUT_LAN 200
37 
38 namespace DNSSD
39 {
40 #ifdef HAVE_DNSSD
41 #ifdef AVAHI_API_0_6
42 
43 void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
44  const char* regtype, const char* domain, AvahiLookupResultFlags, void* context);
45 void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
46  const char* replyDomain, AvahiLookupResultFlags, void* context);
47 #else
48 void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
49  const char* regtype, const char* domain, void* context);
50 void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
51  const char* replyDomain, void* context);
52 void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
53  void* context);
54 #endif
55 #endif
56 
57 enum BrowserType { Types, Services };
58 
59 class QueryPrivate
60 {
61 public:
62  QueryPrivate(const TQString& type, const TQString& domain) : m_finished(false), m_browser(0),
63  m_running(false), m_domain(domain), m_type(type) {}
64 
65  bool m_finished;
66  BrowserType m_browserType;
67  void* m_browser;
68  bool m_running;
69  TQString m_domain;
70  TQTimer timeout;
71  TQString m_type;
72 };
73 
74 Query::Query(const TQString& type, const TQString& domain)
75 {
76  d = new QueryPrivate(type,domain);
77  connect(&d->timeout,TQT_SIGNAL(timeout()),this,TQT_SLOT(timeout()));
78 }
79 
80 
81 Query::~Query()
82 {
83 #ifdef HAVE_DNSSD
84  if (d->m_browser) {
85  switch (d->m_browserType) {
86  case Services: avahi_service_browser_free((AvahiServiceBrowser*)d->m_browser); break;
87  case Types: avahi_service_type_browser_free((AvahiServiceTypeBrowser*)d->m_browser); break;
88  }
89  }
90 #endif
91  delete d;
92 }
93 
94 bool Query::isRunning() const
95 {
96  return d->m_running;
97 }
98 
99 bool Query::isFinished() const
100 {
101  return d->m_finished;
102 }
103 
104 const TQString& Query::domain() const
105 {
106  return d->m_domain;
107 }
108 
109 void Query::startQuery()
110 {
111  if (d->m_running) return;
112  d->m_finished = false;
113  if (d->m_type=="_services._dns-sd._udp") {
114  d->m_browserType = Types;
115 #ifdef HAVE_DNSSD
116 #ifdef AVAHI_API_0_6
117  d->m_browser = avahi_service_type_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
118  domainToDNS(d->m_domain), (AvahiLookupFlags)0, types_callback, this);
119 #else
120  d->m_browser = avahi_service_type_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
121  d->m_domain.utf8(), types_callback, this);
122 #endif
123 #endif
124  } else {
125  d->m_browserType = Services;
126 #ifdef HAVE_DNSSD
127 #ifdef AVAHI_API_0_6
128  d->m_browser = avahi_service_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
129  d->m_type.ascii(),domainToDNS(d->m_domain), (AvahiLookupFlags)0, services_callback,this);
130 #else
131  d->m_browser = avahi_service_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
132  d->m_type.ascii(),d->m_domain.utf8(),services_callback,this);
133 #endif
134 #endif
135  }
136  if (d->m_browser) {
137  d->m_running=true;
138  d->timeout.start(TIMEOUT_LAN,true);
139  } else emit finished();
140 }
141 void Query::virtual_hook(int, void*)
142 {
143 }
144 
145 void Query::customEvent(TQCustomEvent* event)
146 {
147  if (event->type()==TQEvent::User+SD_ADDREMOVE) {
148  d->timeout.start(TIMEOUT_LAN,true);
149  d->m_finished=false;
150  AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event);
151  // m_type has useless trailing dot
152  RemoteService* svr = new RemoteService(aev->m_name,
153  aev->m_type,aev->m_domain);
154  if (aev->m_op==AddRemoveEvent::Add) emit serviceAdded(svr);
155  else emit serviceRemoved(svr);
156  }
157 }
158 
159 void Query::timeout()
160 {
161  d->m_finished=true;
162  emit finished();
163 }
164 
165 #ifdef HAVE_DNSSD
166 #ifdef AVAHI_API_0_6
167 void services_callback (AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event,
168  const char* serviceName, const char* regtype, const char* replyDomain, AvahiLookupResultFlags, void* context)
169 #else
170 void services_callback (AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event,
171  const char* serviceName, const char* regtype, const char* replyDomain, void* context)
172 #endif
173 {
174  TQObject *obj = reinterpret_cast<TQObject*>(context);
175  AddRemoveEvent* arev = new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
176  AddRemoveEvent::Remove, TQString::fromUtf8(serviceName), regtype,
177  DNSToDomain(replyDomain));
178  TQApplication::postEvent(obj, arev);
179 }
180 
181 #ifdef AVAHI_API_0_6
182 void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
183  const char* replyDomain, AvahiLookupResultFlags, void* context)
184 #else
185 void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
186  const char* replyDomain, void* context)
187 #endif
188 {
189  TQObject *obj = reinterpret_cast<TQObject*>(context);
190  AddRemoveEvent* arev = new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
191  AddRemoveEvent::Remove, TQString::null, regtype,
192  DNSToDomain(replyDomain));
193  TQApplication::postEvent(obj, arev);
194 }
195 #endif
196 
197 }
198 #include "query.moc"
DNSSD::Query::startQuery
virtual void startQuery()
Starts query.
Definition: query.cpp:109
DNSSD::Query::isRunning
bool isRunning() const
Returns TRUE if query is already running.
Definition: query.cpp:94
DNSSD::Query::finished
void finished()
Emitted when all announced services has been reported.
DNSSD::Query::domain
const TQString & domain() const
Returns queried domain.
Definition: query.cpp:104
DNSSD::Query::Query
Query(const TQString &type, const TQString &domain)
Creates new query.
Definition: query.cpp:74
DNSSD
Definition: domainbrowser.cpp:36
DNSSD::Query::serviceRemoved
void serviceRemoved(DNSSD::RemoteService::Ptr)
Emitted when previously discovered service is not longer published.
DNSSD::Query::serviceAdded
void serviceAdded(DNSSD::RemoteService::Ptr)
Emitted when new service has been discovered.
DNSSD::Query::isFinished
bool isFinished() const
Returns TRUE if all currently announced services has been reported.
Definition: query.cpp:99

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.