| 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; |