summaryrefslogtreecommitdiffstats
path: root/src/sbus
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2015-03-18 13:01:07 +0100
committerJakub Hrozek <jhrozek@redhat.com>2015-05-22 15:57:05 +0200
commitac744223411099a862a747e7168a30255c003bf7 (patch)
tree3205b9f9f5efcc420988f61380a62be32abc3eff /src/sbus
parent10a28f461c25d788ff4dcffefa881e7aa724a25d (diff)
downloadsssd-ac744223411099a862a747e7168a30255c003bf7.tar.gz
sssd-ac744223411099a862a747e7168a30255c003bf7.tar.xz
sssd-ac744223411099a862a747e7168a30255c003bf7.zip
sbus: add a{sas} get invoker
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src/sbus')
-rwxr-xr-xsrc/sbus/sbus_codegen32
-rw-r--r--src/sbus/sssd_dbus_invokers.c118
-rw-r--r--src/sbus/sssd_dbus_invokers.h4
3 files changed, 146 insertions, 8 deletions
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,