From ac744223411099a862a747e7168a30255c003bf7 Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Wed, 18 Mar 2015 13:01:07 +0100 Subject: sbus: add a{sas} get invoker Reviewed-by: Jakub Hrozek --- src/sbus/sbus_codegen | 32 +++++++++--- src/sbus/sssd_dbus_invokers.c | 118 ++++++++++++++++++++++++++++++++++++++++++ src/sbus/sssd_dbus_invokers.h | 4 ++ 3 files changed, 146 insertions(+), 8 deletions(-) (limited to 'src/sbus') diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen index 7d2127508..93eb9f1c1 100755 --- a/src/sbus/sbus_codegen +++ b/src/sbus/sbus_codegen @@ -125,12 +125,15 @@ class Typed(Base): self.type = type self.is_basic = False self.is_array = False + self.is_dictionary = False self.dbus_constant = None self.dbus_type = None self.sssd_type = None if type[0] == 'a': type = type[1:] self.is_array = True + if "{" in type: + self.is_dictionary = True if type in BASIC_TYPES: (self.dbus_constant, self.dbus_type, self.sssd_type) = BASIC_TYPES[type] # If types are not identical, we can't do array (yet) @@ -192,16 +195,29 @@ class Property(Typed): raise DBusXmlException('Invalid access type %s'%self.access) def fq_c_name(self): return "%s_%s" % (self.iface.c_name(), self.c_name()) + def get_invoker_name(self): + type = self.type + type = type.replace("{", "DO") + type = type.replace("}", "DE") + return type + def get_invoker_signature(self, name): + sig = "void (*%s)(struct sbus_request *, void *data, " % (name) + if self.is_dictionary: + sig += "hash_table_t **" + elif self.is_array: + sig += "%s**, int *" % (self.sssd_type) + else: + sig += "%s*" % (self.sssd_type) + sig += ")" + return sig + + def getter_name(self): return "get_%s" % self.c_name() def getter_invoker_name(self): - return "sbus_invoke_get_%s" % self.type - def getter_signature(self, name): - sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type) - if self.is_array: - sig += " *, int *" - sig += ")" - return sig + return "sbus_invoke_get_%s" % self.get_invoker_name() + def getter_signature(self): + return self.get_invoker_signature(self.getter_name()) class Interface(Base): def __init__(self, name): @@ -253,7 +269,7 @@ def method_function_pointer(meth, name, with_names=False): method_arg_types(meth.in_args, with_names)) def property_handlers(prop): - return prop.getter_signature(prop.getter_name()) + return prop.getter_signature() def forward_method_invoker(signature, args): out("") diff --git a/src/sbus/sssd_dbus_invokers.c b/src/sbus/sssd_dbus_invokers.c index df9104f63..f4d4ba3a6 100644 --- a/src/sbus/sssd_dbus_invokers.c +++ b/src/sbus/sssd_dbus_invokers.c @@ -303,6 +303,124 @@ int sbus_invoke_get_ao(DBusMessageIter *iter, DBUS_TYPE_OBJECT_PATH, iter); } +int sbus_invoke_get_aDOsasDE(DBusMessageIter *iter, + struct sbus_request *sbus_req, + void *function_ptr) +{ + void (*handler_fn)(struct sbus_request *, void *, hash_table_t **); + DBusMessageIter it_array; + DBusMessageIter it_dict; + DBusMessageIter it_values; + hash_table_t *table; + struct hash_iter_context_t *table_iter = NULL; + hash_entry_t *entry; + const char **values; + dbus_bool_t dbret; + errno_t ret; + int i; + + handler_fn = function_ptr; + handler_fn(sbus_req, sbus_req->intf->handler_data, &table); + + dbret = dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_ARRAY_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + /* iterate over keys */ + + if (table == NULL) { + dbret = dbus_message_iter_close_container(iter, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + ret = EOK; + goto done; + } + + table_iter = new_hash_iter_context(table); + while ((entry = table_iter->next(table_iter)) != NULL) { + if (entry->key.type != HASH_KEY_STRING || entry->key.str == NULL + || entry->value.type != HASH_VALUE_PTR + || entry->value.ptr == NULL) { + continue; + } + + dbret = dbus_message_iter_open_container(&it_array, + DBUS_TYPE_DICT_ENTRY, NULL, + &it_dict); + if (!dbret) { + ret = EIO; + goto done; + } + + /* append key as dict entry key */ + + dbret = dbus_message_iter_append_basic(&it_dict, + DBUS_TYPE_STRING, + &entry->key.str); + if (!dbret) { + ret = EIO; + goto done; + } + + /* iterate over values */ + + dbret = dbus_message_iter_open_container(&it_dict, + DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, + &it_values); + if (!dbret) { + ret = EIO; + goto done; + } + + values = entry->value.ptr; + for (i = 0; values[i] != NULL; i++) { + /* append value into array */ + dbret = dbus_message_iter_append_basic(&it_values, + DBUS_TYPE_STRING, + &values[i]); + if (!dbret) { + ret = EIO; + goto done; + } + } + + dbret = dbus_message_iter_close_container(&it_dict, &it_values); + if (!dbret) { + ret = EIO; + goto done; + } + + dbret = dbus_message_iter_close_container(&it_array, &it_dict); + if (!dbret) { + ret = EIO; + goto done; + } + } + + dbret = dbus_message_iter_close_container(iter, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + ret = EOK; + +done: + talloc_free(table_iter); + return ret; +} + void sbus_invoke_get(struct sbus_request *sbus_req, const char *type, sbus_get_invoker_fn invoker_fn, diff --git a/src/sbus/sssd_dbus_invokers.h b/src/sbus/sssd_dbus_invokers.h index 8fd498594..6f7f2540e 100644 --- a/src/sbus/sssd_dbus_invokers.h +++ b/src/sbus/sssd_dbus_invokers.h @@ -109,6 +109,10 @@ int sbus_invoke_get_ao(DBusMessageIter *iter, struct sbus_request *sbus_req, void *function_ptr); +int sbus_invoke_get_aDOsasDE(DBusMessageIter *iter, + struct sbus_request *sbus_req, + void *function_ptr); + void sbus_invoke_get(struct sbus_request *sbus_req, const char *type, sbus_get_invoker_fn invoker_fn, -- cgit