24 #include <plugin/manager.h>
25 #include <plugin/net/handler.h>
26 #include <plugin/net/messages.h>
27 #include <plugin/net/list_message.h>
29 #include <logging/liblogger.h>
31 #include <netcomm/fawkes/component_ids.h>
32 #include <netcomm/fawkes/hub.h>
68 :
Thread(
"PluginNetworkHandler",
Thread::OPMODE_WAITFORWAKEUP),
96 PluginNetworkHandler::list_avail()
100 std::list<std::pair<std::string, std::string> > available_plugins;
103 std::list<std::pair<std::string, std::string> >::iterator i;
104 for (i = available_plugins.begin(); i != available_plugins.end(); ++i) {
105 m->
append(i->first.c_str(), i->first.length());
106 m->
append(i->second.c_str(), i->second.length());
112 PluginNetworkHandler::list_loaded()
114 PluginListMessage *m =
new PluginListMessage();
116 std::list<std::string> loaded_plugins;
119 std::list<std::string>::iterator i;
120 for (i = loaded_plugins.begin(); i != loaded_plugins.end(); ++i) {
121 m->append(i->c_str(), i->length());
129 PluginNetworkHandler::send_load_failure(
const char *plugin_name,
130 unsigned int client_id)
133 plugin_load_failed_msg_t *r = (plugin_load_failed_msg_t *)calloc(1,
sizeof(plugin_load_failed_msg_t));
134 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
136 r,
sizeof(plugin_load_failed_msg_t));
137 }
catch (Exception &e) {
138 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send load failure, exception follows");
145 PluginNetworkHandler::send_load_success(
const char *plugin_name,
unsigned int client_id)
148 plugin_loaded_msg_t *r = (plugin_loaded_msg_t *)calloc(1,
sizeof(plugin_loaded_msg_t));
149 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
151 r,
sizeof(plugin_loaded_msg_t));
152 }
catch (Exception &e) {
153 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send load success, exception follows");
160 PluginNetworkHandler::send_unloaded(
const char *plugin_name)
162 __subscribers.
lock();
164 for (__ssit = __subscribers.begin(); __ssit != __subscribers.end(); ++__ssit) {
165 send_unload_success(plugin_name, *__ssit);
167 }
catch (Exception &e) {
176 PluginNetworkHandler::send_loaded(
const char *plugin_name)
178 __subscribers.
lock();
180 for (__ssit = __subscribers.begin(); __ssit != __subscribers.end(); ++__ssit) {
181 send_load_success(plugin_name, *__ssit);
183 }
catch (Exception &e) {
192 PluginNetworkHandler::send_unload_failure(
const char *plugin_name,
193 unsigned int client_id)
196 plugin_unload_failed_msg_t *r = (plugin_unload_failed_msg_t *)calloc(1,
sizeof(plugin_unload_failed_msg_t));
197 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
199 r,
sizeof(plugin_unload_failed_msg_t));
200 }
catch (Exception &e) {
201 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send unload failure, exception follows");
208 PluginNetworkHandler::send_unload_success(
const char *plugin_name,
unsigned int client_id)
211 plugin_unloaded_msg_t *r = (plugin_unloaded_msg_t *)calloc(1,
sizeof(plugin_unloaded_msg_t));
212 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
214 r,
sizeof(plugin_unloaded_msg_t));
215 }
catch (Exception &e) {
216 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send unload success, exception follows");
232 PluginNetworkHandler::load(
const char *plugin_list,
unsigned int clid)
236 __manager->
load(plugin_list);
237 send_load_success(plugin_list, clid);
238 }
catch (Exception &e) {
241 send_load_failure(plugin_list, clid);
255 PluginNetworkHandler::unload(
const char *plugin_name,
unsigned int clid)
259 __manager->
unload(plugin_name);
260 send_unload_success(plugin_name, clid);
261 }
catch (Exception &e) {
264 send_unload_failure(plugin_name, clid);
275 while ( ! __inbound_queue.empty() ) {
278 switch (msg->
msgid()) {
284 char name[PLUGIN_MSG_NAME_LENGTH + 1];
285 name[PLUGIN_MSG_NAME_LENGTH] = 0;
286 strncpy(name, m->
name, PLUGIN_MSG_NAME_LENGTH);
289 LibLogger::log_info(
"PluginNetworkHandler",
"Client requested loading of %s which is already loaded", name);
290 send_load_success(name, msg->
clid());
293 load(name, msg->
clid());
303 char name[PLUGIN_MSG_NAME_LENGTH + 1];
304 name[PLUGIN_MSG_NAME_LENGTH] = 0;
305 strncpy(name, m->
name, PLUGIN_MSG_NAME_LENGTH);
308 LibLogger::log_info(
"PluginNetworkHandler",
"Client requested unloading of %s which is not loaded", name);
309 send_unload_success(name, msg->
clid());
312 unload(name, msg->
clid());
338 __subscribers.
lock();
339 __subscribers.push_back(msg->
clid());
340 __subscribers.sort();
341 __subscribers.unique();
384 send_loaded(plugin_name);
390 send_unloaded(plugin_name);