blob: 68bec09432457bc588c9d028a7b836cd02231484 [file] [log] [blame]
diff --git a/tools/dbus-send.c b/tools/dbus-send.c
index 0a6f79a..6c56306 100644
--- a/tools/dbus-send.c
+++ b/tools/dbus-send.c
@@ -164,6 +164,8 @@ append_array (DBusMessageIter *iter, int type, const char *value)
free (dupval);
}
+static int type_from_name(const char *name);
+
static void
append_dict (DBusMessageIter *iter, int keytype, int valtype, const char *value)
{
@@ -187,7 +189,30 @@ 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;
+ dbus_message_iter_open_container (&subiter,
+ DBUS_TYPE_VARIANT,
+ sig,
+ &subsubiter);
+ append_arg(&subsubiter, sig[0], c);
+ dbus_message_iter_close_container (&subiter, &subsubiter);
+ }
+ else
+ {
+ append_arg (&subiter, valtype, val);
+ }
dbus_message_iter_close_container (iter, &subiter);
val = strtok (NULL, ",");
@@ -473,7 +498,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] = type;
sig[2] = secondary_type;