>From 63ef7f762e1c115788fbf5225858dce6157a2767 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Wed, 21 May 2014 16:48:45 +0200 Subject: [PATCH 1/5] SBUS: Add utility function sbus_add_variant_to_dict --- src/sbus/sssd_dbus.h | 5 ++ src/sbus/sssd_dbus_properties.c | 116 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index 4ae64f054cdcf0e4005d99d907b878abb85c7137..9bd5019ecbd393eaef83b95c9e5fec5480b947af 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -269,6 +269,11 @@ int sbus_request_return_and_finish(struct sbus_request *dbus_req, int first_arg_type, ...); +int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + const void *value); + 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 bdd5b432fe57ca66a4d06f98720578b3a175a65c..07b33297b13782354cbcf812f129443a14c5d319 100644 --- a/src/sbus/sssd_dbus_properties.c +++ b/src/sbus/sssd_dbus_properties.c @@ -23,6 +23,74 @@ #include "sbus/sssd_dbus_meta.h" #include "sbus/sssd_dbus_private.h" +static char * +type_to_string(char type, char *str) +{ + int l; + + l = snprintf(str, 2, "%c", type); + if (l != 1) { + return NULL; + } + + return str; +} + +int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + const void *value) +{ + DBusMessageIter iter_dict_entry; + DBusMessageIter iter_dict_val; + dbus_bool_t dbret; + char strtype[2]; + + type_to_string(type, strtype); + + 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, + strtype, + &iter_dict_val); + if (!dbret) { + return ENOMEM; + } + + /* Now add the value */ + dbret = dbus_message_iter_append_basic(&iter_dict_val, type, value); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_close_container(&iter_dict_entry, + &iter_dict_val); + 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, @@ -176,6 +244,50 @@ dispatch_properties_get(struct sbus_connection *conn, return EOK; } +static int +dispatch_properties_get_all(struct sbus_connection *conn, + struct sbus_interface *intf, + DBusMessage *message) +{ + struct sbus_request *req; + const char *signature; + const struct sbus_interface_meta *meta; + const char *interface_name; + DBusMessageIter iter; + + req = sbus_new_request(conn, intf, message); + if (req == NULL) { + return ENOMEM; + } + + meta = intf->vtable->meta; + + signature = dbus_message_get_signature(message); + /* Interface name */ + if (strcmp(signature, "s") != 0) { + return sbus_request_fail_and_finish(req, + sbus_error_new(req, + DBUS_ERROR_INVALID_ARGS, + "Invalid argument types passed " \ + "to Set method")); + } + + dbus_message_iter_init(message, &iter); + dbus_message_iter_get_basic(&iter, &interface_name); + + if (strcmp(interface_name, meta->name) != 0) { + return sbus_request_fail_and_finish(req, + sbus_error_new(req, + DBUS_ERROR_UNKNOWN_INTERFACE, + "No such interface")); + } + + sbus_request_invoke_or_finish(req, NULL, + intf->instance_data, + meta->invoker_get_all); + return EOK; +} + int sbus_properties_dispatch(struct sbus_request *dbus_req) { const char *member; @@ -191,6 +303,10 @@ int sbus_properties_dispatch(struct sbus_request *dbus_req) return dispatch_properties_get(dbus_req->conn, dbus_req->intf, dbus_req->message); + } else if (strcmp (member, "GetAll") == 0) { + return dispatch_properties_get_all(dbus_req->conn, + dbus_req->intf, + dbus_req->message); } return ERR_SBUS_NOSUP; -- 1.9.0