Skip to content

Commit

Permalink
dbus: add initial variant container type handling
Browse files Browse the repository at this point in the history
  • Loading branch information
cfconrad committed Nov 26, 2020
1 parent 56a8232 commit 852f195
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
5 changes: 5 additions & 0 deletions include/wicked/dbus.h
Expand Up @@ -56,6 +56,7 @@ struct ni_dbus_variant {
ni_dbus_dict_entry_t *dict_array_value;
ni_dbus_variant_t *variant_array_value;
ni_dbus_variant_t *struct_value;
ni_dbus_variant_t *variant_value;
};

ni_dbus_message_t * __message;
Expand Down Expand Up @@ -285,6 +286,7 @@ extern dbus_bool_t ni_dbus_variant_is_variant_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 *);
extern dbus_bool_t ni_dbus_variant_is_variant(const ni_dbus_variant_t *);

extern dbus_bool_t ni_dbus_variant_array_parse_and_append_string(ni_dbus_variant_t *, const char *);

Expand Down Expand Up @@ -334,6 +336,9 @@ extern ni_bool_t ni_dbus_struct_add_string(ni_dbus_variant_t *, const char *);
extern ni_dbus_variant_t * ni_dbus_struct_get(const ni_dbus_variant_t *, unsigned int);
extern dbus_bool_t ni_dbus_struct_get_string(const ni_dbus_variant_t *, unsigned int, const char **);

extern ni_dbus_variant_t * ni_dbus_variant_init_variant(ni_dbus_variant_t *);
extern dbus_bool_t ni_dbus_variant_get_variant(const ni_dbus_variant_t *, const ni_dbus_variant_t **);

/*
* Client side functions
*/
Expand Down
47 changes: 45 additions & 2 deletions src/dbus-common.c
Expand Up @@ -178,7 +178,8 @@ __ni_dbus_variant_change_type(ni_dbus_variant_t *var, int new_type)
if (var->type == DBUS_TYPE_STRING
|| var->type == DBUS_TYPE_OBJECT_PATH
|| var->type == DBUS_TYPE_ARRAY
|| var->type == DBUS_TYPE_STRUCT)
|| var->type == DBUS_TYPE_STRUCT
|| var->type == DBUS_TYPE_VARIANT)
ni_dbus_variant_destroy(var);
}
var->type = new_type;
Expand Down Expand Up @@ -746,6 +747,12 @@ ni_dbus_variant_destroy(ni_dbus_variant_t *var)
if (var->type == DBUS_TYPE_STRING
|| var->type == DBUS_TYPE_OBJECT_PATH)
ni_string_free(&var->string_value);
else if (var->type == DBUS_TYPE_VARIANT) {
if (var->variant_value) {
ni_dbus_variant_destroy(var->variant_value);
free(var->variant_value);
}
}
else if (var->type == DBUS_TYPE_ARRAY) {
unsigned int i;

Expand Down Expand Up @@ -1138,7 +1145,7 @@ ni_dbus_variant_signature(const ni_dbus_variant_t *var)
for (i = 0; i < var->array.len; ++i) {
ni_dbus_variant_t *member = &var->struct_value[i];
const char *msig;

if ((msig = ni_dbus_variant_signature(member)) == NULL) {
ni_stringbuf_destroy(&buf);
return NULL;
Expand Down Expand Up @@ -1575,6 +1582,12 @@ ni_dbus_variant_init_struct(ni_dbus_variant_t *var)
var->array.len = 0;
}

dbus_bool_t
ni_dbus_variant_is_struct(const ni_dbus_variant_t *var)
{
return var->type == DBUS_TYPE_STRUCT;
}

ni_dbus_variant_t *
ni_dbus_struct_add(ni_dbus_variant_t *var)
{
Expand Down Expand Up @@ -1648,6 +1661,35 @@ ni_dbus_array_array_add(ni_dbus_variant_t *var)
return dst;
}

/*
* DBus Variant 'v' container
*/
ni_dbus_variant_t *
ni_dbus_variant_init_variant(ni_dbus_variant_t *var)
{
ni_dbus_variant_destroy(var);
var->type = DBUS_TYPE_VARIANT;
var->variant_value = calloc(1, sizeof(ni_dbus_variant_t));
if (var->variant_value)
ni_dbus_variant_destroy(var->variant_value);
return var->variant_value;
}

dbus_bool_t
ni_dbus_variant_is_variant(const ni_dbus_variant_t *var)
{
return var->type == DBUS_TYPE_VARIANT;
}

dbus_bool_t
ni_dbus_variant_get_variant(const ni_dbus_variant_t *var, const ni_dbus_variant_t **ret)
{
if (!ni_dbus_variant_is_variant(var))
return FALSE;
*ret = var->variant_value;
return TRUE;
}

/*
* Translate basic dbus types to signature strings
*/
Expand All @@ -1663,6 +1705,7 @@ static const char * __ni_dbus_basic_type_as_string[256] = {
[DBUS_TYPE_DOUBLE] = DBUS_TYPE_DOUBLE_AS_STRING,
[DBUS_TYPE_STRING] = DBUS_TYPE_STRING_AS_STRING,
[DBUS_TYPE_OBJECT_PATH] = DBUS_TYPE_OBJECT_PATH_AS_STRING,
[DBUS_TYPE_VARIANT] = DBUS_TYPE_VARIANT_AS_STRING,
};

const char *
Expand Down
6 changes: 5 additions & 1 deletion src/dbus-message.c
Expand Up @@ -279,6 +279,9 @@ ni_dbus_message_iter_append_value(DBusMessageIter *iter, const ni_dbus_variant_t
} else
if (variant->type == DBUS_TYPE_STRUCT) {
rv = ni_dbus_message_iter_append_struct(iter_val, variant->struct_value, variant->array.len);
} else
if (variant->type == DBUS_TYPE_VARIANT) {
rv = ni_dbus_message_iter_append_variant(iter_val, variant->variant_value);
} else {
ni_warn("%s: variant type %s not supported", __FUNCTION__, signature);
}
Expand Down Expand Up @@ -539,7 +542,8 @@ ni_dbus_message_serialize_variants(ni_dbus_message_t *msg,
ni_dbus_variant_sprint(&argv[i]));
#endif
if (!ni_dbus_message_iter_append_value(&iter, &argv[i], NULL)) {
ni_error("error marshalling message, type=%s, value=\"%s\"",
ni_error("error marshalling message arg[%u]: type=%s, value=\"%s\"",
i,
ni_dbus_variant_signature(&argv[i]),
ni_dbus_variant_sprint(&argv[i]));
dbus_set_error(error,
Expand Down

0 comments on commit 852f195

Please sign in to comment.