25 #include <core/exceptions/software.h>
26 #include <core/exceptions/system.h>
27 #include <interface/field_iterator.h>
28 #include <interface/interface.h>
62 interface_ = interface;
72 interface_ = fit.interface_;
74 if (fit.value_string_) {
75 value_string_ = strdup(fit.value_string_);
95 infol_ = infol_->
next;
123 for (
unsigned int j = 0; j < i; ++j) {
136 for (
unsigned int j = 0; j < i; ++j) {
149 return (infol_ == fi.infol_);
159 return !(*
this == fi);
168 if (infol_ == NULL) {
171 return infol_->
value;
182 interface_ = fi.interface_;
194 if (infol_ == NULL) {
207 if (infol_ == NULL) {
210 switch (infol_->
type) {
225 default:
return "unknown";
236 if (infol_ == NULL) {
246 std::list<const char *>
249 std::list<const char *> enums;
250 interface_enum_map_t::const_iterator enum_it;
251 for (enum_it = infol_->
enum_map->begin(); enum_it != infol_->
enum_map->end(); ++enum_it) {
252 enums.push_back(enum_it->second.c_str());
263 if (infol_ == NULL) {
276 if (infol_ == NULL) {
279 return infol_->
value;
289 if (infol_ == NULL) {
304 if (infol_ == NULL) {
307 if (value_string_ == NULL) {
312 (
unsigned int)0xFFFFFFFF);
314 char *tmp1 = strdup(
"");
318 for (
size_t i = 0; i < infol_->
length; ++i) {
320 switch (infol_->
type) {
322 rv = asprintf(&tmp2,
"%s%s", tmp1, (((
bool *)infol_->
value)[i]) ?
"true" :
"false");
324 case IFT_INT8: rv = asprintf(&tmp2,
"%s%i", tmp1, ((int8_t *)infol_->
value)[i]);
break;
325 case IFT_INT16: rv = asprintf(&tmp2,
"%s%i", tmp1, ((int16_t *)infol_->
value)[i]);
break;
326 case IFT_INT32: rv = asprintf(&tmp2,
"%s%i", tmp1, ((int32_t *)infol_->
value)[i]);
break;
328 #if (defined(__WORDSIZE) && __WORDSIZE == 64) || (defined(LONG_BIT) && LONG_BIT == 64) \
329 || defined(__x86_64__)
330 rv = asprintf(&tmp2,
"%s%li", tmp1, ((int64_t *)infol_->
value)[i]);
332 rv = asprintf(&tmp2,
"%s%lli", tmp1, ((int64_t *)infol_->
value)[i]);
335 case IFT_UINT8: rv = asprintf(&tmp2,
"%s%u", tmp1, ((uint8_t *)infol_->
value)[i]);
break;
337 rv = asprintf(&tmp2,
"%s%u", tmp1, ((uint16_t *)infol_->
value)[i]);
340 rv = asprintf(&tmp2,
"%s%u", tmp1, ((uint32_t *)infol_->
value)[i]);
343 #if (defined(__WORDSIZE) && __WORDSIZE == 64) || (defined(LONG_BIT) && LONG_BIT == 64) \
344 || defined(__x86_64__)
345 rv = asprintf(&tmp2,
"%s%lu", tmp1, ((uint64_t *)infol_->
value)[i]);
347 rv = asprintf(&tmp2,
"%s%llu", tmp1, ((uint64_t *)infol_->
value)[i]);
350 case IFT_FLOAT: rv = asprintf(&tmp2,
"%s%f", tmp1, ((
float *)infol_->
value)[i]);
break;
351 case IFT_DOUBLE: rv = asprintf(&tmp2,
"%s%f", tmp1, ((
double *)infol_->
value)[i]);
break;
352 case IFT_BYTE: rv = asprintf(&tmp2,
"%s%u", tmp1, ((uint8_t *)infol_->
value)[i]);
break;
366 "InterfaceFieldIterator::get_value_string(): asprintf() failed (1)");
371 if ((infol_->
length > 1) && (i < infol_->length - 1)) {
372 if (asprintf(&tmp2,
"%s%s", tmp1, array_sep) == -1) {
374 "InterfaceFieldIterator::get_value_string(): asprintf() failed (2)");
381 value_string_ = tmp1;
385 if (asprintf(&value_string_,
"%s", (
const char *)infol_->
value) == -1) {
387 "InterfaceFieldIterator::get_value_string(): asprintf() failed (3)");
390 if (asprintf(&value_string_,
"%c", *((
const char *)infol_->
value)) == -1) {
392 "InterfaceFieldIterator::get_value_string(): asprintf() failed (4)");
397 return value_string_;
411 if (infol_ == NULL) {
415 }
else if (index >= infol_->
length) {
418 return ((
bool *)infol_->
value)[index];
432 if (infol_ == NULL) {
436 }
else if (index >= infol_->
length) {
439 return ((int8_t *)infol_->
value)[index];
453 if (infol_ == NULL) {
457 }
else if (index >= infol_->
length) {
460 return ((uint8_t *)infol_->
value)[index];
474 if (infol_ == NULL) {
478 }
else if (index >= infol_->
length) {
481 return ((int16_t *)infol_->
value)[index];
495 if (infol_ == NULL) {
499 }
else if (index >= infol_->
length) {
502 return ((uint16_t *)infol_->
value)[index];
516 if (infol_ == NULL) {
520 }
else if (index >= infol_->
length) {
523 return ((int32_t *)infol_->
value)[index];
537 if (infol_ == NULL) {
541 }
else if (index >= infol_->
length) {
544 return ((uint32_t *)infol_->
value)[index];
558 if (infol_ == NULL) {
562 }
else if (index >= infol_->
length) {
565 return ((int64_t *)infol_->
value)[index];
579 if (infol_ == NULL) {
583 }
else if (index >= infol_->
length) {
586 return ((uint64_t *)infol_->
value)[index];
600 if (infol_ == NULL) {
604 }
else if (index >= infol_->
length) {
607 return ((
float *)infol_->
value)[index];
621 if (infol_ == NULL) {
625 }
else if (index >= infol_->
length) {
628 return ((
double *)infol_->
value)[index];
642 if (infol_ == NULL) {
646 }
else if (index >= infol_->
length) {
649 return ((uint8_t *)infol_->
value)[index];
663 if (infol_ == NULL) {
667 }
else if (index >= infol_->
length) {
670 return ((int32_t *)infol_->
value)[index];
686 if (infol_ == NULL) {
690 }
else if (index >= infol_->
length) {
693 int32_t int_val = ((int32_t *)infol_->
value)[index];
694 interface_enum_map_t::const_iterator ev = infol_->
enum_map->find(int_val);
695 if (ev == infol_->
enum_map->end()) {
698 return ev->second.c_str();
711 if (infol_ == NULL) {
715 }
else if (infol_->
length == 1) {
718 return (
bool *)infol_->
value;
731 if (infol_ == NULL) {
736 return (int8_t *)infol_->
value;
749 if (infol_ == NULL) {
754 return (uint8_t *)infol_->
value;
767 if (infol_ == NULL) {
772 return (int16_t *)infol_->
value;
785 if (infol_ == NULL) {
790 return (uint16_t *)infol_->
value;
803 if (infol_ == NULL) {
808 return (int32_t *)infol_->
value;
821 if (infol_ == NULL) {
826 return (uint32_t *)infol_->
value;
839 if (infol_ == NULL) {
844 return (int64_t *)infol_->
value;
857 if (infol_ == NULL) {
862 return (uint64_t *)infol_->
value;
875 if (infol_ == NULL) {
880 return (
float *)infol_->
value;
893 if (infol_ == NULL) {
898 return (
double *)infol_->
value;
911 if (infol_ == NULL) {
916 return (uint8_t *)infol_->
value;
929 if (infol_ == NULL) {
934 return (int32_t *)infol_->
value;
946 if (infol_ == NULL) {
951 return (
const char *)infol_->
value;
965 if (infol_ == NULL) {
969 }
else if (index >= infol_->
length) {
972 char *dst = (
char *)infol_->
value + index *
sizeof(
bool);
973 memcpy((
void *)dst, &v,
sizeof(
bool));
989 if (infol_ == NULL) {
993 }
else if (index >= infol_->
length) {
996 char *dst = (
char *)infol_->
value + index *
sizeof(int8_t);
997 memcpy((
void *)dst, &v,
sizeof(int8_t));
1013 if (infol_ == NULL) {
1017 }
else if (index >= infol_->
length) {
1020 char *dst = (
char *)infol_->
value + index *
sizeof(uint8_t);
1021 memcpy((
void *)dst, &v,
sizeof(uint8_t));
1037 if (infol_ == NULL) {
1041 }
else if (index >= infol_->
length) {
1044 char *dst = (
char *)infol_->
value + index *
sizeof(int16_t);
1045 memcpy((
void *)dst, &v,
sizeof(int16_t));
1061 if (infol_ == NULL) {
1065 }
else if (index >= infol_->
length) {
1068 char *dst = (
char *)infol_->
value + index *
sizeof(uint16_t);
1069 memcpy((
void *)dst, &v,
sizeof(uint16_t));
1085 if (infol_ == NULL) {
1089 }
else if (index >= infol_->
length) {
1092 char *dst = (
char *)infol_->
value + index *
sizeof(int32_t);
1093 memcpy((
void *)dst, &v,
sizeof(int32_t));
1109 if (infol_ == NULL) {
1113 }
else if (index >= infol_->
length) {
1116 char *dst = (
char *)infol_->
value + index *
sizeof(uint32_t);
1117 memcpy((
void *)dst, &v,
sizeof(uint32_t));
1133 if (infol_ == NULL) {
1137 }
else if (index >= infol_->
length) {
1140 char *dst = (
char *)infol_->
value + index *
sizeof(int64_t);
1141 memcpy((
void *)dst, &v,
sizeof(int64_t));
1157 if (infol_ == NULL) {
1161 }
else if (index >= infol_->
length) {
1164 char *dst = (
char *)infol_->
value + index *
sizeof(uint64_t);
1165 memcpy((
void *)dst, &v,
sizeof(uint64_t));
1181 if (infol_ == NULL) {
1185 }
else if (index >= infol_->
length) {
1188 char *dst = (
char *)infol_->
value + index *
sizeof(
float);
1189 memcpy((
void *)dst, &v,
sizeof(
float));
1205 if (infol_ == NULL) {
1209 }
else if (index >= infol_->
length) {
1212 char *dst = (
char *)infol_->
value + index *
sizeof(
double);
1213 memcpy((
void *)dst, &v,
sizeof(
double));
1229 if (infol_ == NULL) {
1233 }
else if (index >= infol_->
length) {
1236 char *dst = (
char *)infol_->
value + index *
sizeof(uint8_t);
1237 memcpy((
void *)dst, &v,
sizeof(uint8_t));
1253 if (infol_ == NULL) {
1257 }
else if (index >= infol_->
length) {
1260 interface_enum_map_t::const_iterator ev = infol_->
enum_map->find(e);
1261 if (ev == infol_->
enum_map->end()) {
1264 char *dst = (
char *)infol_->
value + index *
sizeof(int32_t);
1265 memcpy((
void *)dst, &e,
sizeof(int32_t));
1281 if (infol_ == NULL) {
1285 }
else if (index >= infol_->
length) {
1288 interface_enum_map_t::const_iterator ev;
1289 for (ev = infol_->
enum_map->begin(); ev != infol_->
enum_map->end(); ++ev) {
1290 if (ev->second == e) {
1291 char *dst = (
char *)infol_->
value + index *
sizeof(int32_t);
1292 memcpy((
void *)dst, &ev->first,
sizeof(int32_t));
1312 if (infol_ == NULL) {
1316 }
else if (infol_->
length == 1) {
1319 memcpy(infol_->
value, v, infol_->
length *
sizeof(
bool));
1334 if (infol_ == NULL) {
1338 }
else if (infol_->
length == 1) {
1341 memcpy(infol_->
value, v, infol_->
length *
sizeof(int8_t));
1356 if (infol_ == NULL) {
1360 }
else if (infol_->
length == 1) {
1363 memcpy(infol_->
value, v, infol_->
length *
sizeof(uint8_t));
1378 if (infol_ == NULL) {
1382 }
else if (infol_->
length == 1) {
1385 memcpy(infol_->
value, v, infol_->
length *
sizeof(int16_t));
1400 if (infol_ == NULL) {
1404 }
else if (infol_->
length == 1) {
1407 memcpy(infol_->
value, v, infol_->
length *
sizeof(uint16_t));
1422 if (infol_ == NULL) {
1426 }
else if (infol_->
length == 1) {
1429 memcpy(infol_->
value, v, infol_->
length *
sizeof(int32_t));
1444 if (infol_ == NULL) {
1448 }
else if (infol_->
length == 1) {
1451 memcpy(infol_->
value, v, infol_->
length *
sizeof(uint32_t));
1466 if (infol_ == NULL) {
1470 }
else if (infol_->
length == 1) {
1473 memcpy(infol_->
value, v, infol_->
length *
sizeof(int64_t));
1488 if (infol_ == NULL) {
1492 }
else if (infol_->
length == 1) {
1495 memcpy(infol_->
value, v, infol_->
length *
sizeof(uint64_t));
1510 if (infol_ == NULL) {
1514 }
else if (infol_->
length == 1) {
1517 memcpy(infol_->
value, v, infol_->
length *
sizeof(
float));
1532 if (infol_ == NULL) {
1536 }
else if (infol_->
length == 1) {
1539 memcpy(infol_->
value, v, infol_->
length *
sizeof(
double));
1554 if (infol_ == NULL) {
1558 }
else if (infol_->
length == 1) {
1561 memcpy(infol_->
value, v, infol_->
length *
sizeof(uint8_t));
1575 if (infol_ == NULL) {
1580 strncpy((
char *)infol_->
value, v, infol_->
length);
Expected parameter is missing.
Interface field iterator.
const char * get_enum_string(unsigned int index=0) const
Get value of current enum field as string.
float get_float(unsigned int index=0) const
Get value of current field as float.
void set_uint32s(uint32_t *i)
Set value of current field as unsigned integer array.
int16_t get_int16(unsigned int index=0) const
Get value of current field as integer.
void set_int8s(int8_t *i)
Set value of current field as integer array.
void set_int64(int64_t i, unsigned int index=0)
Set value of current field as integer.
int8_t get_int8(unsigned int index=0) const
Get value of current field as integer.
int8_t * get_int8s() const
Get value of current field as integer array.
const void * get_value() const
Get value of current field.
float * get_floats() const
Get value of current field as float array.
int32_t get_int32(unsigned int index=0) const
Get value of current field as integer.
void set_uint64s(uint64_t *i)
Set value of current field as unsigned integer array.
uint8_t * get_bytes() const
Get value of current field as byte array.
void set_doubles(double *f)
Set value of current field as double array.
void set_bools(bool *b)
Set value of current field as bool array.
InterfaceFieldIterator & operator=(const InterfaceFieldIterator &fit)
Make this instance point to the same segment as fi.
bool is_enum() const
Check if field is an enum.
void set_string(const char *s)
Set value of current field as string.
size_t get_length() const
Get length of current field.
int32_t * get_int32s() const
Get value of current field as integer array.
int64_t get_int64(unsigned int index=0) const
Get value of current field as integer.
void set_double(double f, unsigned int index=0)
Set value of current field as double.
void set_floats(float *f)
Set value of current field as float array.
std::list< const char * > get_enum_valuenames() const
Return the list of possible enum value names.
InterfaceFieldIterator & operator++()
Prefix increment.
uint64_t get_uint64(unsigned int index=0) const
Get value of current field as unsigned integer.
void set_int16(int16_t i, unsigned int index=0)
Set value of current field as integer.
int32_t get_enum(unsigned int index=0) const
Get value of current enum field as integer.
uint16_t get_uint16(unsigned int index=0) const
Get value of current field as unsigned integer.
double get_double(unsigned int index=0) const
Get value of current field as double.
int32_t * get_enums() const
Get value of current enum field as integer array.
void set_byte(uint8_t b, unsigned int index=0)
Set value of current field as byte.
int64_t * get_int64s() const
Get value of current field as integer array.
uint64_t * get_uint64s() const
Get value of current field as unsigned integer array.
InterfaceFieldIterator()
Constructor.
const void * operator*() const
Get FieldHeader.
uint32_t get_uint32(unsigned int index=0) const
Get value of current field as unsigned integer.
void set_uint64(uint64_t i, unsigned int index=0)
Set value of current field as unsigned integer.
interface_fieldtype_t get_type() const
Get type of current field.
bool operator==(const InterfaceFieldIterator &fit) const
Check iterators for equality.
const char * get_name() const
Get name of current field.
uint8_t * get_uint8s() const
Get value of current field as unsigned integer array.
void set_int64s(int64_t *i)
Set value of current field as integer array.
void set_float(float f, unsigned int index=0)
Set value of current field as float.
~InterfaceFieldIterator()
Destructor.
void set_enum_string(const char *e, unsigned int index=0)
Set value of current field as enum (from an integer).
void set_int16s(int16_t *i)
Set value of current field as integer array.
bool operator!=(const InterfaceFieldIterator &fit) const
Check iterators for inequality.
void set_uint16(uint16_t i, unsigned int index=0)
Set value of current field as unsigned integer.
uint16_t * get_uint16s() const
Get value of current field as unsigned integer array.
void set_int32(int32_t i, unsigned int index=0)
Set value of current field as integer.
void set_uint8s(uint8_t *i)
Set value of current field as unsigned integer array.
const char * get_string() const
Get value of current field as string.
uint8_t get_byte(unsigned int index=0) const
Get value of current field as byte.
bool * get_bools() const
Get value of current field as bool array.
uint8_t get_uint8(unsigned int index=0) const
Get value of current field as unsigned integer.
bool get_bool(unsigned int index=0) const
Get value of current field as bool.
const char * get_value_string(const char *array_sep=", ")
Get value of current field as string.
void set_enum(int32_t e, unsigned int index=0)
Set value of current field as enum (from an integer).
void set_uint16s(uint16_t *i)
Set value of current field as unsigned integer array.
uint32_t * get_uint32s() const
Get value of current field as unsigned integer array.
double * get_doubles() const
Get value of current field as double array.
void set_bool(bool b, unsigned int index=0)
Set value of current field as bool.
void set_int8(int8_t i, unsigned int index=0)
Set value of current field as integer.
void set_uint8(uint8_t i, unsigned int index=0)
Set value of current field as unsigned integer.
void set_uint32(uint32_t i, unsigned int index=0)
Set value of current field as unsigned integer.
void set_int32s(int32_t *i)
Set value of current field as integer array.
InterfaceFieldIterator & operator+=(unsigned int i)
Advance by i steps.
int16_t * get_int16s() const
Get value of current field as integer array.
void set_bytes(uint8_t *b)
Set value of current field as byte array.
InterfaceFieldIterator & operator+(unsigned int i)
Advance by i steps.
const char * get_typename() const
Get type of current field as string.
Base class for all Fawkes BlackBoard interfaces.
void mark_data_changed()
Mark data as changed.
virtual const char * enum_tostring(const char *enumtype, int val) const =0
Convert arbitrary enum value to string.
A NULL pointer was supplied where not allowed.
System ran out of memory and desired operation could not be fulfilled.
Fawkes library namespace.
interface_fieldtype_t
Interface field type.
@ IFT_INT8
8 bit integer field
@ IFT_UINT32
32 bit unsigned integer field
@ IFT_BYTE
byte field, alias for uint8
@ IFT_UINT64
64 bit unsigned integer field
@ IFT_UINT16
16 bit unsigned integer field
@ IFT_INT32
32 bit integer field
@ IFT_INT64
64 bit integer field
@ IFT_INT16
16 bit integer field
@ IFT_ENUM
field with interface specific enum type
@ IFT_UINT8
8 bit unsigned integer field
Interface field info list.
const char * enumtype
text representation of enum type
void * value
Current value of this field.
size_t length
Length of field (array, string)
const char * name
Name of this field.
interface_fieldtype_t type
type of this field
const interface_enum_map_t * enum_map
Map of possible enum values.
interface_fieldinfo_t * next
next field, NULL if last