Skip to content

Commit

Permalink
Merge #859
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Mar 4, 2021
2 parents 1b2c058 + ee332a0 commit d7370db
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 0 deletions.
9 changes: 9 additions & 0 deletions include/wicked/dbus.h
Expand Up @@ -52,6 +52,7 @@ struct ni_dbus_variant {
dbus_uint64_t uint64_value;
double double_value;
unsigned char * byte_array_value;
uint32_t * uint32_array_value;
char ** string_array_value;
ni_dbus_dict_entry_t *dict_array_value;
ni_dbus_variant_t *variant_array_value;
Expand Down Expand Up @@ -270,6 +271,8 @@ extern void ni_dbus_variant_init_byte_array(ni_dbus_variant_t *);
extern void ni_dbus_variant_set_byte_array(ni_dbus_variant_t *,
const unsigned char *, unsigned int len);
extern dbus_bool_t ni_dbus_variant_append_byte_array(ni_dbus_variant_t *, unsigned char);
extern void ni_dbus_variant_init_uint32_array(ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_append_uint32_array(ni_dbus_variant_t *, uint32_t);
extern void ni_dbus_variant_init_string_array(ni_dbus_variant_t *);
extern void ni_dbus_variant_set_string_array(ni_dbus_variant_t *,
const char **, unsigned int len);
Expand All @@ -282,8 +285,10 @@ extern const char * ni_dbus_variant_array_print_element(const ni_dbus_variant_t

extern dbus_bool_t ni_dbus_variant_is_array_of(const ni_dbus_variant_t *, const char *signature);
extern dbus_bool_t ni_dbus_variant_is_byte_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_uint32_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_string_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_variant_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_object_path_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_dict_array(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_dict(const ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_is_struct(const ni_dbus_variant_t *);
Expand Down Expand Up @@ -498,6 +503,10 @@ ni_dbus_variant_datum_const_ptr(const ni_dbus_variant_t *variant)
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING
#define NI_DBUS_STRING_ARRAY_SIGNATURE \
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING
#define NI_DBUS_OBJECT_PATH_ARRAY_SIGNATURE \
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING
#define NI_DBUS_UINT32_ARRAY_SIGNATURE \
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING


#define NI_DBUS_SIGNATURE(type) NI_DBUS_##type##_SIGNATURE
Expand Down
33 changes: 33 additions & 0 deletions src/dbus-common.c
Expand Up @@ -166,6 +166,12 @@ ni_dbus_variant_is_string_array(const ni_dbus_variant_t *var)
return __ni_dbus_is_array(var, DBUS_TYPE_STRING_AS_STRING);
}

dbus_bool_t
ni_dbus_variant_is_object_path_array(const ni_dbus_variant_t *var)
{
return __ni_dbus_is_array(var, DBUS_TYPE_OBJECT_PATH_AS_STRING);
}

/*
* Get/set functions for variant values
*/
Expand Down Expand Up @@ -570,6 +576,12 @@ ni_dbus_variant_is_byte_array(const ni_dbus_variant_t *var)
return __ni_dbus_is_array(var, DBUS_TYPE_BYTE_AS_STRING);
}

dbus_bool_t
ni_dbus_variant_is_uint32_array(const ni_dbus_variant_t *var)
{
return __ni_dbus_is_array(var, DBUS_TYPE_UINT32_AS_STRING);
}

/*
* Helper function for handling arrays
*/
Expand Down Expand Up @@ -628,6 +640,24 @@ ni_dbus_variant_append_byte_array(ni_dbus_variant_t *var, unsigned char byte)
return TRUE;
}

void
ni_dbus_variant_init_uint32_array(ni_dbus_variant_t *var)
{
ni_dbus_variant_destroy(var);
__ni_dbus_init_array(var, DBUS_TYPE_UINT32);
}

dbus_bool_t
ni_dbus_variant_append_uint32_array(ni_dbus_variant_t *var, uint32_t u)
{
if (!__ni_dbus_is_array(var, DBUS_TYPE_UINT32_AS_STRING))
return FALSE;

__ni_dbus_array_grow(var, sizeof(uint32_t), 1);
var->uint32_array_value[var->array.len++] = u;
return TRUE;
}

/*
* A UUID is encoded as a fixed length array of bytes
*/
Expand Down Expand Up @@ -757,6 +787,7 @@ ni_dbus_variant_destroy(ni_dbus_variant_t *var)
unsigned int i;

switch (var->array.element_type) {
case DBUS_TYPE_UINT32:
case DBUS_TYPE_BYTE:
free(var->byte_array_value);
break;
Expand Down Expand Up @@ -1142,6 +1173,8 @@ ni_dbus_variant_signature(const ni_dbus_variant_t *var)
switch (var->array.element_type) {
case DBUS_TYPE_BYTE:
return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING;
case DBUS_TYPE_UINT32:
return NI_DBUS_UINT32_ARRAY_SIGNATURE;
case DBUS_TYPE_STRING:
return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
case DBUS_TYPE_VARIANT:
Expand Down
2 changes: 2 additions & 0 deletions src/dbus-common.h
Expand Up @@ -33,6 +33,8 @@ extern dbus_bool_t ni_dbus_message_iter_get_variant(DBusMessageIter *iter,
ni_dbus_variant_t *variant);
extern dbus_bool_t ni_dbus_message_iter_append_byte_array(DBusMessageIter *iter,
const unsigned char *value, unsigned int len);
extern dbus_bool_t ni_dbus_message_iter_append_uint32_array(DBusMessageIter *iter,
const uint32_t *value, unsigned int len);

extern const ni_dbus_property_t *__ni_dbus_service_get_property(const ni_dbus_property_t *, const char *);

Expand Down
43 changes: 43 additions & 0 deletions src/dbus-message.c
Expand Up @@ -43,6 +43,26 @@ ni_dbus_message_iter_append_byte_array(DBusMessageIter *iter,
return TRUE;
}

dbus_bool_t
ni_dbus_message_iter_append_uint32_array(DBusMessageIter *iter, const uint32_t *value, unsigned int len)
{
DBusMessageIter iter_array;
unsigned int i;

if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32_AS_STRING, &iter_array))
return FALSE;

for (i = 0; i < len; i++) {
if (!dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_UINT32, &(value[i])))
return FALSE;
}

if (!dbus_message_iter_close_container(iter, &iter_array))
return FALSE;

return TRUE;
}

static dbus_bool_t
__ni_dbus_message_iter_append_string_array(DBusMessageIter *iter, const char *element_signature,
char **string_array, unsigned int len)
Expand Down Expand Up @@ -246,6 +266,11 @@ ni_dbus_message_iter_append_value(DBusMessageIter *iter, const ni_dbus_variant_t
variant->byte_array_value, variant->array.len);
break;

case DBUS_TYPE_UINT32:
rv = ni_dbus_message_iter_append_uint32_array(iter_val,
variant->uint32_array_value, variant->array.len);
break;

case DBUS_TYPE_STRING:
rv = ni_dbus_message_iter_append_string_array(iter_val,
variant->string_array_value, variant->array.len);
Expand Down Expand Up @@ -314,6 +339,21 @@ ni_dbus_message_iter_get_byte_array(DBusMessageIter *iter, ni_dbus_variant_t *va
return TRUE;
}

dbus_bool_t
ni_dbus_message_iter_get_uint32_array(DBusMessageIter *iter, ni_dbus_variant_t *variant)
{
uint32_t u;

ni_dbus_variant_init_uint32_array(variant);
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_UINT32) {
dbus_message_iter_get_basic(iter, &u);
ni_dbus_variant_append_uint32_array(variant, u);
dbus_message_iter_next(iter);
}

return TRUE;
}

dbus_bool_t
ni_dbus_message_iter_get_string_array(DBusMessageIter *iter, ni_dbus_variant_t *variant)
{
Expand Down Expand Up @@ -441,6 +481,9 @@ ni_dbus_message_iter_get_array(DBusMessageIter *iter, ni_dbus_variant_t *variant
case DBUS_TYPE_VARIANT:
success = ni_dbus_message_iter_get_variant_array(&iter_array, variant);
break;
case DBUS_TYPE_UINT32:
success = ni_dbus_message_iter_get_uint32_array(&iter_array, variant);
break;
default:
ni_debug_dbus("%s: cannot decode array of type %c", __FUNCTION__, array_type);
break;
Expand Down

0 comments on commit d7370db

Please sign in to comment.