00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <plugin/net/list_message.h>
00025
00026 #include <netcomm/utils/dynamic_buffer.h>
00027 #include <netcomm/fawkes/component_ids.h>
00028 #include <core/exceptions/software.h>
00029 #include <cstdlib>
00030 #include <cstring>
00031
00032 namespace fawkes {
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 PluginListMessage::PluginListMessage()
00045 {
00046 plugin_list = new DynamicBuffer(&(msg.plugin_list));
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 PluginListMessage::PluginListMessage(unsigned int component_id,
00058 unsigned int msg_id,
00059 void *payload, size_t payload_size)
00060 {
00061 if ( component_id != FAWKES_CID_PLUGINMANAGER ) {
00062 throw TypeMismatchException("PluginListMessage: invalid component ID");
00063 }
00064 plugin_list_msg_t *tmsg = (plugin_list_msg_t *)payload;
00065 void *plugin_list_payload = (void *)((size_t)payload + sizeof(msg));
00066 plugin_list = new DynamicBuffer(&(tmsg->plugin_list), plugin_list_payload,
00067 payload_size - sizeof(msg));
00068 }
00069
00070
00071
00072 PluginListMessage::~PluginListMessage()
00073 {
00074 delete plugin_list;
00075 if (_payload != NULL) {
00076 free(_payload);
00077 _payload = NULL;
00078 _payload_size = 0;
00079 }
00080 }
00081
00082
00083
00084
00085
00086
00087
00088 void
00089 PluginListMessage::append(const char *plugin_name, size_t len)
00090 {
00091 plugin_list->append(plugin_name, len);
00092 }
00093
00094
00095 void
00096 PluginListMessage::serialize()
00097 {
00098 _payload_size = sizeof(msg) + plugin_list->buffer_size();
00099 _payload = malloc(_payload_size);
00100 copy_payload(0, &msg, sizeof(msg));
00101 copy_payload(sizeof(msg), plugin_list->buffer(), plugin_list->buffer_size());
00102 }
00103
00104
00105
00106
00107
00108 void
00109 PluginListMessage::reset_iterator()
00110 {
00111 plugin_list->reset_iterator();
00112 }
00113
00114
00115
00116
00117
00118
00119 bool
00120 PluginListMessage::has_next()
00121 {
00122 return plugin_list->has_next();
00123 }
00124
00125
00126
00127
00128
00129
00130 char *
00131 PluginListMessage::next()
00132 {
00133 size_t size;
00134 void *tmp = plugin_list->next(&size);
00135 return strndup((const char *)tmp, size);
00136 }
00137
00138 }