Skip to content

Commit ee332a0

Browse files
committed
dbus: Add ni_dbus_variant_t of type UINT32_ARRAY
This allow sending and receiving of DBus types like 'au' (DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING).
1 parent 0a59dfb commit ee332a0

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

include/wicked/dbus.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ struct ni_dbus_variant {
5252
dbus_uint64_t uint64_value;
5353
double double_value;
5454
unsigned char * byte_array_value;
55+
uint32_t * uint32_array_value;
5556
char ** string_array_value;
5657
ni_dbus_dict_entry_t *dict_array_value;
5758
ni_dbus_variant_t *variant_array_value;
@@ -270,6 +271,8 @@ extern void ni_dbus_variant_init_byte_array(ni_dbus_variant_t *);
270271
extern void ni_dbus_variant_set_byte_array(ni_dbus_variant_t *,
271272
const unsigned char *, unsigned int len);
272273
extern dbus_bool_t ni_dbus_variant_append_byte_array(ni_dbus_variant_t *, unsigned char);
274+
extern void ni_dbus_variant_init_uint32_array(ni_dbus_variant_t *);
275+
extern dbus_bool_t ni_dbus_variant_append_uint32_array(ni_dbus_variant_t *, uint32_t);
273276
extern void ni_dbus_variant_init_string_array(ni_dbus_variant_t *);
274277
extern void ni_dbus_variant_set_string_array(ni_dbus_variant_t *,
275278
const char **, unsigned int len);
@@ -282,6 +285,7 @@ extern const char * ni_dbus_variant_array_print_element(const ni_dbus_variant_t
282285

283286
extern dbus_bool_t ni_dbus_variant_is_array_of(const ni_dbus_variant_t *, const char *signature);
284287
extern dbus_bool_t ni_dbus_variant_is_byte_array(const ni_dbus_variant_t *);
288+
extern dbus_bool_t ni_dbus_variant_is_uint32_array(const ni_dbus_variant_t *);
285289
extern dbus_bool_t ni_dbus_variant_is_string_array(const ni_dbus_variant_t *);
286290
extern dbus_bool_t ni_dbus_variant_is_variant_array(const ni_dbus_variant_t *);
287291
extern dbus_bool_t ni_dbus_variant_is_object_path_array(const ni_dbus_variant_t *);
@@ -501,6 +505,8 @@ ni_dbus_variant_datum_const_ptr(const ni_dbus_variant_t *variant)
501505
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING
502506
#define NI_DBUS_OBJECT_PATH_ARRAY_SIGNATURE \
503507
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING
508+
#define NI_DBUS_UINT32_ARRAY_SIGNATURE \
509+
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING
504510

505511

506512
#define NI_DBUS_SIGNATURE(type) NI_DBUS_##type##_SIGNATURE

src/dbus-common.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,12 @@ ni_dbus_variant_is_byte_array(const ni_dbus_variant_t *var)
576576
return __ni_dbus_is_array(var, DBUS_TYPE_BYTE_AS_STRING);
577577
}
578578

579+
dbus_bool_t
580+
ni_dbus_variant_is_uint32_array(const ni_dbus_variant_t *var)
581+
{
582+
return __ni_dbus_is_array(var, DBUS_TYPE_UINT32_AS_STRING);
583+
}
584+
579585
/*
580586
* Helper function for handling arrays
581587
*/
@@ -634,6 +640,24 @@ ni_dbus_variant_append_byte_array(ni_dbus_variant_t *var, unsigned char byte)
634640
return TRUE;
635641
}
636642

643+
void
644+
ni_dbus_variant_init_uint32_array(ni_dbus_variant_t *var)
645+
{
646+
ni_dbus_variant_destroy(var);
647+
__ni_dbus_init_array(var, DBUS_TYPE_UINT32);
648+
}
649+
650+
dbus_bool_t
651+
ni_dbus_variant_append_uint32_array(ni_dbus_variant_t *var, uint32_t u)
652+
{
653+
if (!__ni_dbus_is_array(var, DBUS_TYPE_UINT32_AS_STRING))
654+
return FALSE;
655+
656+
__ni_dbus_array_grow(var, sizeof(uint32_t), 1);
657+
var->uint32_array_value[var->array.len++] = u;
658+
return TRUE;
659+
}
660+
637661
/*
638662
* A UUID is encoded as a fixed length array of bytes
639663
*/
@@ -763,6 +787,7 @@ ni_dbus_variant_destroy(ni_dbus_variant_t *var)
763787
unsigned int i;
764788

