• 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
38namespace DNSSD
39{
40#ifdef HAVE_DNSSD
41#ifdef AVAHI_API_0_6
42
43void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
44 const char* regtype, const char* domain, AvahiLookupResultFlags, void* context);
45void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
46 const char* replyDomain, AvahiLookupResultFlags, void* context);
47#else
48void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
49 const char* regtype, const char* domain, void* context);
50void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
51 const char* replyDomain, void* context);
52void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
53 void* context);
54#endif
55#endif
56
57enum BrowserType { Types, Services };
58
59class QueryPrivate
60{
61public:
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
74Query::Query(const TQString& type, const TQString& domain)
75{
76 d = new QueryPrivate(type,domain);
77 connect(&d->timeout,TQ_SIGNAL(timeout()),this,TQ_SLOT(timeout()));
78}
79
80
81Query::~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
94bool Query::isRunning() const
95{
96 return d->m_running;
97}
98
99bool Query::isFinished() const
100{
101 return d->m_finished;
102}
103
104const TQString& Query::domain() const
105{
106 return d->m_domain;
107}
108
109void 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}
141void Query::virtual_hook(int, void*)
142{
143}
144
145void 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
159void Query::timeout()
160{
161 d->m_finished=true;
162 emit finished();
163}
164
165#ifdef HAVE_DNSSD
166#ifdef AVAHI_API_0_6
167void services_callback (AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event,
168 const char* serviceName, const char* regtype, const char* replyDomain, AvahiLookupResultFlags, void* context)
169#else
170void 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
182void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
183 const char* replyDomain, AvahiLookupResultFlags, void* context)
184#else
185void 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::isFinished
bool isFinished() const
Returns true if all currently announced services has been reported.
Definition: query.cpp:99
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::Query
Query(const TQString &type, const TQString &domain)
Creates new query.
Definition: query.cpp:74
DNSSD::Query::serviceAdded
void serviceAdded(DNSSD::RemoteService::Ptr)
Emitted when new service has been discovered.
DNSSD::Query::domain
const TQString & domain() const
Returns queried domain.
Definition: query.cpp:104
DNSSD::Query::serviceRemoved
void serviceRemoved(DNSSD::RemoteService::Ptr)
Emitted when previously discovered service is not longer published.

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.