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-2011  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 <netcomm/fawkes/network_manager.h>
00025 #include <core/threading/thread_collector.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 #ifdef HAVE_AVAHI
00032 #include <netcomm/dns-sd/avahi_thread.h>
00033 #include <netcomm/service_discovery/service.h>
00034 #else
00035 #include <netcomm/service_discovery/dummy_service_publisher.h>
00036 #include <netcomm/service_discovery/dummy_service_browser.h>
00037 #endif
00038 
00039 #include <cstdlib>
00040 
00041 namespace fawkes {
00042 #if 0 /* just to make Emacs auto-indent happy */
00043 }
00044 #endif
00045 
00046 /** @class FawkesNetworkManager <netcomm/fawkes/network_manager.h>
00047  * Fawkes Network Manager.
00048  * This class provides a manager for network connections used in Fawkes.
00049  *
00050  * @author Tim Niemueller
00051  */
00052 
00053 /** Constructor.
00054  * @param thread_collector thread collector that threads shall be registered to
00055  * @param fawkes_port port to listen on for Fawkes network connections
00056  * @param service_name Avahi service name for Fawkes network service
00057  */
00058 FawkesNetworkManager::FawkesNetworkManager(ThreadCollector *thread_collector,
00059                                            unsigned short int fawkes_port,
00060                                            const char *service_name)
00061 {
00062   __fawkes_port      = fawkes_port;
00063   __thread_collector = thread_collector;
00064   __fawkes_network_thread = new FawkesNetworkServerThread(__fawkes_port,
00065                                                           __thread_collector);
00066   __thread_collector->add(__fawkes_network_thread);
00067 #ifdef HAVE_AVAHI
00068   __avahi_thread          = new AvahiThread();
00069   __service_publisher     = __avahi_thread;
00070   __service_browser       = __avahi_thread;
00071   __thread_collector->add(__avahi_thread);
00072   __nnresolver = new NetworkNameResolver(__avahi_thread);
00073   NetworkService *fawkes_service = new NetworkService(__nnresolver, service_name,
00074                                                       "_fawkes._tcp",
00075                                                       __fawkes_port);
00076   __avahi_thread->publish_service(fawkes_service);
00077   delete fawkes_service;
00078 #else
00079   __service_publisher = new DummyServicePublisher();
00080   __service_browser   = new DummyServiceBrowser();
00081   __nnresolver        = new NetworkNameResolver();
00082 #endif
00083 }
00084 
00085 
00086 /** Destructor. */
00087 FawkesNetworkManager::~FawkesNetworkManager()
00088 {
00089   __thread_collector->remove(__fawkes_network_thread);
00090   delete __fawkes_network_thread;
00091 #ifdef HAVE_AVAHI
00092   __thread_collector->remove(__avahi_thread);
00093   delete __avahi_thread;
00094 #else
00095   delete __service_publisher;
00096   delete __service_browser;
00097 #endif
00098   delete __nnresolver;
00099 }
00100 
00101 
00102 /** Get Fawkes network hub.
00103  * @return Fawkes network hub
00104  */
00105 FawkesNetworkHub *
00106 FawkesNetworkManager::hub()
00107 {
00108   return __fawkes_network_thread;
00109 }
00110 
00111 
00112 /** Get network name resolver.
00113  * @return network name resolver
00114  */
00115 NetworkNameResolver *
00116 FawkesNetworkManager::nnresolver()
00117 {
00118   return __nnresolver;
00119 }
00120 
00121 
00122 /** Get service publisher
00123  * @return service publisher
00124  */
00125 ServicePublisher *
00126 FawkesNetworkManager::service_publisher()
00127 {
00128   return __service_publisher;
00129 }
00130 
00131 
00132 /** Get service browser.
00133  * @return service browser
00134  */
00135 ServiceBrowser *
00136 FawkesNetworkManager::service_browser()
00137 {
00138   return __service_browser;
00139 }
00140 
00141 } // end namespace fawkes