avahi_dispatcher.cpp

00001 
00002 /***************************************************************************
00003  *  avahi_dispatcher.h - Avahi browser handler and dispatcher
00004  *
00005  *  Created: Wed Nov 05 11:30:13 2008
00006  *  Copyright  2008  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009 
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version. A runtime exception applies to
00014  *  this software (see LICENSE.GPL_WRE file mentioned below for details).
00015  *
00016  *  This program is distributed in the hope that it will be useful,
00017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *  GNU Library General Public License for more details.
00020  *
00021  *  Read the full text in the LICENSE.GPL_WRE file in the doc directory.
00022  */
00023 
00024 #include <gui_utils/avahi_dispatcher.h>
00025 #include <netcomm/service_discovery/service.h>
00026 
00027 namespace fawkes {
00028 #if 0 /* just to make Emacs auto-indent happy */
00029 }
00030 #endif
00031 
00032 
00033 /** @class AvahiDispatcher <gui_utils/avahi_dispatcher.h>
00034  * Avahi dispatcher.
00035  * This class facilitates a dispatcher that is used to get events generated
00036  * by an AvahiThread into the main loop of a Gtk application.
00037  * @author Tim Niemueller
00038  */
00039 
00040 /** Constructor. */
00041 AvahiDispatcher::AvahiDispatcher()
00042 {
00043   __dispatcher_all_for_now.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_all_for_now));
00044   __dispatcher_cache_exhausted.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_cache_exhausted));
00045   __dispatcher_browse_failed.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_browse_failed));
00046   __dispatcher_service_added.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_added));
00047   __dispatcher_service_removed.connect(sigc::mem_fun(*this, &AvahiDispatcher::on_service_removed));
00048 }
00049 
00050 
00051 /** Get "all for now" signal.
00052  * @return "all for now" signal
00053  */
00054 sigc::signal<void>
00055 AvahiDispatcher::signal_all_for_now()
00056 {
00057   return __signal_all_for_now;
00058 }
00059 
00060 
00061 /** Get "cache exhausted" signal.
00062  * @return "cache exhausted" signal
00063  */
00064 sigc::signal<void>
00065 AvahiDispatcher::signal_cache_exhausted()
00066 {
00067   return __signal_cache_exhausted;
00068 }
00069 
00070 
00071 /** Get "browse failed" signal.
00072  * @return "browse failed" signal
00073  */
00074 sigc::signal<void>
00075 AvahiDispatcher::signal_browse_failed()
00076 {
00077   return __signal_browse_failed;
00078 }
00079 
00080 
00081 /** Get "service added" signal.
00082  * @return "service added" signal
00083  */
00084 sigc::signal<void, NetworkService *>
00085 AvahiDispatcher::signal_service_added()
00086 {
00087   return __signal_service_added;
00088 }
00089 
00090 
00091 /** Get "service remove" signal.
00092  * @return "service remove" signal
00093  */
00094 sigc::signal<void, NetworkService *>
00095 AvahiDispatcher::signal_service_removed()
00096 {
00097   return __signal_service_removed;
00098 }
00099 
00100 
00101 void
00102 AvahiDispatcher::all_for_now()
00103 {
00104   __dispatcher_all_for_now();
00105 }
00106 
00107 
00108 void
00109 AvahiDispatcher::cache_exhausted()
00110 {
00111   __dispatcher_cache_exhausted();
00112 }
00113 
00114 
00115 void
00116 AvahiDispatcher::browse_failed(const char *name,
00117                                const char *type,
00118                                const char *domain)
00119 {
00120   __dispatcher_browse_failed();
00121 }
00122 
00123 
00124 void
00125 AvahiDispatcher::service_added(const char *name,
00126                                const char *type,
00127                                const char *domain,
00128                                const char *host_name,
00129                                const struct sockaddr *addr,
00130                                const socklen_t addr_size,
00131                                uint16_t port,
00132                                std::list<std::string> &txt,
00133                                int flags)
00134 {
00135   NetworkService *s = new NetworkService(name, type, domain, host_name, port,
00136                                          addr, addr_size, txt);
00137   __queue_service_added.push_locked(s);
00138   __dispatcher_service_added();
00139 }
00140 
00141 
00142 void
00143 AvahiDispatcher::service_removed(const char *name,
00144                                  const char *type,
00145                                  const char *domain)
00146 {
00147   NetworkService *s = new NetworkService(name, type, domain);
00148   __queue_service_removed.push_locked(s);
00149   __dispatcher_service_removed();
00150 }
00151 
00152 
00153 void
00154 AvahiDispatcher::on_all_for_now()
00155 {
00156   __signal_all_for_now.emit();
00157 }
00158 
00159 void
00160 AvahiDispatcher::on_cache_exhausted()
00161 {
00162   __signal_cache_exhausted.emit();
00163 }
00164 
00165 void
00166 AvahiDispatcher::on_browse_failed()
00167 {
00168   __signal_browse_failed.emit();
00169 }
00170 
00171 void
00172 AvahiDispatcher::on_service_added()
00173 {
00174   __queue_service_added.lock();
00175   while (! __queue_service_added.empty()) {
00176     NetworkService *s = __queue_service_added.front();
00177     __signal_service_added.emit(s);
00178     delete s;
00179     __queue_service_added.pop();
00180   }
00181   __queue_service_added.unlock();
00182 }
00183 
00184 void
00185 AvahiDispatcher::on_service_removed()
00186 {
00187   __queue_service_removed.lock();
00188   while (! __queue_service_removed.empty()) {
00189     NetworkService *s = __queue_service_removed.front();
00190     __signal_service_removed.emit(s);
00191     delete s;
00192     __queue_service_removed.pop();
00193   }
00194   __queue_service_removed.unlock();
00195 }
00196 
00197 } // end namespace fawkes

Generated on 1 Mar 2011 for Fawkes API by  doxygen 1.6.1