Fawkes API  Fawkes Development Version
network_manager.cpp
00001 
00002 /***************************************************************************
00003  *  network_manager.cpp - Fawkes network manager
00004  *
00005  *  Created: Wed Nov 16 00:05:18 2006
00006  *  Copyright  2006  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 "network_manager.h"
00025 #include "thread_manager.h"
00026 
00027 #include <core/exceptions/system.h>
00028 #include <netcomm/fawkes/server_thread.h>
00029 #include <netcomm/fawkes/handler.h>
00030 #include <netcomm/utils/resolver.h>
00031 #include <utils/logging/liblogger.h>
00032 #ifdef HAVE_AVAHI
00033 #include <netcomm/dns-sd/avahi_thread.h>
00034 #include <netcomm/service_discovery/service.h>
00035 #else
00036 #include <netcomm/service_discovery/dummy_service_publisher.h>
00037 #include <netcomm/service_discovery/dummy_service_browser.h>
00038 #endif
00039 
00040 #include <cstdlib>
00041 
00042 using namespace fawkes;
00043 
00044 /** @class FawkesNetworkManager mainapp/network_manager.h
00045  * Fawkes Network Manager.
00046  * This class provides a manager for network connections used in Fawkes.
00047  *
00048  * @author Tim Niemueller
00049  */
00050 
00051 /** Constructor.
00052  * @param thread_manager thread manager that threads shall be registered to
00053  * @param fawkes_port port to listen on for Fawkes network connections
00054  * @param service_name Avahi service name for Fawkes network service
00055  */
00056 FawkesNetworkManager::FawkesNetworkManager(FawkesThreadManager *thread_manager,
00057                                            unsigned short int fawkes_port,
00058                                            const char *service_name)
00059 {
00060   this->fawkes_port    = fawkes_port;
00061   this->thread_manager = thread_manager;
00062   fawkes_network_thread = new FawkesNetworkServerThread(fawkes_port, thread_manager);
00063   thread_manager->add(fawkes_network_thread);
00064 #ifdef HAVE_AVAHI
00065   avahi_thread          = new AvahiThread();
00066   _service_publisher     = avahi_thread;
00067   _service_browser       = avahi_thread;
00068   thread_manager->add(avahi_thread);
00069   _nnresolver = new NetworkNameResolver(avahi_thread);
00070   NetworkService *fawkes_service = new NetworkService(_nnresolver, service_name,
00071                                                       "_fawkes._tcp", fawkes_port);
00072   avahi_thread->publish_service(fawkes_service);
00073   delete fawkes_service;
00074 #else
00075   LibLogger::log_warn("FawkesNetworkManager", "Avahi not available, only using dummies "
00076                       "for service publishing/browsing.");
00077   _service_publisher = new DummyServicePublisher();
00078   _service_browser   = new DummyServiceBrowser();
00079   _nnresolver        = new NetworkNameResolver();
00080 #endif
00081 }
00082 
00083 
00084 /** Destructor. */
00085 FawkesNetworkManager::~FawkesNetworkManager()
00086 {
00087   thread_manager->remove(fawkes_network_thread);
00088   delete fawkes_network_thread;
00089 #ifdef HAVE_AVAHI
00090   thread_manager->remove(avahi_thread);
00091   delete avahi_thread;
00092 #else
00093   delete _service_publisher;
00094   delete _service_browser;
00095 #endif
00096   delete _nnresolver;
00097 }
00098 
00099 
00100 /** Get Fawkes network hub.
00101  * @return Fawkes network hub
00102  */
00103 FawkesNetworkHub *
00104 FawkesNetworkManager::hub()
00105 {
00106   return fawkes_network_thread;
00107 }
00108 
00109 
00110 /** Get network name resolver.
00111  * @return network name resolver
00112  */
00113 NetworkNameResolver *
00114 FawkesNetworkManager::nnresolver()
00115 {
00116   return _nnresolver;
00117 }
00118 
00119 
00120 /** Get service publisher
00121  * @return service publisher
00122  */
00123 ServicePublisher *
00124 FawkesNetworkManager::service_publisher()
00125 {
00126   return _service_publisher;
00127 }
00128 
00129 
00130 /** Get service browser.
00131  * @return service browser
00132  */
00133 ServiceBrowser *
00134 FawkesNetworkManager::service_browser()
00135 {
00136   return _service_browser;
00137 }