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 
27 namespace fawkes {
28 #if 0 /* just to make Emacs auto-indent happy */
29 }
30 #endif
31 
32 
33 /** @class AvahiDispatcher <gui_utils/avahi_dispatcher.h>
34  * Avahi dispatcher.
35  * This class facilitates a dispatcher that is used to get events generated
36  * by an AvahiThread into the main loop of a Gtk application.
37  * @author Tim Niemueller
38  */
39 
40 /** Constructor. */
42 {
43  __dispatcher_all_for_now.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_all_for_now));
44  __dispatcher_cache_exhausted.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_cache_exhausted));
45  __dispatcher_browse_failed.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_browse_failed));
46  __dispatcher_service_added.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_added));
47  __dispatcher_service_removed.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_removed));
48 }
49 
50 
51 /** Get "all for now" signal.
52  * @return "all for now" signal
53  */
54 sigc::signal<void>
56 {
57  return __signal_all_for_now;
58 }
59 
60 
61 /** Get "cache exhausted" signal.
62  * @return "cache exhausted" signal
63  */
64 sigc::signal<void>
66 {
67  return __signal_cache_exhausted;
68 }
69 
70 
71 /** Get "browse failed" signal.
72  * @return "browse failed" signal
73  */
74 sigc::signal<void>
76 {
77  return __signal_browse_failed;
78 }
79 
80 
81 /** Get "service added" signal.
82  * @return "service added" signal
83  */
84 sigc::signal<void, NetworkService *>
86 {
87  return __signal_service_added;
88 }
89 
90 
91 /** Get "service remove" signal.
92  * @return "service remove" signal
93  */
94 sigc::signal<void, NetworkService *>
96 {
97  return __signal_service_removed;
98 }
99 
100 
101 void
103 {
104  __dispatcher_all_for_now();
105 }
106 
107 
108 void
110 {
111  __dispatcher_cache_exhausted();
112 }
113 
114 
115 void
117  const char *type,
118  const char *domain)
119 {
120  __dispatcher_browse_failed();
121 }
122 
123 
124 void
126  const char *type,
127  const char *domain,
128  const char *host_name,
129  const struct sockaddr *addr,
130  const socklen_t addr_size,
131  uint16_t port,
132  std::list<std::string> &txt,
133  int flags)
134 {
135  NetworkService *s = new NetworkService(name, type, domain, host_name, port,
136  addr, addr_size, txt);
137  __queue_service_added.push_locked(s);
138  __dispatcher_service_added();
139 }
140 
141 
142 void
144  const char *type,
145  const char *domain)
146 {
147  NetworkService *s = new NetworkService(name, type, domain);
148  __queue_service_removed.push_locked(s);
149  __dispatcher_service_removed();
150 }
151 
152 
153 void
154 AvahiDispatcher::on_all_for_now()
155 {
156  __signal_all_for_now.emit();
157 }
158 
159 void
160 AvahiDispatcher::on_cache_exhausted()
161 {
162  __signal_cache_exhausted.emit();
163 }
164 
165 void
166 AvahiDispatcher::on_browse_failed()
167 {
168  __signal_browse_failed.emit();
169 }
170 
171 void
172 AvahiDispatcher::on_service_added()
173 {
174  __queue_service_added.lock();
175  while (! __queue_service_added.empty()) {
176  NetworkService *s = __queue_service_added.front();
177  __signal_service_added.emit(s);
178  delete s;
179  __queue_service_added.pop();
180  }
181  __queue_service_added.unlock();
182 }
183 
184 void
185 AvahiDispatcher::on_service_removed()
186 {
187  __queue_service_removed.lock();
188  while (! __queue_service_removed.empty()) {
189  NetworkService *s = __queue_service_removed.front();
190  __signal_service_removed.emit(s);
191  delete s;
192  __queue_service_removed.pop();
193  }
194  __queue_service_removed.unlock();
195 }
196 
197 } // end namespace fawkes
virtual void cache_exhausted()
Cache exhausted.
sigc::signal< void > signal_cache_exhausted()
Get "cache exhausted" signal.
Fawkes library namespace.
sigc::signal< void > signal_all_for_now()
Get "all for now" signal.
virtual void service_removed(const char *name, const char *type, const char *domain)
A service has been removed from the network.
virtual void all_for_now()
All results have been retrieved.
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
virtual void service_added(const char *name, const char *type, const char *domain, const char *host_name, 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.
virtual void browse_failed(const char *name, const char *type, const char *domain)
Failed to browse for a given service.
sigc::signal< void > signal_browse_failed()
Get "browse failed" signal.
Representation of a service announced or found via service discovery (i.e.
Definition: service.h:37
AvahiDispatcher()
Constructor.
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.