Fawkes API Fawkes Development Version
avahi_dispatcher.cpp
1
2/***************************************************************************
3 * avahi_dispatcher.h - Avahi browser handler and dispatcher
4 *
5 * Created: Wed Nov 05 11:30:13 2008
6 * Copyright 2008 Tim Niemueller [www.niemueller.de]
7 *
8 ****************************************************************************/
9
10/* This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version. A runtime exception applies to
14 * this software (see LICENSE.GPL_WRE file mentioned below for details).
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Library General Public License for more details.
20 *
21 * Read the full text in the LICENSE.GPL_WRE file in the doc directory.
22 */
23
24#include <gui_utils/avahi_dispatcher.h>
25#include <netcomm/service_discovery/service.h>
26
27namespace fawkes {
28
29/** @class AvahiDispatcher <gui_utils/avahi_dispatcher.h>
30 * Avahi dispatcher.
31 * This class facilitates a dispatcher that is used to get events generated
32 * by an AvahiThread into the main loop of a Gtk application.
33 * @author Tim Niemueller
34 */
35
36/** Constructor. */
38{
39 dispatcher_all_for_now_.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_all_for_now));
40 dispatcher_cache_exhausted_.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_cache_exhausted));
41 dispatcher_browse_failed_.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_browse_failed));
42 dispatcher_service_added_.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_added));
43 dispatcher_service_removed_.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_removed));
44}
45
46/** Get "all for now" signal.
47 * @return "all for now" signal
48 */
49sigc::signal<void>
51{
52 return signal_all_for_now_;
53}
54
55/** Get "cache exhausted" signal.
56 * @return "cache exhausted" signal
57 */
58sigc::signal<void>
60{
61 return signal_cache_exhausted_;
62}
63
64/** Get "browse failed" signal.
65 * @return "browse failed" signal
66 */
67sigc::signal<void>
69{
70 return signal_browse_failed_;
71}
72
73/** Get "service added" signal.
74 * @return "service added" signal
75 */
76sigc::signal<void, NetworkService *>
78{
79 return signal_service_added_;
80}
81
82/** Get "service remove" signal.
83 * @return "service remove" signal
84 */
85sigc::signal<void, NetworkService *>
87{
88 return signal_service_removed_;
89}
90
91void
93{
94 dispatcher_all_for_now_();
95}
96
97void
99{
100 dispatcher_cache_exhausted_();
101}
102
103void
104AvahiDispatcher::browse_failed(const char *name, const char *type, const char *domain)
105{
106 dispatcher_browse_failed_();
107}
108
109void
111 const char * type,
112 const char * domain,
113 const char * host_name,
114 const char * interface,
115 const struct sockaddr * addr,
116 const socklen_t addr_size,
117 uint16_t port,
118 std::list<std::string> &txt,
119 int flags)
120{
121 NetworkService *s = new NetworkService(name, type, domain, host_name, port, addr, addr_size, txt);
122 queue_service_added_.push_locked(s);
123 dispatcher_service_added_();
124}
125
126void
127AvahiDispatcher::service_removed(const char *name, const char *type, const char *domain)
128{
129 NetworkService *s = new NetworkService(name, type, domain);
130 queue_service_removed_.push_locked(s);
131 dispatcher_service_removed_();
132}
133
134void
135AvahiDispatcher::on_all_for_now()
136{
137 signal_all_for_now_.emit();
138}
139
140void
141AvahiDispatcher::on_cache_exhausted()
142{
143 signal_cache_exhausted_.emit();
144}
145
146void
147AvahiDispatcher::on_browse_failed()
148{
149 signal_browse_failed_.emit();
150}
151
152void
153AvahiDispatcher::on_service_added()
154{
155 queue_service_added_.lock();
156 while (!queue_service_added_.empty()) {
157 NetworkService *s = queue_service_added_.front();
158 signal_service_added_.emit(s);
159 delete s;
160 queue_service_added_.pop();
161 }
162 queue_service_added_.unlock();
163}
164
165void
166AvahiDispatcher::on_service_removed()
167{
168 queue_service_removed_.lock();
169 while (!queue_service_removed_.empty()) {
170 NetworkService *s = queue_service_removed_.front();
171 signal_service_removed_.emit(s);
172 delete s;
173 queue_service_removed_.pop();
174 }
175 queue_service_removed_.unlock();
176}
177
178} // end namespace fawkes
sigc::signal< void > signal_all_for_now()
Get "all for now" signal.
virtual void all_for_now()
All results have been retrieved.
virtual void service_added(const char *name, const char *type, const char *domain, const char *host_name, const char *interface, const struct sockaddr *addr, const socklen_t addr_size, uint16_t port, std::list< std::string > &txt, int flags)
A service has been announced on the network.
sigc::signal< void > signal_browse_failed()
Get "browse failed" signal.
sigc::signal< void > signal_cache_exhausted()
Get "cache exhausted" signal.
virtual void browse_failed(const char *name, const char *type, const char *domain)
Failed to browse for a given service.
virtual void cache_exhausted()
Cache exhausted.
virtual void service_removed(const char *name, const char *type, const char *domain)
A service has been removed from the network.
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.
Representation of a service announced or found via service discovery (i.e.
Definition: service.h:38
Fawkes library namespace.