+static void
+append_arg (DBusMessageIter *iter, int type, const char *value)
+{
+ dbus_uint16_t uint16;
+ dbus_int16_t int16;
+ dbus_uint32_t uint32;
+ dbus_int32_t int32;
+ dbus_uint64_t uint64;
+ dbus_int64_t int64;
+ double d;
+ unsigned char byte;
+ dbus_bool_t v_BOOLEAN;
+
+ /* FIXME - we are ignoring OOM returns on all these functions */
+ switch (type)
+ {
+ case DBUS_TYPE_BYTE:
+ byte = strtoul (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_BYTE, &byte);
+ break;
+
+ case DBUS_TYPE_DOUBLE:
+ d = strtod (value, NULL);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_DOUBLE, &d);
+ break;
+
+ case DBUS_TYPE_INT16:
+ int16 = strtol (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_INT16, &int16);
+ break;
+
+ case DBUS_TYPE_UINT16:
+ uint16 = strtoul (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT16, &uint16);
+ break;
+
+ case DBUS_TYPE_INT32:
+ int32 = strtol (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &int32);
+ break;
+
+ case DBUS_TYPE_UINT32:
+ uint32 = strtoul (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT32, &uint32);
+ break;
+
+ case DBUS_TYPE_INT64:
+ int64 = strtoll (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_INT64, &int64);
+ break;
+
+ case DBUS_TYPE_UINT64:
+ uint64 = strtoull (value, NULL, 0);
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT64, &uint64);
+ break;
+
+ case DBUS_TYPE_STRING:
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &value);
+ break;
+
+ case DBUS_TYPE_OBJECT_PATH:
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_OBJECT_PATH, &value);
+ break;
+
+ case DBUS_TYPE_BOOLEAN:
+ if (strcmp (value, "true") == 0)
+ {
+ v_BOOLEAN = TRUE;
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
+ }
+ else if (strcmp (value, "false") == 0)
+ {
+ v_BOOLEAN = FALSE;
+ dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
+ }
+ else
+ {
+ fprintf (stderr, "%s: Expected \"true\" or \"false\" instead of \"%s\"\n", appname, value);
+ exit (1);
+ }
+ break;
+
+ default:
+ fprintf (stderr, "%s: Unsupported data type %c\n", appname, (char) type);
+ exit (1);
+ }
+}
+
+static void
+append_array (DBusMessageIter *iter, int type, const char *value)
+{
+ const char *val;
+ char *dupval = strdup (value);
+
+ val = strtok (dupval, ",");
+ while (val != NULL)
+ {
+ append_arg (iter, type, val);
+ val = strtok (NULL, ",");
+ }
+ free (dupval);
+}
+
+static void
+append_dict (DBusMessageIter *iter, int keytype, int valtype, const char *value)
+{
+ const char *val;
+ char *dupval = strdup (value);
+
+ val = strtok (dupval, ",");
+ while (val != NULL)
+ {
+ DBusMessageIter subiter;
+
+ dbus_message_iter_open_container (iter,
+ DBUS_TYPE_DICT_ENTRY,
+ NULL,
+ &subiter);
+
+ append_arg (&subiter, keytype, val);
+ val = strtok (NULL, ",");
+ if (val == NULL)
+ {
+ fprintf (stderr, "%s: Malformed dictionary\n", appname);
+ exit (1);
+ }
+ append_arg (&subiter, valtype, val);
+
+ dbus_message_iter_close_container (iter, &subiter);
+ val = strtok (NULL, ",");
+ }
+ free (dupval);
+}
+
+static int
+type_from_name (const char *arg)
+{
+ int type;
+ if (!strcmp (arg, "string"))
+ type = DBUS_TYPE_STRING;
+ else if (!strcmp (arg, "int16"))
+ type = DBUS_TYPE_INT16;
+ else if (!strcmp (arg, "uint16"))
+ type = DBUS_TYPE_UINT16;
+ else if (!strcmp (arg, "int32"))
+ type = DBUS_TYPE_INT32;
+ else if (!strcmp (arg, "uint32"))
+ type = DBUS_TYPE_UINT32;
+ else if (!strcmp (arg, "int64"))
+ type = DBUS_TYPE_INT64;
+ else if (!strcmp (arg, "uint64"))
+ type = DBUS_TYPE_UINT64;
+ else if (!strcmp (arg, "double"))
+ type = DBUS_TYPE_DOUBLE;
+ else if (!strcmp (arg, "byte"))
+ type = DBUS_TYPE_BYTE;
+ else if (!strcmp (arg, "boolean"))
+ type = DBUS_TYPE_BOOLEAN;
+ else if (!strcmp (arg, "objpath"))
+ type = DBUS_TYPE_OBJECT_PATH;
+ else
+ {
+ fprintf (stderr, "%s: Unknown type \"%s\"\n", appname, arg);
+ exit (1);
+ }
+ return type;
+}
+