| From a4a02bb89f781bbc58dab22644a6b1427685111b Mon Sep 17 00:00:00 2001 |
| From: Elly Jones <ellyjones@chromium.org> |
| Date: Thu, 1 Dec 2011 13:41:52 -0500 |
| Subject: [PATCH] dbus-send: support variant values in dictionaries. |
| |
| Since dbus-send does not support nested containers, add a special case to allow |
| for variants as dictionary values. |
| |
| BUG=chromium-os:20843 |
| TEST=Adhoc |
| dbus-send --system / foo.bar.baz dict:string:variant:abc,int32:3 |
| |
| Change-Id: Ia50215c8ec31bed67a8b8f07422812ea04a2f469 |
| Signed-off-by: Elly Jones <ellyjones@chromium.org> |
| Reviewed-on: https://gerrit.chromium.org/gerrit/12323 |
| Reviewed-by: Eric Shienbrood <ers@chromium.org> |
| --- |
| tools/dbus-send.c | 34 ++++++++++++++++++++++++++++++++-- |
| 1 file changed, 32 insertions(+), 2 deletions(-) |
| |
| diff --git a/tools/dbus-send.c b/tools/dbus-send.c |
| index 892e20bd..905d8e8e 100644 |
| --- a/tools/dbus-send.c |
| +++ b/tools/dbus-send.c |
| @@ -244,6 +244,8 @@ append_array (DBusMessageIter *iter, int type, const char *value) |
| free (buffer); |
| } |
| |
| +static int type_from_name(const char *name); |
| + |
| static void |
| append_dict (DBusMessageIter *iter, int keytype, int valtype, const char *value) |
| { |
| @@ -269,7 +271,31 @@ append_dict (DBusMessageIter *iter, int keytype, int valtype, const char *value) |
| fprintf (stderr, "%s: Malformed dictionary\n", appname); |
| exit (1); |
| } |
| - append_arg (&subiter, valtype, val); |
| + if (valtype == DBUS_TYPE_VARIANT) |
| + { |
| + char sig[2]; |
| + char *c = strchr(val, ':'); |
| + if (!c) |
| + { |
| + fprintf (stderr, "Missing type in variant dict\n"); |
| + exit (1); |
| + } |
| + *(c++) = '\0'; |
| + sig[0] = type_from_name(val); |
| + sig[1] = '\0'; |
| + DBusMessageIter subsubiter; |
| + handle_oom (dbus_message_iter_open_container (&subiter, |
| + DBUS_TYPE_VARIANT, |
| + sig, |
| + &subsubiter)); |
| + append_arg(&subsubiter, sig[0], c); |
| + handle_oom (dbus_message_iter_close_container (&subiter, |
| + &subsubiter)); |
| + } |
| + else |
| + { |
| + append_arg (&subiter, valtype, val); |
| + } |
| |
| handle_oom (dbus_message_iter_close_container (iter, &subiter)); |
| val = strtok (NULL, ","); |
| @@ -642,7 +668,11 @@ main (int argc, char *argv[]) |
| exit (1); |
| } |
| *(c++) = 0; |
| - secondary_type = type_from_name (arg); |
| + if (!strcmp(arg, "variant")) |
| + /* Hack: support variant values for dictionaries. */ |
| + secondary_type = DBUS_TYPE_VARIANT; |
| + else |
| + secondary_type = type_from_name (arg); |
| sig[0] = DBUS_DICT_ENTRY_BEGIN_CHAR; |
| sig[1] = type2; |
| sig[2] = secondary_type; |
| -- |
| 2.30.1 |
| |