summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-01-26 15:01:05 +0000
committerHavoc Pennington <hp@redhat.com>2003-01-26 15:01:05 +0000
commit8ca39d9925df6cce64688a2315a2a424beb7bd55 (patch)
tree3a5cc06124f95ab38c6a743e7bdca463d48efb93
parent50c25505f62786756519ef1e194883360eda82e0 (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
-rw-r--r--ChangeLog5
-rw-r--r--dbus/dbus-message.c77
2 files changed, 77 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 42ccbc52..6f8ea33d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2003-01-26 Havoc Pennington <hp@pobox.com>
+ * dbus/dbus-message.c (dbus_message_set_sender): support deleting
+ the sender by setting to NULL
+
+2003-01-26 Havoc Pennington <hp@pobox.com>
+
The unit tests pass, but otherwise untested. If it breaks, the
tests should have been better. ;-)
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