>From 39a09ec906742b1e9a700a29d662b6612bca9f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Wed, 21 May 2014 16:41:13 +0200 Subject: [PATCH 2/5] SBUS: Add utility function sbus_add_array_as_variant_to_dict --- src/sbus/sssd_dbus.h | 7 ++++ src/sbus/sssd_dbus_properties.c | 76 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index b2b6dd4a3233771391ea6ddcec516cb5f4d4a532..372521a3575f967b751c9e13a7d830d9c3b43584 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -278,6 +278,13 @@ int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, int type, const void *value); +int sbus_add_array_as_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + uint8_t *values, + const int len, + const unsigned int item_size); + int sbus_request_return_as_variant(struct sbus_request *dbus_req, int type, const void *value); diff --git a/src/sbus/sssd_dbus_properties.c b/src/sbus/sssd_dbus_properties.c index 07b33297b13782354cbcf812f129443a14c5d319..a85f0d6e2e5ec40c50a960e0266d97326e1096a1 100644 --- a/src/sbus/sssd_dbus_properties.c +++ b/src/sbus/sssd_dbus_properties.c @@ -91,6 +91,82 @@ int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, return EOK; } +int sbus_add_array_as_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + uint8_t *values, + const int len, + const unsigned int item_size) +{ + DBusMessageIter iter_dict_entry; + DBusMessageIter iter_variant; + DBusMessageIter iter_array; + dbus_bool_t dbret; + char variant_type[] = {DBUS_TYPE_ARRAY, type, '\0'}; + char array_type[] = {type, '\0'}; + void *addr = NULL; + int i; + + dbret = dbus_message_iter_open_container(iter_dict, + DBUS_TYPE_DICT_ENTRY, NULL, + &iter_dict_entry); + if (!dbret) { + return ENOMEM; + } + + /* Start by appending the key */ + dbret = dbus_message_iter_append_basic(&iter_dict_entry, + DBUS_TYPE_STRING, &key); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_open_container(&iter_dict_entry, + DBUS_TYPE_VARIANT, + variant_type, + &iter_variant); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_open_container(&iter_variant, + DBUS_TYPE_ARRAY, + array_type, + &iter_array); + if (!dbret) { + return ENOMEM; + } + + /* Now add the value */ + for (i = 0; i < len; i++) { + addr = values + i * item_size; + dbret = dbus_message_iter_append_basic(&iter_array, type, addr); + if (!dbret) { + return ENOMEM; + } + } + + dbret = dbus_message_iter_close_container(&iter_variant, + &iter_array); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_close_container(&iter_dict_entry, + &iter_variant); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_close_container(iter_dict, + &iter_dict_entry); + if (!dbret) { + return ENOMEM; + } + + return EOK; +} + static int dispatch_properties_set(struct sbus_connection *conn, struct sbus_interface *intf, -- 1.9.0