Fawkes API  Fawkes Development Version
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
network_manager.cpp
1 
2 /***************************************************************************
3  * network_manager.cpp - Fawkes network manager
4  *
5  * Created: Wed Nov 16 00:05:18 2006
6  * Copyright 2006-2011 Tim Niemueller [www.niemueller.de]
7  *
8  ****************************************************************************/
9 
10 /* This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version. A runtime exception applies to
14  * this software (see LICENSE.GPL_WRE file mentioned below for details).
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU Library General Public License for more details.
20  *
21  * Read the full text in the LICENSE.GPL_WRE file in the doc directory.
22  */
23 
24 #include <netcomm/fawkes/network_manager.h>
25 #include <core/threading/thread_collector.h>
26 
27 #include <core/exceptions/system.h>
28 #include <netcomm/fawkes/server_thread.h>
29 #include <netcomm/fawkes/handler.h>
30 #include <netcomm/utils/resolver.h>
31 #ifdef HAVE_AVAHI
32 #include <netcomm/dns-sd/avahi_thread.h>
33 #include <netcomm/service_discovery/service.h>
34 #else
35 #include <netcomm/service_discovery/dummy_service_publisher.h>
36 #include <netcomm/service_discovery/dummy_service_browser.h>
37 #endif
38 
39 #include <cstdlib>
40 
41 namespace fawkes {
42 #if 0 /* just to make Emacs auto-indent happy */
43 }
44 #endif
45 
46 /** @class FawkesNetworkManager <netcomm/fawkes/network_manager.h>
47  * Fawkes Network Manager.
48  * This class provides a manager for network connections used in Fawkes.
49  *
50  * @author Tim Niemueller
51  */
52 
53 /** Constructor.
54  * @param thread_collector thread collector that threads shall be registered to
55  * @param fawkes_port port to listen on for Fawkes network connections
56  * @param service_name Avahi service name for Fawkes network service
57  */
58 FawkesNetworkManager::FawkesNetworkManager(ThreadCollector *thread_collector,
59  unsigned short int fawkes_port,
60  const char *service_name)
61 {
62  __fawkes_port = fawkes_port;
63  __thread_collector = thread_collector;
64  __fawkes_network_thread = new FawkesNetworkServerThread(__fawkes_port,
65  __thread_collector);
66  __thread_collector->add(__fawkes_network_thread);
67 #ifdef HAVE_AVAHI
68  __avahi_thread = new AvahiThread();
69  __service_publisher = __avahi_thread;
70  __service_browser = __avahi_thread;
71  __thread_collector->add(__avahi_thread);
72  __nnresolver = new NetworkNameResolver(__avahi_thread);
73  NetworkService *fawkes_service = new NetworkService(__nnresolver, service_name,
74  "_fawkes._tcp",
75  __fawkes_port);
76  __avahi_thread->publish_service(fawkes_service);
77  delete fawkes_service;
78 #else
79  __service_publisher = new DummyServicePublisher();
80  __service_browser = new DummyServiceBrowser();
81  __nnresolver = new NetworkNameResolver();
82 #endif
83 }
84 
85 
86 /** Destructor. */
87 FawkesNetworkManager::~FawkesNetworkManager()
88 {
89  __thread_collector->remove(__fawkes_network_thread);
90  delete __fawkes_network_thread;
91 #ifdef HAVE_AVAHI
92  __thread_collector->remove(__avahi_thread);
93  delete __avahi_thread;
94 #else
95  delete __service_publisher;
96  delete __service_browser;
97 #endif
98  delete __nnresolver;
99 }
100 
101 
102 /** Get Fawkes network hub.
103  * @return Fawkes network hub
104  */
106 FawkesNetworkManager::hub()
107 {
108  return __fawkes_network_thread;
109 }
110 
111 
112 /** Get network name resolver.
113  * @return network name resolver
114  */
116 FawkesNetworkManager::nnresolver()
117 {
118  return __nnresolver;
119 }
120 
121 
122 /** Get service publisher
123  * @return service publisher
124  */
126 FawkesNetworkManager::service_publisher()
127 {
128  return __service_publisher;
129 }
130 
131 
132 /** Get service browser.
133  * @return service browser
134  */
136 FawkesNetworkManager::service_browser()
137 {
138  return __service_browser;
139 }
140 
141 } // end namespace fawkes