Fawkes API
Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * service_browse_handler.cpp - Webview service browser 00004 * 00005 * Created: Thu Jul 02 18:00:20 2009 (RoboCup 2009, Graz) 00006 * Copyright 2006-2009 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. 00014 * 00015 * This program is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 * GNU Library General Public License for more details. 00019 * 00020 * Read the full text in the LICENSE.GPL file in the doc directory. 00021 */ 00022 00023 #include "service_browse_handler.h" 00024 00025 #include <utils/logging/logger.h> 00026 00027 using namespace fawkes; 00028 00029 /** @class WebviewServiceBrowseHandler "service_browse_handler.h" 00030 * Browse handler to detect other Webview instances on the network. 00031 * This browse handler is used to compile a list of other webview instances 00032 * on the local network. It is used to show a list of hosts in the footer of 00033 * webview pages. 00034 * @author Tim Niemueller 00035 */ 00036 00037 /** Constructor. 00038 * @param logger logger for informational logging 00039 * @param webview_service service of our own service as it was announced on the 00040 * network, used to filter it out from the list of services. 00041 */ 00042 WebviewServiceBrowseHandler::WebviewServiceBrowseHandler(fawkes::Logger *logger, 00043 fawkes::NetworkService *webview_service) 00044 { 00045 __logger = logger; 00046 __webview_service = webview_service; 00047 } 00048 00049 00050 void 00051 WebviewServiceBrowseHandler::all_for_now() 00052 { 00053 //__logger->log_debug("WebviewServiceBrowseHandler", "All for now"); 00054 } 00055 00056 00057 void 00058 WebviewServiceBrowseHandler::cache_exhausted() 00059 { 00060 //__logger->log_debug("WebviewServiceBrowseHandler", "Cache exhausted"); 00061 } 00062 00063 00064 void 00065 WebviewServiceBrowseHandler::browse_failed(const char *name, 00066 const char *type, 00067 const char *domain) 00068 { 00069 __logger->log_warn("WebviewServiceBrowseHandler", "Browsing for %s.%s in domain %s failed", 00070 name, type, domain); 00071 } 00072 00073 00074 void 00075 WebviewServiceBrowseHandler::service_added(const char *name, 00076 const char *type, 00077 const char *domain, 00078 const char *host_name, 00079 const struct sockaddr *addr, 00080 const socklen_t addr_size, 00081 uint16_t port, 00082 std::list<std::string> &txt, 00083 int flags) 00084 { 00085 if (__service_list.find(name) != __service_list.end()) { 00086 delete __service_list[name]; 00087 __service_list.erase(name); 00088 } 00089 // Check for fawkesver txt record 00090 for (std::list<std::string>::iterator i = txt.begin(); i != txt.end(); ++i) { 00091 std::string::size_type eqind = i->find("="); 00092 if (eqind != std::string::npos) { 00093 std::string key = i->substr(0, eqind); 00094 std::string val = i->substr(eqind + 1); 00095 if (key == "fawkesver") { 00096 NetworkService *s = new NetworkService(name, type, domain, host_name, port, 00097 addr, addr_size, txt); 00098 00099 if (! (*s == *__webview_service)) { 00100 __logger->log_debug("WebviewServiceBrowseHandler", "Service %s.%s on %s:%u added", 00101 name, type, host_name, port); 00102 __service_list[name] = s; 00103 } else { 00104 delete s; 00105 } 00106 break; 00107 } 00108 } 00109 } 00110 } 00111 00112 00113 void 00114 WebviewServiceBrowseHandler::service_removed(const char *name, 00115 const char *type, 00116 const char *domain) 00117 { 00118 if (__service_list.find(name) != __service_list.end()) { 00119 delete __service_list[name]; 00120 __service_list.erase(name); 00121 } 00122 __logger->log_debug("WebviewServiceBrowseHandler", "Service %s.%s has been removed", 00123 name, type); 00124 } 00125 00126 00127 /** Get the service list. 00128 * @return a list of services found on the network. 00129 */ 00130 WebviewServiceBrowseHandler::ServiceList & 00131 WebviewServiceBrowseHandler::service_list() 00132 { 00133 return __service_list; 00134 }