Fawkes API
Fawkes Development Version
|
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