diff options
author | Havoc Pennington <hp@redhat.com> | 2003-01-26 15:01:05 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-01-26 15:01:05 +0000 |
commit | 8ca39d9925df6cce64688a2315a2a424beb7bd55 (patch) | |
tree | 3a5cc06124f95ab38c6a743e7bdca463d48efb93 /dbus/dbus-message.c | |
parent | 50c25505f62786756519ef1e194883360eda82e0 (diff) |
2003-01-26 Havoc Pennington <hp@pobox.com>
* dbus/dbus-message.c (dbus_message_set_sender): support deleting
the sender by setting to NULL
Diffstat (limited to 'dbus/dbus-message.c')
-rw-r--r-- | dbus/dbus-message.c | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index bf3c1b18..dfebb8ee 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -53,6 +53,17 @@ enum FIELD_LAST }; +static dbus_bool_t field_is_named[FIELD_LAST] = +{ + FALSE, /* FIELD_HEADER_LENGTH */ + FALSE, /* FIELD_BODY_LENGTH */ + FALSE, /* FIELD_CLIENT_SERIAL */ + TRUE, /* FIELD_NAME */ + TRUE, /* FIELD_SERVICE */ + TRUE, /* FIELD_SENDER */ + TRUE /* FIELD_REPLY_SERIAL */ +}; + typedef struct { int offset; /**< Offset to start of field (location of name of field @@ -162,10 +173,10 @@ get_string_field (DBusMessage *message, */ if (len) - *len = _dbus_demarshal_int32 (&message->header, - message->byte_order, - offset, - NULL); + *len = _dbus_demarshal_uint32 (&message->header, + message->byte_order, + offset, + NULL); _dbus_string_get_const_data (&message->header, &data); @@ -266,6 +277,62 @@ append_string_field (DBusMessage *message, return FALSE; } +static void +delete_int_field (DBusMessage *message, + int field) +{ + int offset = message->header_fields[field].offset; + + _dbus_assert (!message->locked); + _dbus_assert (field_is_named[field]); + + if (offset < 0) + return; + + /* The field typecode and name take up 8 bytes */ + _dbus_string_delete (&message->header, + offset - 8, + 12); + + message->header_fields[field].offset = -1; + + adjust_field_offsets (message, + offset - 8, + - 12); +} + +static void +delete_string_field (DBusMessage *message, + int field) +{ + int offset = message->header_fields[field].offset; + int len; + int delete_len; + + _dbus_assert (!message->locked); + _dbus_assert (field_is_named[field]); + + if (offset < 0) + return; + + get_string_field (message, field, &len); + + /* The field typecode and name take up 8 bytes, and the nul + * termination is 1 bytes, string length integer is 4 bytes + */ + delete_len = 8 + 4 + 1 + len; + + _dbus_string_delete (&message->header, + offset - 8, + delete_len); + + message->header_fields[field].offset = -1; + + adjust_field_offsets (message, + offset - 8, + - delete_len); +} + static dbus_bool_t set_int_field (DBusMessage *message, int field, @@ -1392,7 +1459,7 @@ dbus_message_set_sender (DBusMessage *message, if (sender == NULL) { - _dbus_warn ("need to implement unsetting sender field\n"); + delete_string_field (message, FIELD_SENDER); return TRUE; } else |