From 2965f42fed62b77a5b0e7f6cd01c4be1072484f5 Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Wed, 21 May 2014 16:41:13 +0200 Subject: SBUS: Add utility function sbus_add_array_as_variant_to_dict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Pavel Březina Reviewed-by: Lukáš Slebodník --- 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 b2b6dd4a3..372521a35 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 07b33297b..a85f0d6e2 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, -- cgit