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()
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)
134 strncpy(r->
name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
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)
149 strncpy(r->
name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
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);
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);
192 PluginNetworkHandler::send_unload_failure(
const char *plugin_name,
193 unsigned int client_id)
197 strncpy(r->
name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
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)
212 strncpy(r->
name, plugin_name, PLUGIN_MSG_NAME_LENGTH);
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);
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);
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);
void * payload() const
Get payload buffer.
virtual void plugin_unloaded(const char *plugin_name)
Plugin unloaded event.
request list of available plugins
static void log_info(const char *component, const char *format,...)
Log informational message.
plugin unloaded (plugin_unloaded_msg_t)
PluginNetworkHandler(PluginManager *manager, FawkesNetworkHub *hub)
Constructor.
listing available plugins failed
Unsubscribe from watching load/unload events.
void unref()
Decrement reference count and conditionally delete this instance.
virtual void lock() const
Lock list.
char name[PLUGIN_MSG_NAME_LENGTH]
name of the plugin that has been loaded
virtual void loop()
Process all network messages that have been received.
std::list< std::pair< std::string, std::string > > get_available_plugins()
Generate list of all available plugins.
Fawkes library namespace.
unsigned int clid() const
Get client ID.
virtual void add_handler(FawkesNetworkHandler *handler)=0
Add a message handler.
Representation of a message that is sent over the network.
Thread class encapsulation of pthreads.
void remove_locked(const Type &x)
Remove element from list with lock protection.
~PluginNetworkHandler()
Destructor.
char name[PLUGIN_MSG_NAME_LENGTH]
name of the plugin to load.
list of loaded plugins (plugin_list_msg_t)
plugin unload failed (plugin_unload_failed_msg_t)
void lock()
Lock plugin manager.
virtual void handle_network_message(FawkesNetworkMessage *msg)
Called for incoming messages that are addressed to the correct component ID.
char name[PLUGIN_MSG_NAME_LENGTH]
name of plugin that could not be unloaded
void add_listener(PluginManagerListener *listener)
Add listener.
static void log_error(const char *component, const char *format,...)
Log error message.
plugin loaded (plugin_loaded_msg_t)
char name[PLUGIN_MSG_NAME_LENGTH]
name of plugin that could not be unloaded
void wakeup()
Wake up thread.
request plugin unload (plugin_unload_msg_t)
list of available plugins (plugin_list_msg_t)
Base class for exceptions in Fawkes.
void load(const char *plugin_list)
Load plugin.
virtual void send(FawkesNetworkMessage *msg)=0
Method to send a message to a specific client.
void remove_listener(PluginManagerListener *listener)
Remove listener.
void ref()
Increment reference count.
virtual void unlock() const
Unlock list.
std::list< std::string > get_loaded_plugins()
Get list of loaded plugins.
void unload(const char *plugin_name)
Unload plugin.
const char * name() const
Get name of thread.
virtual void plugin_loaded(const char *plugin_name)
Plugin loaded event.
Network handler abstract base class.
listing loaded plugins failed
static void log_warn(const char *component, const char *format,...)
Log warning message.
char name[PLUGIN_MSG_NAME_LENGTH]
name of the plugin that has been unloaded
virtual void client_disconnected(unsigned int clid)
Called when a client disconnected.
void pop_locked()
Pop element from queue with lock protection.
void append(const char *plugin_name, size_t len)
Append plugin name.
unsigned short int msgid() const
Get message type ID.
request lif of loaded plugins
request plugin load (plugin_load_msg_t)
bool is_loaded(const char *plugin_name)
Check if plugin is loaded.
void push_locked(const Type &x)
Push element to queue with lock protection.
virtual void client_connected(unsigned int clid)
Called when a new client connected.
Subscribe for watching load/unload events.
plugin load failed (plugin_load_failed_msg_t)
void unlock()
Unlock plugin manager.
virtual void remove_handler(FawkesNetworkHandler *handler)=0
Remove a message handler.
char name[PLUGIN_MSG_NAME_LENGTH]
name of te plugin to unload.
size_t payload_size() const
Get payload size.