24 #include <config/net_list_content.h>
25 #include <core/exceptions/software.h>
26 #include <netcomm/fawkes/component_ids.h>
27 #include <netcomm/utils/dynamic_buffer.h>
46 config_list =
new DynamicBuffer(&(msg.
config_list));
61 if (component_id != FAWKES_CID_CONFIGMANAGER) {
65 void * config_list_payload = (
void *)((
size_t)
payload +
sizeof(msg));
84 copy_data_vector(T *in, T *out,
const size_t num_values)
86 for (
unsigned int j = 0; j < num_values; ++j) {
99 unsigned int num_values = (i->is_list() ? i->get_list_size() : 1);
100 size_t data_size = 0;
104 memset(&cle, 0,
sizeof(cle));
105 strncpy(cle.
cp.
path, i->path(), CONFIG_MSG_PATH_LENGTH - 1);
106 cle.
type = MSG_CONFIG_FLOAT_VALUE;
108 cle.
cp.
num_values = (i->is_list() ? i->get_list_size() : 0);
111 cle.
type = MSG_CONFIG_UINT_VALUE;
112 data_size = num_values *
sizeof(uint32_t);
113 }
else if (i->is_int()) {
114 cle.
type = MSG_CONFIG_INT_VALUE;
115 data_size = num_values *
sizeof(int32_t);
116 }
else if (i->is_bool()) {
117 cle.
type = MSG_CONFIG_BOOL_VALUE;
118 data_size = num_values *
sizeof(int32_t);
119 }
else if (i->is_float()) {
120 cle.
type = MSG_CONFIG_FLOAT_VALUE;
121 data_size = num_values *
sizeof(float);
122 }
else if (i->is_string()) {
123 cle.
type = MSG_CONFIG_STRING_VALUE;
125 std::vector<std::string> values = i->get_strings();
126 for (
unsigned int j = 0; j < values.size(); ++j) {
127 data_size +=
sizeof(config_string_value_t) + values[j].length() + 1;
130 data_size =
sizeof(config_string_value_t) + i->get_string().length() + 1;
133 throw Exception(
"Invalid type of config iterator value (%s)", i->path());
136 data = (
char *)malloc(
sizeof(config_list_entity_header_t) + data_size);
137 memcpy(data, &cle,
sizeof(config_list_entity_header_t));
141 copy_data_vector(&i->get_uints()[0], (uint32_t *)(data +
sizeof(cle)), num_values);
143 *((uint32_t *)(data +
sizeof(cle))) = i->get_uint();
145 }
else if (i->is_int()) {
147 copy_data_vector(&i->get_ints()[0], (int32_t *)(data +
sizeof(cle)), num_values);
149 *((int32_t *)(data +
sizeof(cle))) = i->get_int();
151 }
else if (i->is_bool()) {
153 std::vector<bool> values = i->get_bools();
154 int32_t * msg_values = (int32_t *)(data +
sizeof(cle));
155 for (
unsigned int j = 0; j < values.size(); ++j) {
156 msg_values[j] = values[j] ? 1 : 0;
160 *((int32_t *)(data +
sizeof(cle))) = i->get_bool() ? 1 : 0;
162 }
else if (i->is_float()) {
164 copy_data_vector(&i->get_floats()[0], (
float *)(data +
sizeof(cle)), num_values);
166 *((
float *)(data +
sizeof(cle))) = i->get_float();
168 }
else if (i->is_string()) {
170 std::vector<std::string> values = i->get_strings();
171 char * tmpdata = (
char *)data +
sizeof(cle);
172 for (
unsigned int j = 0; j < values.size(); ++j) {
173 config_string_value_t *csv = (config_string_value_t *)tmpdata;
174 csv->s_length = values[j].length();
175 char *msg_string = tmpdata +
sizeof(config_string_value_t);
176 strcpy(msg_string, values[j].c_str());
177 tmpdata +=
sizeof(config_string_value_t) + values[j].length() + 1;
180 config_string_value_t *csv = (config_string_value_t *)((
char *)data +
sizeof(cle));
181 csv->s_length = i->get_string().length();
182 char *msg_string = data +
sizeof(cle) +
sizeof(config_string_value_t);
183 strcpy(msg_string, i->get_string().c_str());
187 config_list->
append(data,
sizeof(cle) + data_size);
227 void *tmp = config_list->
next(size);