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 char *interface,
130  const struct sockaddr *addr,
131  const socklen_t addr_size,
132  uint16_t port,
133  std::list<std::string> &txt,
134  int flags)
135 {
136  NetworkService *s = new NetworkService(name, type, domain, host_name, port,
137  addr, addr_size, txt);
138  __queue_service_added.push_locked(s);
139  __dispatcher_service_added();
140 }
141 
142 
143 void
145  const char *type,
146  const char *domain)
147 {
148  NetworkService *s = new NetworkService(name, type, domain);
149  __queue_service_removed.push_locked(s);
150  __dispatcher_service_removed();
151 }
152 
153 
154 void
155 AvahiDispatcher::on_all_for_now()
156 {
157  __signal_all_for_now.emit();
158 }
159 
160 void
161 AvahiDispatcher::on_cache_exhausted()
162 {
163  __signal_cache_exhausted.emit();
164 }
165 
166 void
167 AvahiDispatcher::on_browse_failed()
168 {
169  __signal_browse_failed.emit();
170 }
171 
172 void
173 AvahiDispatcher::on_service_added()
174 {
175  __queue_service_added.lock();
176  while (! __queue_service_added.empty()) {
177  NetworkService *s = __queue_service_added.front();
178  __signal_service_added.emit(s);
179  delete s;
180  __queue_service_added.pop();
181  }
182  __queue_service_added.unlock();
183 }
184 
185 void
186 AvahiDispatcher::on_service_removed()
187 {
188  __queue_service_removed.lock();
189  while (! __queue_service_removed.empty()) {
190  NetworkService *s = __queue_service_removed.front();
191  __signal_service_removed.emit(s);
192  delete s;
193  __queue_service_removed.pop();
194  }
195  __queue_service_removed.unlock();
196 }
197 
198 } // 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 browse_failed(const char *name, const char *type, const char *domain)
Failed to browse for a given service.
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.
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.