Fawkes API  Fawkes Development Version
service_browse_handler.cpp
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 }