24 #include <logging/liblogger.h>
25 #include <netcomm/fawkes/component_ids.h>
26 #include <netcomm/fawkes/hub.h>
27 #include <plugin/manager.h>
28 #include <plugin/net/handler.h>
29 #include <plugin/net/list_message.h>
30 #include <plugin/net/messages.h>
62 :
Thread(
"PluginNetworkHandler",
Thread::OPMODE_WAITFORWAKEUP),
88 PluginNetworkHandler::list_avail()
92 std::list<std::pair<std::string, std::string>> available_plugins;
95 std::list<std::pair<std::string, std::string>>::iterator i;
96 for (i = available_plugins.begin(); i != available_plugins.end(); ++i) {
97 m->
append(i->first.c_str(), i->first.length());
98 m->
append(i->second.c_str(), i->second.length());
104 PluginNetworkHandler::list_loaded()
106 PluginListMessage *m =
new PluginListMessage();
108 std::list<std::string> loaded_plugins;
111 std::list<std::string>::iterator i;
112 for (i = loaded_plugins.begin(); i != loaded_plugins.end(); ++i) {
113 m->append(i->c_str(), i->length());
120 PluginNetworkHandler::send_load_failure(
const char *plugin_name,
unsigned int client_id)
123 plugin_load_failed_msg_t *r =
124 (plugin_load_failed_msg_t *)calloc(1,
sizeof(plugin_load_failed_msg_t));
125 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH - 1);
126 hub_->
send(client_id,
127 FAWKES_CID_PLUGINMANAGER,
130 sizeof(plugin_load_failed_msg_t));
131 }
catch (Exception &e) {
132 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send load failure, exception follows");
138 PluginNetworkHandler::send_load_success(
const char *plugin_name,
unsigned int client_id)
141 plugin_loaded_msg_t *r = (plugin_loaded_msg_t *)calloc(1,
sizeof(plugin_loaded_msg_t));
142 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH - 1);
144 client_id, FAWKES_CID_PLUGINMANAGER,
MSG_PLUGIN_LOADED, r,
sizeof(plugin_loaded_msg_t));
145 }
catch (Exception &e) {
146 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send load success, exception follows");
152 PluginNetworkHandler::send_unloaded(
const char *plugin_name)
156 for (ssit_ = subscribers_.begin(); ssit_ != subscribers_.end(); ++ssit_) {
157 send_unload_success(plugin_name, *ssit_);
159 }
catch (Exception &e) {
167 PluginNetworkHandler::send_loaded(
const char *plugin_name)
171 for (ssit_ = subscribers_.begin(); ssit_ != subscribers_.end(); ++ssit_) {
172 send_load_success(plugin_name, *ssit_);
174 }
catch (Exception &e) {
182 PluginNetworkHandler::send_unload_failure(
const char *plugin_name,
unsigned int client_id)
185 plugin_unload_failed_msg_t *r =
186 (plugin_unload_failed_msg_t *)calloc(1,
sizeof(plugin_unload_failed_msg_t));
187 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH - 1);
188 hub_->
send(client_id,
189 FAWKES_CID_PLUGINMANAGER,
192 sizeof(plugin_unload_failed_msg_t));
193 }
catch (Exception &e) {
194 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send unload failure, exception follows");
200 PluginNetworkHandler::send_unload_success(
const char *plugin_name,
unsigned int client_id)
203 plugin_unloaded_msg_t *r = (plugin_unloaded_msg_t *)calloc(1,
sizeof(plugin_unloaded_msg_t));
204 strncpy(r->name, plugin_name, PLUGIN_MSG_NAME_LENGTH - 1);
206 client_id, FAWKES_CID_PLUGINMANAGER,
MSG_PLUGIN_UNLOADED, r,
sizeof(plugin_unloaded_msg_t));
207 }
catch (Exception &e) {
208 LibLogger::log_warn(
"PluginNetworkHandler",
"Failed to send unload success, exception follows");
222 PluginNetworkHandler::load(
const char *plugin_list,
unsigned int clid)
226 manager_->
load(plugin_list);
227 send_load_success(plugin_list, clid);
228 }
catch (Exception &e) {
231 send_load_failure(plugin_list, clid);
244 PluginNetworkHandler::unload(
const char *plugin_name,
unsigned int clid)
248 manager_->
unload(plugin_name);
249 send_unload_success(plugin_name, clid);
250 }
catch (Exception &e) {
253 send_unload_failure(plugin_name, clid);
263 while (!inbound_queue_.empty()) {
266 switch (msg->
msgid()) {
272 char name[PLUGIN_MSG_NAME_LENGTH + 1];
273 name[PLUGIN_MSG_NAME_LENGTH] = 0;
274 strncpy(
name, m->
name, PLUGIN_MSG_NAME_LENGTH);
278 "Client requested loading of %s which is already loaded",
280 send_load_success(
name, msg->
clid());
293 char name[PLUGIN_MSG_NAME_LENGTH + 1];
294 name[PLUGIN_MSG_NAME_LENGTH] = 0;
295 strncpy(
name, m->
name, PLUGIN_MSG_NAME_LENGTH);
299 "Client requested unloading of %s which is not loaded",
301 send_unload_success(
name, msg->
clid());
331 subscribers_.push_back(msg->
clid());
333 subscribers_.unique();
371 send_loaded(plugin_name);
377 send_unloaded(plugin_name);
Base class for exceptions in Fawkes.
Network handler abstract base class.
virtual void send(FawkesNetworkMessage *msg)=0
Method to send a message to a specific client.
virtual void remove_handler(FawkesNetworkHandler *handler)=0
Remove a message handler.
virtual void add_handler(FawkesNetworkHandler *handler)=0
Add a message handler.
Representation of a message that is sent over the network.
unsigned short int msgid() const
Get message type ID.
unsigned int clid() const
Get client ID.
void * payload() const
Get payload buffer.
size_t payload_size() const
Get payload size.
static void log_warn(const char *component, const char *format,...)
Log warning message.
static void log_info(const char *component, const char *format,...)
Log informational message.
static void log_error(const char *component, const char *format,...)
Log error message.
virtual void unlock() const
Unlock list.
virtual void lock() const
Lock list.
void remove_locked(const Type &x)
Remove element from list with lock protection.
void pop_locked()
Pop element from queue with lock protection.
void push_locked(const Type &x)
Push element to queue with lock protection.
void append(const char *plugin_name, size_t len)
Append plugin name.
void remove_listener(PluginManagerListener *listener)
Remove listener.
bool is_loaded(const std::string &plugin_name)
Check if plugin is loaded.
void unload(const std::string &plugin_name)
Unload plugin.
std::list< std::pair< std::string, std::string > > get_available_plugins()
Generate list of all available plugins.
void add_listener(PluginManagerListener *listener)
Add listener.
void load(const std::string &plugin_list)
Load plugin.
std::list< std::string > get_loaded_plugins()
Get list of loaded plugins.
void unlock()
Unlock plugin manager.
void lock()
Lock plugin manager.
~PluginNetworkHandler()
Destructor.
virtual void handle_network_message(FawkesNetworkMessage *msg)
Called for incoming messages that are addressed to the correct component ID.
virtual void plugin_unloaded(const char *plugin_name)
Plugin unloaded event.
virtual void loop()
Process all network messages that have been received.
PluginNetworkHandler(PluginManager *manager, FawkesNetworkHub *hub)
Constructor.
virtual void client_connected(unsigned int clid)
Called when a new client connected.
virtual void client_disconnected(unsigned int clid)
Called when a client disconnected.
virtual void plugin_loaded(const char *plugin_name)
Plugin loaded event.
void unref()
Decrement reference count and conditionally delete this instance.
void ref()
Increment reference count.
Thread class encapsulation of pthreads.
const char * name() const
Get name of thread.
void wakeup()
Wake up thread.
Fawkes library namespace.
@ MSG_PLUGIN_UNLOAD
request plugin unload (plugin_unload_msg_t)
@ MSG_PLUGIN_UNLOAD_FAILED
plugin unload failed (plugin_unload_failed_msg_t)
@ MSG_PLUGIN_LIST_LOADED
request lif of loaded plugins
@ MSG_PLUGIN_AVAIL_LIST_FAILED
listing available plugins failed
@ MSG_PLUGIN_LOADED_LIST_FAILED
listing loaded plugins failed
@ MSG_PLUGIN_AVAIL_LIST
list of available plugins (plugin_list_msg_t)
@ MSG_PLUGIN_LOAD
request plugin load (plugin_load_msg_t)
@ MSG_PLUGIN_LOAD_FAILED
plugin load failed (plugin_load_failed_msg_t)
@ MSG_PLUGIN_LOADED_LIST
list of loaded plugins (plugin_list_msg_t)
@ MSG_PLUGIN_LIST_AVAIL
request list of available plugins
@ MSG_PLUGIN_SUBSCRIBE_WATCH
Subscribe for watching load/unload events.
@ MSG_PLUGIN_UNSUBSCRIBE_WATCH
Unsubscribe from watching load/unload events.
@ MSG_PLUGIN_UNLOADED
plugin unloaded (plugin_unloaded_msg_t)
@ MSG_PLUGIN_LOADED
plugin loaded (plugin_loaded_msg_t)
char name[PLUGIN_MSG_NAME_LENGTH]
name of the plugin to load.
char name[PLUGIN_MSG_NAME_LENGTH]
name of te plugin to unload.