24 #include <config/net_handler.h>
25 #include <config/net_messages.h>
26 #include <config/net_list_content.h>
27 #include <logging/liblogger.h>
29 #include <netcomm/fawkes/component_ids.h>
30 #include <netcomm/fawkes/hub.h>
31 #include <config/config.h>
54 :
Thread(
"ConfigNetworkHandler",
Thread::OPMODE_WAITFORWAKEUP),
74 __inbound_queue.
clear();
83 ConfigNetworkHandler::send_inv_value(
unsigned int clid,
const char *path)
95 ConfigNetworkHandler::send_value(
unsigned int clid, Configuration::ValueIterator *i)
97 if ( i->is_float() ) {
99 config_float_value_msg_t *r = prepare_msg<config_float_value_msg_t>(i->path(), i->is_default());
100 r->f = i->get_float();
101 __hub->
send(clid, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_FLOAT_VALUE, r,
sizeof(config_float_value_msg_t));
102 }
catch (Exception &e) {
104 "send_value: Value %s could not be sent",
108 }
else if ( i->is_uint() ) {
110 config_uint_value_msg_t *r = prepare_msg<config_uint_value_msg_t>(i->path(), i->is_default());
111 r->u = i->get_uint();
112 __hub->
send(clid, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_UINT_VALUE, r,
sizeof(config_uint_value_msg_t));
113 }
catch (Exception &e) {
115 "send_value: Value %s could not be sent",
119 }
else if ( i->is_int() ) {
121 config_int_value_msg_t *r = prepare_msg<config_int_value_msg_t>(i->path(), i->is_default());
123 __hub->
send(clid, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_INT_VALUE, r,
sizeof(config_int_value_msg_t));
124 }
catch (Exception &e) {
126 "send_value: Value %s could not be sent",
130 }
else if ( i->is_bool() ) {
132 config_bool_value_msg_t *r = prepare_msg<config_bool_value_msg_t>(i->path(), i->is_default());
133 r->b = (i->get_bool() ? 1 : 0);
134 __hub->
send(clid, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_BOOL_VALUE, r,
sizeof(config_bool_value_msg_t));
135 }
catch (Exception &e) {
137 "send_value: Value %s could not be sent",
141 }
else if ( i->is_string() ) {
143 size_t sl =
sizeof(config_string_value_msg_t) + i->get_string().length();
144 config_string_value_msg_t *m = (config_string_value_msg_t *)calloc(1, sl);
145 strncpy(m->cp.path, i->path(), CONFIG_MSG_PATH_LENGTH);
146 m->cp.is_default = i->is_default() ? 1 : 0;
147 m->s_length = i->get_string().length();
148 strcpy(m->s, i->get_string().c_str());
149 __hub->
send(clid, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_STRING_VALUE, m, sl);
150 }
catch (Exception &e) {
152 "send_value: Value %s could not be sent",
164 while ( ! __inbound_queue.empty() ) {
169 if (msg->
msgid() == MSG_CONFIG_SUBSCRIBE) {
172 __subscribers.sort();
173 __subscribers.unique();
178 while ( i->
next() ) {
183 while ( i->
next() ) {
187 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_LIST, content);
190 }
else if (msg->
msgid() == MSG_CONFIG_ERASE_VALUE) {
193 char path[CONFIG_MSG_PATH_LENGTH + 1];
194 path[CONFIG_MSG_PATH_LENGTH] = 0;
195 strncpy(path, m->
cp.
path, CONFIG_MSG_PATH_LENGTH);
200 __config->
erase(path);
204 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_VALUE_ERASED,
208 send_inv_value(msg->
clid(),
"?");
209 e.
append(
"Failed to erase value");
214 }
else if ( (msg->
msgid() >= MSG_CONFIG_GET_BEGIN) &&
215 (msg->
msgid() <= MSG_CONFIG_GET_END) ) {
219 "CONFIG_GET_FLOAT: invalid payload size "
220 "(received %zu instead of %zu bytes",
224 char path[CONFIG_MSG_PATH_LENGTH + 1];
225 path[CONFIG_MSG_PATH_LENGTH] = 0;
226 strncpy(path, m->
cp.
path, CONFIG_MSG_PATH_LENGTH);
228 switch (msg->
msgid()) {
229 case MSG_CONFIG_GET_FLOAT:
235 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_FLOAT_VALUE,
238 send_inv_value(msg->
clid(), path);
240 "get float: Value %s could not be found", path);
241 LibLogger::log_warn(
"ConfigNetworkHandler", e);
245 case MSG_CONFIG_GET_UINT:
247 unsigned int u = __config->
get_uint(path);
251 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_UINT_VALUE,
254 send_inv_value(msg->
clid(), path);
256 "get uint: Value %s could not be found", path);
257 LibLogger::log_warn(
"ConfigNetworkHandler", e);
261 case MSG_CONFIG_GET_INT:
263 int i = __config->
get_int(path);
267 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_INT_VALUE,
270 send_inv_value(msg->
clid(), path);
272 "get int: Value %s could not be found", path);
273 LibLogger::log_warn(
"ConfigNetworkHandler", e);
277 case MSG_CONFIG_GET_BOOL:
283 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_BOOL_VALUE,
286 send_inv_value(msg->
clid(), path);
288 "get bool: Value %s could not be found", path);
289 LibLogger::log_warn(
"ConfigNetworkHandler", e);
293 case MSG_CONFIG_GET_STRING:
298 strcpy(r->
s, s.c_str());
299 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_STRING_VALUE,
302 send_inv_value(msg->
clid(), path);
304 "get string: Value %s could not be found", path);
305 LibLogger::log_warn(
"ConfigNetworkHandler", e);
309 case MSG_CONFIG_GET_VALUE:
313 send_value(msg->
clid(), i);
315 send_inv_value(msg->
clid(), path);
320 "get value: Value %s could not be found", path);
327 }
else if ( (msg->
msgid() >= MSG_CONFIG_SET_BEGIN) &&
328 (msg->
msgid() <= MSG_CONFIG_SET_END) ) {
330 char path[CONFIG_MSG_PATH_LENGTH + 1];
333 "inbound set: payload is too small"
334 "(%zu is less than %zu bytes",
336 send_inv_value(msg->
clid(),
"?");
339 path[CONFIG_MSG_PATH_LENGTH] = 0;
340 strncpy(path, d->
path, CONFIG_MSG_PATH_LENGTH);
342 switch (msg->
msgid()) {
343 case MSG_CONFIG_SET_FLOAT:
344 case MSG_CONFIG_SET_DEFAULT_FLOAT:
347 if ( msg->
msgid() == MSG_CONFIG_SET_FLOAT ) {
355 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_FLOAT_VALUE,
358 send_inv_value(msg->
clid(), path);
360 "set float: Value %s could not be set", path);
361 LibLogger::log_warn(
"ConfigNetworkHandler", e);
365 case MSG_CONFIG_SET_UINT:
366 case MSG_CONFIG_SET_DEFAULT_UINT:
369 if ( msg->
msgid() == MSG_CONFIG_SET_UINT ) {
374 unsigned int u = __config->
get_uint(path);
377 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_UINT_VALUE,
380 send_inv_value(msg->
clid(), path);
382 "set uint: Value %s could not be set", path);
383 LibLogger::log_warn(
"ConfigNetworkHandler", e);
387 case MSG_CONFIG_SET_INT:
388 case MSG_CONFIG_SET_DEFAULT_INT:
391 if ( msg->
msgid() == MSG_CONFIG_SET_INT ) {
396 int i = __config->
get_int(path);
399 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_INT_VALUE,
402 send_inv_value(msg->
clid(), path);
404 "set int: Value %s could not be set", path);
405 LibLogger::log_warn(
"ConfigNetworkHandler", e);
409 case MSG_CONFIG_SET_BOOL:
410 case MSG_CONFIG_SET_DEFAULT_BOOL:
413 if ( msg->
msgid() == MSG_CONFIG_SET_BOOL ) {
421 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_BOOL_VALUE,
424 send_inv_value(msg->
clid(), path);
426 "set bool: Value %s could not be set", path);
427 LibLogger::log_warn(
"ConfigNetworkHandler", e);
431 case MSG_CONFIG_SET_STRING:
432 case MSG_CONFIG_SET_DEFAULT_STRING:
435 if ( msg->
msgid() == MSG_CONFIG_SET_STRING ) {
441 size_t s_length = s.length();
443 strcpy(r->
s, s.c_str());
444 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_STRING_VALUE,
447 send_inv_value(msg->
clid(), path);
449 "set string: Value %s could not be set", path);
450 LibLogger::log_warn(
"ConfigNetworkHandler", e);
454 case MSG_CONFIG_SET_COMMENT:
455 case MSG_CONFIG_SET_DEFAULT_COMMENT:
459 if ( msg->
msgid() == MSG_CONFIG_SET_COMMENT ) {
466 size_t s_length = s.length();
467 config_comment_msg_t *r = prepare_string_msg<config_comment_msg_t>(path, (msg->
msgid() == MSG_CONFIG_SET_DEFAULT_COMMENT), s_length);
468 strcpy(r->
s, s.c_str());
469 __hub->
send(msg->
clid(), FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_COMMENT_VALUE,
472 send_inv_value(msg->
clid(), path);
474 "set comment: Value %s could not be set", path);
475 LibLogger::log_warn(
"ConfigNetworkHandler", e);
520 __subscribers.
lock();
521 if (find(__subscribers.begin(), __subscribers.end(), clid) != __subscribers.end()) {
523 "Client %u disconnected without closing the config, removing from list of subscribers",
525 __subscribers.remove(clid);
544 const char *path = v->
path();
547 __subscribers.
lock();
548 for (__sit = __subscribers.begin(); __sit != __subscribers.end(); ++__sit) {
552 size_t s_length = value.length();
554 prepare_string_msg<config_string_value_msg_t>(path, is_default,
556 strcpy(r->
s, value.c_str());
557 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_STRING_VALUE,
562 prepare_msg<config_bool_value_msg_t>(path, is_default);
563 r->
b = (value ? 1 : 0);
564 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_BOOL_VALUE,
569 prepare_msg<config_int_value_msg_t>(path, is_default);
571 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_INT_VALUE,
576 prepare_msg<config_uint_value_msg_t>(path, is_default);
578 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_UINT_VALUE,
583 prepare_msg<config_float_value_msg_t>(path, is_default);
585 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_FLOAT_VALUE,
591 "config_value_changed: Value for %s could not be sent "
592 "to client %u", path, *__sit);
603 const char *path = v->
path();
606 __subscribers.
lock();
607 for (__sit = __subscribers.begin(); __sit != __subscribers.end(); ++__sit) {
609 size_t s_length = comment.length();
611 prepare_string_msg<config_comment_msg_t>(path, is_default, s_length);
612 strcpy(r->
s, comment.c_str());
614 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_COMMENT_VALUE,
618 "config_comment_changed[string]: Value for %s could "
619 "not be sent to client %u", path, *__sit);
630 __subscribers.
lock();
631 for (__sit = __subscribers.begin(); __sit != __subscribers.end(); ++__sit) {
634 prepare_msg<config_value_erased_msg_t>(path,
false);
635 __hub->
send(*__sit, FAWKES_CID_CONFIGMANAGER, MSG_CONFIG_VALUE_ERASED,
639 "configValueErased: Value for %s could not be sent "
640 "to client %u", path, *__sit);