diff options
Diffstat (limited to 'dbus/dbus-message-builder.c')
-rw-r--r-- | dbus/dbus-message-builder.c | 181 |
1 files changed, 136 insertions, 45 deletions
diff --git a/dbus/dbus-message-builder.c b/dbus/dbus-message-builder.c index 044c2a7b..dbfe3239 100644 --- a/dbus/dbus-message-builder.c +++ b/dbus/dbus-message-builder.c @@ -297,9 +297,12 @@ append_saved_length (DBusString *dest, * UINT32 <N> marshals a UINT32 * DOUBLE <N> marshals a double * STRING 'Foo' marshals a string + * BYTE_ARRAY { 'a', 3, 4, 5, 6} marshals a BYTE array + * BOOLEAN_ARRAY { false, true, false} marshals a BOOLEAN array * INT32_ARRAY { 3, 4, 5, 6} marshals an INT32 array * UINT32_ARRAY { 3, 4, 5, 6} marshals an UINT32 array * DOUBLE_ARRAY { 1.0, 2.0, 3.0, 4.0} marshals a DOUBLE array + * STRING_ARRAY { "foo", "bar", "gazonk"} marshals a STRING array * @endcode * * @todo add support for array types INT32_ARRAY { 3, 4, 5, 6 } @@ -513,38 +516,6 @@ _dbus_message_data_load (DBusString *dest, _dbus_string_shorten (dest, val); } - else if (_dbus_string_starts_with_c_str (&line, "BYTE")) - { - unsigned char the_byte; - - _dbus_string_delete_first_word (&line); - - if (_dbus_string_equal_c_str (&line, "'\\''")) - the_byte = '\''; - else if (_dbus_string_get_byte (&line, 0) == '\'' && - _dbus_string_get_length (&line) >= 3 && - _dbus_string_get_byte (&line, 2) == '\'') - the_byte = _dbus_string_get_byte (&line, 1); - else - { - long val; - if (!_dbus_string_parse_int (&line, 0, &val, NULL)) - { - _dbus_warn ("Failed to parse integer for BYTE\n"); - goto parse_failed; - } - - if (val > 255) - { - _dbus_warn ("A byte must be in range 0-255 not %ld\n", - val); - goto parse_failed; - } - the_byte = (unsigned char) val; - } - - _dbus_string_append_byte (dest, the_byte); - } else if (_dbus_string_starts_with_c_str (&line, "START_LENGTH")) { @@ -619,18 +590,8 @@ _dbus_message_data_load (DBusString *dest, code = DBUS_TYPE_INVALID; else if (_dbus_string_starts_with_c_str (&line, "NIL")) code = DBUS_TYPE_NIL; - else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN_ARRAY")) - code = DBUS_TYPE_BOOLEAN_ARRAY; - else if (_dbus_string_starts_with_c_str (&line, "INT32_ARRAY")) - code = DBUS_TYPE_INT32_ARRAY; - else if (_dbus_string_starts_with_c_str (&line, "UINT32_ARRAY")) - code = DBUS_TYPE_UINT32_ARRAY; - else if (_dbus_string_starts_with_c_str (&line, "DOUBLE_ARRAY")) - code = DBUS_TYPE_DOUBLE_ARRAY; - else if (_dbus_string_starts_with_c_str (&line, "BYTE_ARRAY")) - code = DBUS_TYPE_BYTE_ARRAY; - else if (_dbus_string_starts_with_c_str (&line, "STRING_ARRAY")) - code = DBUS_TYPE_STRING_ARRAY; + else if (_dbus_string_starts_with_c_str (&line, "BYTE")) + code = DBUS_TYPE_BYTE; else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN")) code = DBUS_TYPE_BOOLEAN; else if (_dbus_string_starts_with_c_str (&line, "INT32")) @@ -641,6 +602,10 @@ _dbus_message_data_load (DBusString *dest, code = DBUS_TYPE_DOUBLE; else if (_dbus_string_starts_with_c_str (&line, "STRING")) code = DBUS_TYPE_STRING; + else if (_dbus_string_starts_with_c_str (&line, "NAMED")) + code = DBUS_TYPE_NAMED; + else if (_dbus_string_starts_with_c_str (&line, "ARRAY")) + code = DBUS_TYPE_ARRAY; else if (_dbus_string_starts_with_c_str (&line, "DICT")) code = DBUS_TYPE_DICT; else @@ -656,6 +621,100 @@ _dbus_message_data_load (DBusString *dest, } } else if (_dbus_string_starts_with_c_str (&line, + "BYTE_ARRAY")) + { + SAVE_FOR_UNALIGN (dest, 4); + int i, len, allocated; + unsigned char *values; + unsigned char b; + long val; + + allocated = 4; + values = dbus_new (unsigned char, allocated); + if (!values) + { + _dbus_warn ("could not allocate memory for BYTE_ARRAY\n"); + goto parse_failed; + } + + len = 0; + + _dbus_string_delete_first_word (&line); + _dbus_string_skip_blank (&line, 0, &i); + b = _dbus_string_get_byte (&line, i++); + + if (b != '{') + goto parse_failed; + + while (i < _dbus_string_get_length (&line)) + { + _dbus_string_skip_blank (&line, i, &i); + + if (_dbus_string_get_byte (&line, i) == '\'' && + _dbus_string_get_length (&line) >= i + 4 && + _dbus_string_get_byte (&line, i + 1) == '\\' && + _dbus_string_get_byte (&line, i + 2) == '\'' && + _dbus_string_get_byte (&line, i + 3) == '\'') + { + val = '\''; + i += 4; + } + else if (_dbus_string_get_byte (&line, i) == '\'' && + _dbus_string_get_length (&line) >= i + 3 && + _dbus_string_get_byte (&line, i + 2) == '\'') + { + val = _dbus_string_get_byte (&line, i + 1); + i += 3; + } + else + { + if (!_dbus_string_parse_int (&line, i, &val, &i)) + { + _dbus_warn ("Failed to parse integer for BYTE_ARRAY\n"); + goto parse_failed; + } + + if (val < 0 || val > 255) + { + _dbus_warn ("A byte must be in range 0-255 not %ld\n", + val); + goto parse_failed; + } + } + + values[len++] = val; + if (len == allocated) + { + allocated *= 2; + values = dbus_realloc (values, allocated * sizeof (unsigned char)); + if (!values) + { + _dbus_warn ("could not allocate memory for BOOLEAN_ARRAY\n"); + goto parse_failed; + } + } + + _dbus_string_skip_blank (&line, i, &i); + + b = _dbus_string_get_byte (&line, i++); + + if (b == '}') + break; + else if (b != ',') + goto parse_failed; + } + + if (!_dbus_marshal_int32 (dest, endian, len) || + !_dbus_string_append_len (dest, values, len)) + { + _dbus_warn ("failed to append BYTE_ARRAY\n"); + goto parse_failed; + } + dbus_free (values); + + PERFORM_UNALIGN (dest); + } + else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN_ARRAY")) { SAVE_FOR_UNALIGN (dest, 4); @@ -949,7 +1008,7 @@ _dbus_message_data_load (DBusString *dest, values = dbus_new (char *, allocated); if (!values) { - _dbus_warn ("could not allocate memory for DOUBLE_ARRAY\n"); + _dbus_warn ("could not allocate memory for STRING_ARRAY\n"); goto parse_failed; } @@ -1017,6 +1076,38 @@ _dbus_message_data_load (DBusString *dest, PERFORM_UNALIGN (dest); } + else if (_dbus_string_starts_with_c_str (&line, "BYTE")) + { + unsigned char the_byte; + + _dbus_string_delete_first_word (&line); + + if (_dbus_string_equal_c_str (&line, "'\\''")) + the_byte = '\''; + else if (_dbus_string_get_byte (&line, 0) == '\'' && + _dbus_string_get_length (&line) >= 3 && + _dbus_string_get_byte (&line, 2) == '\'') + the_byte = _dbus_string_get_byte (&line, 1); + else + { + long val; + if (!_dbus_string_parse_int (&line, 0, &val, NULL)) + { + _dbus_warn ("Failed to parse integer for BYTE\n"); + goto parse_failed; + } + + if (val > 255) + { + _dbus_warn ("A byte must be in range 0-255 not %ld\n", + val); + goto parse_failed; + } + the_byte = (unsigned char) val; + } + + _dbus_string_append_byte (dest, the_byte); + } else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN")) { |