765789
switch (var->array.element_type) {
790+
case DBUS_TYPE_UINT32:
766791
case DBUS_TYPE_BYTE:
767792
free(var->byte_array_value);
768793
break;
@@ -1148,6 +1173,8 @@ ni_dbus_variant_signature(const ni_dbus_variant_t *var)
11481173
switch (var->array.element_type) {
11491174
case DBUS_TYPE_BYTE:
11501175
return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING;
1176+
case DBUS_TYPE_UINT32:
1177+
return NI_DBUS_UINT32_ARRAY_SIGNATURE;
11511178
case DBUS_TYPE_STRING:
11521179
return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
11531180
case DBUS_TYPE_VARIANT:

src/dbus-common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ extern dbus_bool_t ni_dbus_message_iter_get_variant(DBusMessageIter *iter,
3333
ni_dbus_variant_t *variant);
3434
extern dbus_bool_t ni_dbus_message_iter_append_byte_array(DBusMessageIter *iter,
3535
const unsigned char *value, unsigned int len);
36+
extern dbus_bool_t ni_dbus_message_iter_append_uint32_array(DBusMessageIter *iter,
37+
const uint32_t *value, unsigned int len);
3638

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

src/dbus-message.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,26 @@ ni_dbus_message_iter_append_byte_array(DBusMessageIter *iter,
4343
return TRUE;
4444
}
4545

46+
dbus_bool_t
47+
ni_dbus_message_iter_append_uint32_array(DBusMessageIter *iter, const uint32_t *value, unsigned int len)
48+
{
49+
DBusMessageIter iter_array;
50+
unsigned int i;
51+
52+
if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32_AS_STRING, &iter_array))
53+
return FALSE;
54+
55+
for (i = 0; i < len; i++) {
56+
if (!dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_UINT32, &(value[i])))
57+
return FALSE;
58+
}
59+
60+
if (!dbus_message_iter_close_container(iter, &iter_array))
61+
return FALSE;
62+
63+
return TRUE;
64+
}
65+
4666
static dbus_bool_t
4767
__ni_dbus_message_iter_append_string_array(DBusMessageIter *iter, const char *element_signature,
4868
char **string_array, unsigned int len)
@@ -246,6 +266,11 @@ ni_dbus_message_iter_append_value(DBusMessageIter *iter, const ni_dbus_variant_t
246266
variant->byte_array_value, variant->array.len);
247267
break;
248268

269+
case DBUS_TYPE_UINT32:
270+
rv = ni_dbus_message_iter_append_uint32_array(iter_val,
271+
variant->uint32_array_value, variant->array.len);
272+
break;
273+
249274
case DBUS_TYPE_STRING:
250275
rv = ni_dbus_message_iter_append_string_array(iter_val,
251276
variant->string_array_value, variant->array.len);
@@ -314,6 +339,21 @@ ni_dbus_message_iter_get_byte_array(DBusMessageIter *iter, ni_dbus_variant_t *va
314339
return TRUE;
315340
}
316341

342+
dbus_bool_t
343+
ni_dbus_message_iter_get_uint32_array(DBusMessageIter *iter, ni_dbus_variant_t *variant)
344+
{
345+
uint32_t u;
346+
347+
ni_dbus_variant_init_uint32_array(variant);
348+
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_UINT32) {
349+
dbus_message_iter_get_basic(iter, &u);
350+
ni_dbus_variant_append_uint32_array(variant, u);
351+
dbus_message_iter_next(iter);
352+
}
353+
354+
return TRUE;
355+
}
356+
317357
dbus_bool_t
318358
ni_dbus_message_iter_get_string_array(DBusMessageIter *iter, ni_dbus_variant_t *variant)
319359
{
@@ -441,6 +481,9 @@ ni_dbus_message_iter_get_array(DBusMessageIter *iter, ni_dbus_variant_t *variant
441481
case DBUS_TYPE_VARIANT:
442482
success = ni_dbus_message_iter_get_variant_array(&iter_array, variant);
443483
break;
484+
case DBUS_TYPE_UINT32:
485+
success = ni_dbus_message_iter_get_uint32_array(&iter_array, variant);
486+
break;
444487
default:
445488
ni_debug_dbus("%s: cannot decode array of type %c", __FUNCTION__, array_type);
446489
break;

0 commit comments

Comments
 (0)