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 
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  */
49 sigc::signal<void>
51 {
52  return signal_all_for_now_;
53 }
54 
55 /** Get "cache exhausted" signal.
56  * @return "cache exhausted" signal
57  */
58 sigc::signal<void>
60 {
61  return signal_cache_exhausted_;
62 }
63 
64 /** Get "browse failed" signal.
65  * @return "browse failed" signal
66  */
67 sigc::signal<void>
69 {
70  return signal_browse_failed_;
71 }
72 
73 /** Get "service added" signal.
74  * @return "service added" signal
75  */
76 sigc::signal<void, NetworkService *>
78 {
79  return signal_service_added_;
80 }
81 
82 /** Get "service remove" signal.
83  * @return "service remove" signal
84  */
85 sigc::signal<void, NetworkService *>
87 {
88  return signal_service_removed_;
89 }
90 
91 void
93 {
94  dispatcher_all_for_now_();
95 }
96 
97 void
99 {
100  dispatcher_cache_exhausted_();
101 }
102 
103 void
104 AvahiDispatcher::browse_failed(const char *name, const char *type, const char *domain)
105 {
106  dispatcher_browse_failed_();
107 }
108 
109 void
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 
126 void
127 AvahiDispatcher::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 
134 void
135 AvahiDispatcher::on_all_for_now()
136 {
137  signal_all_for_now_.emit();
138 }
139 
140 void
141 AvahiDispatcher::on_cache_exhausted()
142 {
143  signal_cache_exhausted_.emit();
144 }
145 
146 void
147 AvahiDispatcher::on_browse_failed()
148 {
149  signal_browse_failed_.emit();
150 }
151 
152 void
153 AvahiDispatcher::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 
165 void
166 AvahiDispatcher::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
fawkes::AvahiDispatcher::AvahiDispatcher
AvahiDispatcher()
Constructor.
Definition: avahi_dispatcher.cpp:37
fawkes::AvahiDispatcher::signal_all_for_now
sigc::signal< void > signal_all_for_now()
Get "all for now" signal.
Definition: avahi_dispatcher.cpp:50
fawkes::AvahiDispatcher::service_removed
virtual void service_removed(const char *name, const char *type, const char *domain)
A service has been removed from the network.
Definition: avahi_dispatcher.cpp:127
fawkes::AvahiDispatcher::all_for_now
virtual void all_for_now()
All results have been retrieved.
Definition: avahi_dispatcher.cpp:92
fawkes::AvahiDispatcher::signal_service_removed
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
Definition: avahi_dispatcher.cpp:86
fawkes::AvahiDispatcher::signal_service_added
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.
Definition: avahi_dispatcher.cpp:77
fawkes::NetworkService
Representation of a service announced or found via service discovery (i.e.
Definition: service.h:38
fawkes
Fawkes library namespace.
fawkes::AvahiDispatcher::browse_failed
virtual void browse_failed(const char *name, const char *type, const char *domain)
Failed to browse for a given service.
Definition: avahi_dispatcher.cpp:104
fawkes::AvahiDispatcher::signal_cache_exhausted
sigc::signal< void > signal_cache_exhausted()
Get "cache exhausted" signal.
Definition: avahi_dispatcher.cpp:59
fawkes::AvahiDispatcher::cache_exhausted
virtual void cache_exhausted()
Cache exhausted.
Definition: avahi_dispatcher.cpp:98
fawkes::AvahiDispatcher::service_added
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.
Definition: avahi_dispatcher.cpp:110
fawkes::AvahiDispatcher::signal_browse_failed
sigc::signal< void > signal_browse_failed()
Get "browse failed" signal.
Definition: avahi_dispatcher.cpp:68