diff options
author | Anders Carlsson <andersca@codefactory.se> | 2003-03-10 00:13:55 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@codefactory.se> | 2003-03-10 00:13:55 +0000 |
commit | 799a3ff443f5357ae7857ebe989a7f92f7bd84df (patch) | |
tree | 5217028097693381989fa0a1480e0ac863cba58a /dbus/dbus-message.c | |
parent | 1458fb145fdfe7e7ca11c88f8e2f117d90a906d8 (diff) |
2003-03-10 Anders Carlsson <andersca@codefactory.se>
* dbus/dbus-marshal.c:
(_dbus_marshal_set_string):
Take a length argument so we can marshal the correct string
length.
(_dbus_marshal_dict), (_dbus_demarshal_dict),
(_dbus_marshal_get_arg_end_pos), (_dbus_marshal_validate_arg),
(_dbus_marshal_test):
* dbus/dbus-marshal.h:
Add support for marshalling and demarshalling dicts.
* dbus/dbus-message-builder.c: (_dbus_message_data_load):
Add support for TYPE DICT.
* dbus/dbus-message.c: (set_string_field):
Adjust header padding.
(dbus_message_append_args_valist), (dbus_message_append_dict),
(dbus_message_get_args_valist), (dbus_message_iter_get_arg_type),
(dbus_message_iter_get_dict), (_dbus_message_loader_return_buffer),
(check_message_handling), (check_have_valid_message):
* dbus/dbus-message.h:
Add functions for setting and getting dicts.
* dbus/dbus-protocol.h:
Add DBUS_TYPE_DICT.
* dbus/dbus.h:
Add dbus-dict.h
* doc/dbus-specification.sgml:
Add information about how dicts are marshalled.
* test/data/invalid-messages/dict-with-nil-value.message:
* test/data/invalid-messages/too-short-dict.message:
* test/data/valid-messages/dict-simple.message:
* test/data/valid-messages/dict.message:
Add sample messages containing dicts.
Diffstat (limited to 'dbus/dbus-message.c')
-rw-r--r-- | dbus/dbus-message.c | 122 |
1 files changed, 110 insertions, 12 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index db1b94bf..a25480cb 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -493,15 +493,21 @@ set_string_field (DBusMessage *message, DBusString v; int old_len; int new_len; + int len; + + clear_header_padding (message); old_len = _dbus_string_get_length (&message->header); + len = strlen (value); + _dbus_string_init_const_len (&v, value, - strlen (value) + 1); /* include nul */ + len + 1); /* include nul */ if (!_dbus_marshal_set_string (&message->header, message->byte_order, - offset, &v)) - return FALSE; + offset, &v, + len)) + goto failed; new_len = _dbus_string_get_length (&message->header); @@ -509,7 +515,19 @@ set_string_field (DBusMessage *message, offset, new_len - old_len); + if (!append_header_padding (message)) + goto failed; + return TRUE; + + failed: + /* this must succeed because it was allocated on function entry and + * DBusString doesn't ever realloc smaller + */ + if (!append_header_padding (message)) + _dbus_assert_not_reached ("failed to reappend header padding"); + + return FALSE; } } @@ -1162,7 +1180,15 @@ dbus_message_append_args_valist (DBusMessage *message, goto enomem; } break; - + case DBUS_TYPE_DICT: + { + DBusDict *dict; + + dict = va_arg (var_args, DBusDict *); + + if (!dbus_message_append_dict (message, dict)) + goto enomem; + } default: _dbus_warn ("Unknown field type %d\n", type); } @@ -1485,6 +1511,31 @@ dbus_message_append_string_array (DBusMessage *message, } /** + * Appends a dict to the message. + * + * @param message the message + * @param dict the dict + * @returns #TRUE on success + */ +dbus_bool_t +dbus_message_append_dict (DBusMessage *message, + DBusDict *dict) +{ + _dbus_assert (!message->locked); + + if (!_dbus_string_append_byte (&message->body, DBUS_TYPE_DICT)) + return FALSE; + + if (!_dbus_marshal_dict (&message->body, message->byte_order, dict)) + { + _dbus_string_shorten (&message->body, 1); + return FALSE; + } + + return TRUE; +} + +/** * Gets arguments from a message given a variable argument list. * The variable argument list should contain the type of the * argumen followed by a pointer to where the value should be @@ -1696,6 +1747,16 @@ dbus_message_get_args_valist (DBusMessage *message, return DBUS_RESULT_NO_MEMORY; break; } + case DBUS_TYPE_DICT: + { + DBusDict **dict; + + dict = va_arg (var_args, DBusDict **); + + if (!dbus_message_iter_get_dict (iter, dict)) + return DBUS_RESULT_NO_MEMORY; + break; + } default: _dbus_warn ("Unknown field type %d\n", spec_type); } @@ -1850,7 +1911,7 @@ dbus_message_iter_get_arg_type (DBusMessageIter *iter) _dbus_string_get_const_data_len (&iter->message->body, &data, iter->pos, 1); - if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_STRING_ARRAY) + if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_DICT) return *data; return DBUS_TYPE_INVALID; @@ -2062,7 +2123,7 @@ dbus_message_iter_get_double_array (DBusMessageIter *iter, * @param iter the iterator * @param value return location for array values * @param len return location for length of byte array - * @returns the byte array + * @returns #TRUE on success */ dbus_bool_t dbus_message_iter_get_byte_array (DBusMessageIter *iter, @@ -2093,7 +2154,7 @@ dbus_message_iter_get_byte_array (DBusMessageIter *iter, * @param iter the iterator * @param value return location for string values * @param len return location for length of byte array - * @returns the byte array + * @returns #TRUE on success */ dbus_bool_t dbus_message_iter_get_string_array (DBusMessageIter *iter, @@ -2112,6 +2173,30 @@ dbus_message_iter_get_string_array (DBusMessageIter *iter, } /** + * Returns the dict that the iterator may point to. + * Note that you need to check that the iterator points + * to a dict prior to using this function. + * + * @param iter the iterator + * @param dict return location for dict + * @returns #TRUE on success + */ +dbus_bool_t +dbus_message_iter_get_dict (DBusMessageIter *iter, + DBusDict **dict) +{ + _dbus_assert (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_DICT); + + *dict = _dbus_demarshal_dict (&iter->message->body, iter->message->byte_order, + iter->pos + 1, NULL); + + if (!*dict) + return FALSE; + else + return TRUE; +} + +/** * Sets the message sender. * * @param message the message @@ -2630,9 +2715,10 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader, */ header_len = header_len_unsigned; body_len = body_len_unsigned; - + if (_DBUS_ALIGN_VALUE (header_len, 8) != header_len_unsigned) { + _dbus_verbose ("header length %d is not aligned to 8 bytes\n", header_len); loader->corrupted = TRUE; @@ -2654,8 +2740,8 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader, int next_arg; #if 0 - _dbus_verbose_bytes_of_string (&loader->data, 0, header_len); -#endif + _dbus_verbose_bytes_of_string (&loader->data, 0, header_len + body_len); +#endif if (!decode_header_data (&loader->data, header_len, byte_order, fields, &header_padding)) { @@ -2899,7 +2985,7 @@ check_message_handling (DBusMessage *message) /* If we implement message_set_arg (message, n, value) * then we would want to test it here */ - + iter = dbus_message_get_args_iter (message); while ((type = dbus_message_iter_get_arg_type (iter)) != DBUS_TYPE_INVALID) { @@ -2967,7 +3053,18 @@ check_message_handling (DBusMessage *message) dbus_free_string_array (values); } break; - + + case DBUS_TYPE_DICT: + { + DBusDict *dict; + + if (!dbus_message_iter_get_dict (iter, &dict)) + return FALSE; + + dbus_dict_unref (dict); + } + break; + default: break; } @@ -3025,6 +3122,7 @@ check_have_valid_message (DBusMessageLoader *loader) failed: if (message) dbus_message_unref (message); + return retval; } |