diff options
author | Aleksandar Kanchev <kanchev@itestra.com> | 2012-07-09 18:09:04 +0200 |
---|---|---|
committer | James Thomas <james.thomas@codethink.co.uk> | 2015-05-18 09:20:40 +0000 |
commit | 92a2d95a6c4457783dbd663bab27260c328f2248 (patch) | |
tree | b8ee4de9d1efc309672686f6c336218b9d5c75f2 /dbus/dbus-message.c | |
parent | 2381b81d05fbd19a37b21e133433d450b3724c80 (diff) | |
download | dbus-baserock/genivi/dbus-1.9.16-1-g92a2d95.tar.gz |
DBusMessage: add support for custom marshalingbaserock/genivi/dbus-1.9.16-1-g92a2d95
Add functions to support querying and manipulating the message body and
signature. This is useful for code generators, which can generate custom
marshaling functions based on a given IDL. Those functions tend to be
optimized and faster than the generic iterator based marshaling.
Diffstat (limited to 'dbus/dbus-message.c')
-rw-r--r-- | dbus/dbus-message.c | 143 |
1 files changed, 99 insertions, 44 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 699e022b..a9d4a38a 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -411,50 +411,6 @@ set_or_delete_string_field (DBusMessage *message, &value); } -#if 0 -/* Probably we don't need to use this */ -/** - * Sets the signature of the message, i.e. the arguments in the - * message payload. The signature includes only "in" arguments for - * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for - * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from - * what you might expect (it does not include the signature of the - * entire C++-style method). - * - * The signature is a string made up of type codes such as - * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also - * the value of #DBUS_TYPE_INVALID). The macros such as - * #DBUS_TYPE_INT32 evaluate to integers; to assemble a signature you - * may find it useful to use the string forms, such as - * #DBUS_TYPE_INT32_AS_STRING. - * - * An "unset" or #NULL signature is considered the same as an empty - * signature. In fact dbus_message_get_signature() will never return - * #NULL. - * - * @param message the message - * @param signature the type signature or #NULL to unset - * @returns #FALSE if no memory - */ -static dbus_bool_t -_dbus_message_set_signature (DBusMessage *message, - const char *signature) -{ - _dbus_return_val_if_fail (message != NULL, FALSE); - _dbus_return_val_if_fail (!message->locked, FALSE); - _dbus_return_val_if_fail (signature == NULL || - _dbus_check_is_valid_signature (signature)); - /* can't delete the signature if you have a message body */ - _dbus_return_val_if_fail (_dbus_string_get_length (&message->body) == 0 || - signature != NULL); - - return set_or_delete_string_field (message, - DBUS_HEADER_FIELD_SIGNATURE, - DBUS_TYPE_SIGNATURE, - signature); -} -#endif - /* Message Cache * * We cache some DBusMessage to reduce the overhead of allocating @@ -3558,6 +3514,47 @@ dbus_message_get_sender (DBusMessage *message) } /** + * Sets the signature of the message, i.e. the arguments in the + * message payload. The signature includes only "in" arguments for + * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for + * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from + * what you might expect (it does not include the signature of the + * entire C++-style method). + * + * The signature is a string made up of type codes such as + * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also + * the value of #DBUS_TYPE_INVALID). The macros such as + * #DBUS_TYPE_INT32 evaluate to integers; to assemble a signature you + * may find it useful to use the string forms, such as + * #DBUS_TYPE_INT32_AS_STRING. + * + * An "unset" or #NULL signature is considered the same as an empty + * signature. In fact dbus_message_get_signature() will never return + * #NULL. + * + * @param message the message + * @param signature the type signature or #NULL to unset + * @returns #FALSE if no memory + */ +dbus_bool_t +dbus_message_set_signature (DBusMessage *message, + const char *signature) +{ + _dbus_return_val_if_fail (message != NULL, FALSE); + _dbus_return_val_if_fail (!message->locked, FALSE); + _dbus_return_val_if_fail (signature == NULL || + _dbus_check_is_valid_signature (signature), FALSE); + /* can't delete the signature if you have a message body */ + _dbus_return_val_if_fail (_dbus_string_get_length (&message->body) == 0 || + signature != NULL, FALSE); + + return set_or_delete_string_field (message, + DBUS_HEADER_FIELD_SIGNATURE, + DBUS_TYPE_SIGNATURE, + signature); +} + +/** * Gets the type signature of the message, i.e. the arguments in the * message payload. The signature includes only "in" arguments for * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for @@ -4742,6 +4739,64 @@ dbus_message_type_to_string (int type) } /** + * Returns pointer to the buffer used to store the message body. + * + * @param message the message + * @return pointer to the message body memory + */ +char* +dbus_message_get_body (DBusMessage *message) { + _dbus_return_val_if_fail (message != NULL, NULL); + + return _dbus_string_get_data(&(message->body)); +} + +/** + * Adjust the length of the message body buffer. The memory will be reallocated + * if the new length is bigger than the already allocated size. + * + * @see dbus_message_get_body_allocated + * @param message the message + * @param length the new length of the body + * @return #TRUE if successful + */ +dbus_bool_t +dbus_message_set_body_length (DBusMessage *message, + int length) { + _dbus_return_val_if_fail (message != NULL, FALSE); + _dbus_return_val_if_fail (length >= 0, FALSE); + + return _dbus_string_set_length(&(message->body), length); +} + +/** + * Gets the length of the message body buffer. + * + * @param message the message + * @param length the new length of the body + * @return the length of the body buffer + */ +int +dbus_message_get_body_length (DBusMessage *message) { + _dbus_return_val_if_fail (message != NULL, 0); + + return _dbus_string_get_length(&(message->body)); +} + +/** + * Gets the allocated memory size used to hold the message body. + * + * @param message the message + * @return size of the allocated message body memory + */ +int +dbus_message_get_body_allocated (DBusMessage *message) { + _dbus_return_val_if_fail (message != NULL, 0); + + return _dbus_string_get_allocated(&(message->body)); +} + +/** * Turn a DBusMessage into the marshalled form as described in the D-Bus * specification. * |