blob: 47e6489d40d179f12bf1eab8e9c963e151861a9f [file] [log] [blame]
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