summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRolf Offermanns <roffermanns@sysgo.com>2010-09-16 22:42:57 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2010-09-17 10:20:34 +0200
commit52a5b8d061881690e8d0bf09ddef099102781348 (patch)
tree8fef325e7a1d19df20f79076a288128a917de0db
parent0556b2a330c37fa870161c4bf8191f7915ee3333 (diff)
downloadjson-dbus-bridge-52a5b8d061881690e8d0bf09ddef099102781348.tar.gz
json-dbus-bridge-52a5b8d061881690e8d0bf09ddef099102781348.tar.xz
[src] add dbus struct handling
Signed-off-by: Rolf Offermanns <roffermanns@sysgo.com> Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r--src/bridge_request.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/bridge_request.c b/src/bridge_request.c
index bf376ed..3d40aad 100644
--- a/src/bridge_request.c
+++ b/src/bridge_request.c
@@ -273,6 +273,39 @@ int bridge_request_dbus_params_dict(bridge_request_t *self,
return 0;
}
+int bridge_request_dbus_params_struct(bridge_request_t *self,
+ struct json_object *element,
+ DBusSignatureIter *sigIt,
+ DBusMessageIter *it)
+{
+ int i, ret, len;
+ struct json_object *tmp;
+
+ len = json_object_array_length(element);
+
+ for (i = 0; i < len; ++i) {
+ tmp = json_object_array_get_idx(element, i);
+ if (!tmp) {
+ bridge_request_error(self,
+ "Unexpected 'null' parameter found.");
+ return EINVAL;
+ }
+ ret = bridge_request_dbus_params_element(self,
+ tmp, sigIt, it);
+ if (ret != 0)
+ return ret;
+ if (!dbus_signature_iter_next(sigIt)) {
+ if (i+1 == len)
+ return 0;
+ bridge_request_error(self,
+ "Unexpected extra parameter found.");
+ return EINVAL;
+ }
+ }
+ bridge_request_error(self, "Aditional parameter expexted.");
+ return EINVAL;
+}
+
int bridge_request_dbus_params_array(bridge_request_t *self,
struct json_object *params,
int idx, const char *sig,
@@ -329,6 +362,24 @@ int bridge_request_dbus_params_element(bridge_request_t *self,
if (ret != 0)
return EINVAL;
}
+ else if (type == DBUS_TYPE_STRUCT) {
+ DBusMessageIter args;
+ DBusSignatureIter sigArgs;
+
+ if (json_object_get_type(element) != json_type_array) {
+ bridge_request_error(self, "array expected.");
+ return EINVAL;
+ }
+
+ dbus_signature_iter_recurse(sigIt, &sigArgs);
+ dbus_message_iter_open_container(it,
+ type, NULL, &args);
+ ret = bridge_request_dbus_params_struct(self,
+ element, &sigArgs, &args);
+ dbus_message_iter_close_container(it, &args);
+ if (ret != 0)
+ return EINVAL;
+ }
else if (type == DBUS_TYPE_ARRAY) {
DBusMessageIter args;
DBusSignatureIter sigArgs;
@@ -505,10 +556,12 @@ int bridge_request_json_params_parse(bridge_request_t *self, DBusMessageIter *it
break;
}
case DBUS_TYPE_ARRAY:
+ case DBUS_TYPE_STRUCT:
case DBUS_TYPE_VARIANT: {
DBusMessageIter args;
dbus_message_iter_recurse(it, &args);
- ret = bridge_request_json_params(self, &args, result, type == DBUS_TYPE_ARRAY);
+ ret = bridge_request_json_params(self,
+ &args, result, ((type == DBUS_TYPE_ARRAY) || (type == DBUS_TYPE_STRUCT)));
if (ret != 0)
return ret;
break;