2003-01-26 Havoc Pennington <hp@pobox.com>
authorHavoc Pennington <hp@redhat.com>
Sun, 26 Jan 2003 15:01:05 +0000 (15:01 +0000)
committerHavoc Pennington <hp@redhat.com>
Sun, 26 Jan 2003 15:01:05 +0000 (15:01 +0000)
* dbus/dbus-message.c (dbus_message_set_sender): support deleting
the sender by setting to NULL

ChangeLog
dbus/dbus-message.c

index 42ccbc5..6f8ea33 100644 (file)
--- 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. ;-)
        
index bf3c1b1..dfebb8e 100644 (file)
@@ -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