2003-04-16 Havoc Pennington <hp@pobox.com>
authorHavoc Pennington <hp@redhat.com>
Thu, 17 Apr 2003 04:25:45 +0000 (04:25 +0000)
committerHavoc Pennington <hp@redhat.com>
Thu, 17 Apr 2003 04:25:45 +0000 (04:25 +0000)
* doc/dbus-specification.sgml: make spec say serials are unsigned

* dbus/dbus-message.h: change message serials to unsigned

* dbus/dbus-connection.c: adapt to message serials being unsigned

ChangeLog
bus/connection.c
bus/driver.c
dbus/dbus-connection.c
dbus/dbus-connection.h
dbus/dbus-message.c
dbus/dbus-message.h
doc/dbus-specification.sgml

index 97c5880..069734d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-04-16  Havoc Pennington  <hp@pobox.com>
+
+       * doc/dbus-specification.sgml: make spec say serials are unsigned
+
+       * dbus/dbus-message.h: change message serials to unsigned
+
+       * dbus/dbus-connection.c: adapt to message serials being unsigned
+       
 2003-04-15  Havoc Pennington  <hp@pobox.com>
 
        * bus/bus.c: create and keep around a shared DBusUserDatabase 
index c311f7e..31fe27a 100644 (file)
@@ -951,7 +951,7 @@ bus_transaction_send (BusTransaction *transaction,
 
   _dbus_verbose ("  trying to add %s %s to transaction%s\n",
                  dbus_message_get_is_error (message) ? "error" :
-                 dbus_message_get_reply_serial (message) != -1 ? "reply" :
+                 dbus_message_get_reply_serial (message) != 0 ? "reply" :
                  "message",
                  dbus_message_get_name (message),
                  dbus_connection_get_is_connected (connection) ?
index c7d66d5..0d8b944 100644 (file)
@@ -620,7 +620,7 @@ bus_driver_handle_message (DBusConnection *connection,
       return FALSE;
     }
 
-  if (dbus_message_get_reply_serial (message) != -1)
+  if (dbus_message_get_reply_serial (message) != 0)
     {
       _dbus_verbose ("Client sent a reply to the bus driver, ignoring it\n");
       return TRUE;
index da7a755..c6af034 100644 (file)
@@ -104,7 +104,7 @@ struct DBusConnection
 
   DBusHashTable *pending_replies;  /**< Hash of message serials and their message handlers. */  
   
-  int client_serial;            /**< Client serial. Increments each time a message is sent  */
+  dbus_uint32_t client_serial;       /**< Client serial. Increments each time a message is sent  */
   DBusList *disconnect_message_link; /**< Preallocated list node for queueing the disconnection message */
 
   DBusWakeupMainFunction wakeup_main_function; /**< Function to wake up the mainloop  */
@@ -728,7 +728,7 @@ _dbus_connection_new_for_transport (DBusTransport *transport)
   return NULL;
 }
 
-static dbus_int32_t
+static dbus_uint32_t
 _dbus_connection_get_next_client_serial (DBusConnection *connection)
 {
   int serial;
@@ -1147,9 +1147,9 @@ void
 dbus_connection_send_preallocated (DBusConnection       *connection,
                                    DBusPreallocatedSend *preallocated,
                                    DBusMessage          *message,
-                                   dbus_int32_t         *client_serial)
+                                   dbus_uint32_t        *client_serial)
 {
-  dbus_int32_t serial;
+  dbus_uint32_t serial;
   
   _dbus_assert (preallocated->connection == connection);
   _dbus_assert (dbus_message_get_name (message) != NULL);
@@ -1176,14 +1176,18 @@ dbus_connection_send_preallocated (DBusConnection       *connection,
                  connection,
                  connection->n_outgoing);
 
-  if (dbus_message_get_serial (message) == -1)
+  if (dbus_message_get_serial (message) == 0)
     {
       serial = _dbus_connection_get_next_client_serial (connection);
       _dbus_message_set_serial (message, serial);
+      if (client_serial)
+        *client_serial = serial;
+    }
+  else
+    {
+      if (client_serial)
+        *client_serial = dbus_message_get_serial (message);
     }
-  
-  if (client_serial)
-    *client_serial = dbus_message_get_serial (message);
   
   _dbus_message_lock (message);
 
@@ -1217,7 +1221,7 @@ dbus_connection_send_preallocated (DBusConnection       *connection,
 dbus_bool_t
 dbus_connection_send (DBusConnection *connection,
                       DBusMessage    *message,
-                      dbus_int32_t   *client_serial)
+                      dbus_uint32_t  *client_serial)
 {
   DBusPreallocatedSend *preallocated;
 
@@ -1379,7 +1383,7 @@ dbus_connection_send_with_reply (DBusConnection     *connection,
   data->connection_added = TRUE;
   
   /* Assign a serial to the message */
-  if (dbus_message_get_serial (message) == -1)
+  if (dbus_message_get_serial (message) == 0)
     {
       serial = _dbus_connection_get_next_client_serial (connection);
       _dbus_message_set_serial (message, serial);
@@ -1433,7 +1437,7 @@ dbus_connection_send_with_reply (DBusConnection     *connection,
 
 static DBusMessage*
 check_for_reply_unlocked (DBusConnection *connection,
-                          dbus_int32_t    client_serial)
+                          dbus_uint32_t   client_serial)
 {
   DBusList *link;
   
@@ -1483,7 +1487,7 @@ dbus_connection_send_with_reply_and_block (DBusConnection     *connection,
                                            int                 timeout_milliseconds,
                                            DBusError          *error)
 {
-  dbus_int32_t client_serial;
+  dbus_uint32_t client_serial;
   long start_tv_sec, start_tv_usec;
   long end_tv_sec, end_tv_usec;
   long tv_sec, tv_usec;
@@ -1520,7 +1524,7 @@ dbus_connection_send_with_reply_and_block (DBusConnection     *connection,
   end_tv_sec += end_tv_usec / _DBUS_USEC_PER_SECOND;
   end_tv_usec = end_tv_usec % _DBUS_USEC_PER_SECOND;
 
-  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): will block %d milliseconds for reply serial %d from %ld sec %ld usec to %ld sec %ld usec\n",
+  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): will block %d milliseconds for reply serial %u from %ld sec %ld usec to %ld sec %ld usec\n",
                  timeout_milliseconds,
                  client_serial,
                  start_tv_sec, start_tv_usec,
index 5421e1f..7e1de0c 100644 (file)
@@ -101,7 +101,7 @@ DBusDispatchStatus dbus_connection_get_dispatch_status          (DBusConnection
 DBusDispatchStatus dbus_connection_dispatch                     (DBusConnection             *connection);
 dbus_bool_t        dbus_connection_send                         (DBusConnection             *connection,
                                                                  DBusMessage                *message,
-                                                                 dbus_int32_t               *client_serial);
+                                                                 dbus_uint32_t              *client_serial);
 dbus_bool_t        dbus_connection_send_with_reply              (DBusConnection             *connection,
                                                                  DBusMessage                *message,
                                                                  DBusMessageHandler         *reply_handler,
@@ -198,7 +198,7 @@ void                  dbus_connection_free_preallocated_send (DBusConnection
 void                  dbus_connection_send_preallocated      (DBusConnection       *connection,
                                                               DBusPreallocatedSend *preallocated,
                                                               DBusMessage          *message,
-                                                              dbus_int32_t         *client_serial);
+                                                              dbus_uint32_t        *client_serial);
 
 
 DBUS_END_DECLS;
index 97f8e5c..fda50d6 100644 (file)
@@ -92,8 +92,8 @@ struct DBusMessage
                                            * of each field in "header"
                                            */
 
-  dbus_int32_t client_serial; /**< Cached client serial value for speed */
-  dbus_int32_t reply_serial;  /**< Cached reply serial value for speed */
+  dbus_uint32_t client_serial; /**< Cached client serial value for speed */
+  dbus_uint32_t reply_serial;  /**< Cached reply serial value for speed */
   
   int header_padding; /**< bytes of alignment in header */
   
@@ -204,6 +204,47 @@ adjust_field_offsets (DBusMessage *message,
     }
 }
 
+#ifdef DBUS_BUILD_TESTS
+/* tests-only until it's actually used */
+static dbus_int32_t
+get_int_field (DBusMessage *message,
+               int          field)
+{
+  int offset;
+
+  _dbus_assert (field < FIELD_LAST);
+  
+  offset = message->header_fields[field].offset;
+  
+  if (offset < 0)
+    return -1; /* useless if -1 is a valid value of course */
+  
+  return _dbus_demarshal_int32 (&message->header,
+                                message->byte_order,
+                                offset,
+                                NULL);
+}
+#endif
+
+static dbus_uint32_t
+get_uint_field (DBusMessage *message,
+                int          field)
+{
+  int offset;
+  
+  _dbus_assert (field < FIELD_LAST);
+  
+  offset = message->header_fields[field].offset;
+  
+  if (offset < 0)
+    return -1; /* useless if -1 is a valid value of course */
+  
+  return _dbus_demarshal_uint32 (&message->header,
+                                 message->byte_order,
+                                 offset,
+                                 NULL);
+}
+
 static const char*
 get_string_field (DBusMessage *message,
                   int          field,
@@ -235,25 +276,7 @@ get_string_field (DBusMessage *message,
   return data + (offset + 4); 
 }
 
-static dbus_int32_t
-get_int_field (DBusMessage *message,
-               int          field)
-{
-  int offset;
-
-  _dbus_assert (field < FIELD_LAST);
-  
-  offset = message->header_fields[field].offset;
-  
-  if (offset < 0)
-    return -1; /* useless if -1 is a valid value of course */
-  
-  return _dbus_demarshal_int32 (&message->header,
-                                message->byte_order,
-                                offset,
-                                NULL);
-}
-
+#ifdef DBUS_BUILD_TESTS
 static dbus_bool_t
 append_int_field (DBusMessage *message,
                   int          field,
@@ -303,6 +326,57 @@ append_int_field (DBusMessage *message,
     _dbus_assert_not_reached ("failed to reappend header padding");
   return FALSE;
 }
+#endif
+
+static dbus_bool_t
+append_uint_field (DBusMessage *message,
+                   int          field,
+                   const char  *name,
+                   int          value)
+{
+  int orig_len;
+
+  _dbus_assert (!message->locked);
+
+  clear_header_padding (message);
+  
+  orig_len = _dbus_string_get_length (&message->header);
+  
+  if (!_dbus_string_align_length (&message->header, 4))
+    goto failed;  
+  
+  if (!_dbus_string_append_len (&message->header, name, 4))
+    goto failed;
+
+  if (!_dbus_string_append_byte (&message->header, DBUS_TYPE_UINT32))
+    goto failed;
+
+  if (!_dbus_string_align_length (&message->header, 4))
+    goto failed;
+  
+  message->header_fields[FIELD_REPLY_SERIAL].offset =
+    _dbus_string_get_length (&message->header);
+  
+  if (!_dbus_marshal_uint32 (&message->header, message->byte_order,
+                             value))
+    goto failed;
+
+  if (!append_header_padding (message))
+    goto failed;
+  
+  return TRUE;
+  
+ failed:
+  message->header_fields[field].offset = -1;
+  _dbus_string_set_length (&message->header, orig_len);
+
+  /* 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;
+}
 
 static dbus_bool_t
 append_string_field (DBusMessage *message,
@@ -360,8 +434,8 @@ append_string_field (DBusMessage *message,
  * keep it compiling if we need it in future
  */
 static void
-delete_int_field (DBusMessage *message,
-                  int          field)
+delete_int_or_uint_field (DBusMessage *message,
+                          int          field)
 {
   int offset = message->header_fields[field].offset;
 
@@ -424,6 +498,7 @@ delete_string_field (DBusMessage *message,
   append_header_padding (message);
 }
 
+#ifdef DBUS_BUILD_TESTS
 static dbus_bool_t
 set_int_field (DBusMessage *message,
                int          field,
@@ -439,10 +514,6 @@ set_int_field (DBusMessage *message,
 
       switch (field)
         {
-        case FIELD_REPLY_SERIAL:
-          return append_int_field (message, field,
-                                   DBUS_HEADER_FIELD_REPLY,
-                                   value);
         default:
           _dbus_assert_not_reached ("appending an int field we don't support appending");
           return FALSE;
@@ -457,6 +528,7 @@ set_int_field (DBusMessage *message,
       return TRUE;
     }
 }
+#endif
 
 static dbus_bool_t
 set_uint_field (DBusMessage  *message,
@@ -473,6 +545,10 @@ set_uint_field (DBusMessage  *message,
 
       switch (field)
         {
+        case FIELD_REPLY_SERIAL:
+          return append_uint_field (message, field,
+                                    DBUS_HEADER_FIELD_REPLY,
+                                    value);
         default:
           _dbus_assert_not_reached ("appending a uint field we don't support appending");
           return FALSE;
@@ -568,10 +644,10 @@ _dbus_message_set_serial (DBusMessage  *message,
                           dbus_int32_t  serial)
 {
   _dbus_assert (!message->locked);
-  _dbus_assert (dbus_message_get_serial (message) < 0);
+  _dbus_assert (dbus_message_get_serial (message) == 0);
   
-  set_int_field (message, FIELD_CLIENT_SERIAL,
-                 serial);
+  set_uint_field (message, FIELD_CLIENT_SERIAL,
+                  serial);
   message->client_serial = serial;
 }
 
@@ -584,13 +660,13 @@ _dbus_message_set_serial (DBusMessage  *message,
  * @returns #FALSE if not enough memory
  */
 dbus_bool_t
-dbus_message_set_reply_serial (DBusMessage  *message,
-                               dbus_int32_t  reply_serial)
+dbus_message_set_reply_serial (DBusMessage   *message,
+                               dbus_uint32_t  reply_serial)
 {
   _dbus_assert (!message->locked);
 
-  if (set_int_field (message, FIELD_REPLY_SERIAL,
-                     reply_serial))
+  if (set_uint_field (message, FIELD_REPLY_SERIAL,
+                      reply_serial))
     {
       message->reply_serial = reply_serial;
       return TRUE;
@@ -607,7 +683,7 @@ dbus_message_set_reply_serial (DBusMessage  *message,
  * @param message the message
  * @returns the client serial
  */
-dbus_int32_t
+dbus_uint32_t
 dbus_message_get_serial (DBusMessage *message)
 {
   return message->client_serial;
@@ -615,12 +691,12 @@ dbus_message_get_serial (DBusMessage *message)
 
 /**
  * Returns the serial that the message is
- * a reply to or -1 if none.
+ * a reply to or 0 if none.
  *
  * @param message the message
  * @returns the reply serial
  */
-dbus_int32_t
+dbus_uint32_t
 dbus_message_get_reply_serial  (DBusMessage *message)
 {
   return message->reply_serial;
@@ -823,8 +899,8 @@ dbus_message_new_empty_header (void)
   
   message->refcount = 1;
   message->byte_order = DBUS_COMPILER_BYTE_ORDER;
-  message->client_serial = -1;
-  message->reply_serial = -1;
+  message->client_serial = 0;
+  message->reply_serial = 0;
   
   i = 0;
   while (i < FIELD_LAST)
@@ -3926,10 +4002,11 @@ _dbus_message_loader_queue_messages (DBusMessageLoader *loader)
           _dbus_assert (_dbus_string_get_length (&message->body) == body_len);
 
           /* Fill in caches */
-          message->reply_serial = get_int_field (message,
-                                                 FIELD_REPLY_SERIAL);
-          message->client_serial = get_int_field (message,
-                                                  FIELD_CLIENT_SERIAL);
+          /* FIXME there's no type check if the field has the wrong type */
+          message->reply_serial = get_uint_field (message,
+                                                  FIELD_REPLY_SERIAL);
+          message->client_serial = get_uint_field (message,
+                                                   FIELD_CLIENT_SERIAL);
           
          _dbus_verbose ("Loaded message %p\n", message);
        }
@@ -4380,15 +4457,15 @@ check_message_handling (DBusMessage *message)
   DBusMessageIter iter;
   int type;
   dbus_bool_t retval;
-  dbus_int32_t client_serial;
+  dbus_uint32_t client_serial;
   
   retval = FALSE;
   
   client_serial = dbus_message_get_serial (message);
 
   /* can't use set_serial due to the assertions at the start of it */
-  set_int_field (message, FIELD_CLIENT_SERIAL,
-                 client_serial);
+  set_uint_field (message, FIELD_CLIENT_SERIAL,
+                  client_serial);
   
   if (client_serial != dbus_message_get_serial (message))
     {
index 0ea0338..c692f91 100644 (file)
@@ -63,28 +63,26 @@ DBusMessage* dbus_message_new_error_reply  (DBusMessage       *original_message,
                                            const char        *error_message);
 DBusMessage *dbus_message_copy             (const DBusMessage *message);
 
-void         dbus_message_ref   (DBusMessage *message);
-void         dbus_message_unref (DBusMessage *message);
-
-const char*  dbus_message_get_name         (DBusMessage  *message);
-const char*  dbus_message_get_service      (DBusMessage  *message);
-dbus_bool_t  dbus_message_set_sender       (DBusMessage  *message,
-                                            const char   *sender);
-const char*  dbus_message_get_sender       (DBusMessage  *message);
-void         dbus_message_set_is_error     (DBusMessage  *message,
-                                            dbus_bool_t   is_error_reply);
-dbus_bool_t  dbus_message_get_is_error     (DBusMessage  *message);
-dbus_bool_t  dbus_message_name_is          (DBusMessage  *message,
-                                            const char   *name);
-dbus_bool_t  dbus_message_service_is       (DBusMessage  *message,
-                                            const char   *service);
-dbus_bool_t  dbus_message_sender_is        (DBusMessage  *message,
-                                            const char   *service);
-dbus_int32_t dbus_message_get_serial       (DBusMessage  *message);
-dbus_bool_t  dbus_message_set_reply_serial (DBusMessage  *message,
-                                            dbus_int32_t  reply_serial);
-dbus_int32_t dbus_message_get_reply_serial (DBusMessage  *message);
-
+void          dbus_message_ref              (DBusMessage   *message);
+void          dbus_message_unref            (DBusMessage   *message);
+const char*   dbus_message_get_name         (DBusMessage   *message);
+const char*   dbus_message_get_service      (DBusMessage   *message);
+dbus_bool_t   dbus_message_set_sender       (DBusMessage   *message,
+                                             const char    *sender);
+const char*   dbus_message_get_sender       (DBusMessage   *message);
+void          dbus_message_set_is_error     (DBusMessage   *message,
+                                             dbus_bool_t    is_error_reply);
+dbus_bool_t   dbus_message_get_is_error     (DBusMessage   *message);
+dbus_bool_t   dbus_message_name_is          (DBusMessage   *message,
+                                             const char    *name);
+dbus_bool_t   dbus_message_service_is       (DBusMessage   *message,
+                                             const char    *service);
+dbus_bool_t   dbus_message_sender_is        (DBusMessage   *message,
+                                             const char    *service);
+dbus_uint32_t dbus_message_get_serial       (DBusMessage   *message);
+dbus_bool_t   dbus_message_set_reply_serial (DBusMessage   *message,
+                                             dbus_uint32_t  reply_serial);
+dbus_uint32_t dbus_message_get_reply_serial (DBusMessage   *message);
 
 dbus_bool_t dbus_message_append_args          (DBusMessage     *message,
                                               int              first_arg_type,
index c14e9cd..02feed3 100644 (file)
               </row>      
               <row>
                 <entry>4 bytes</entry>
-                <entry>The message's serial number, a signed 32-bit integer in
+                <entry>The message's serial number, an unsigned 32-bit integer in
                   the message's byte order. Applications MUST NOT reuse the same
                   serial number for different messages more often than 32-bit
-                  integer wraparound. Serial numbers must be greater than 
-                  zero.
+                  unsigned integer wraparound. Zero is not a valid serial number.
                 </entry>
               </row>
             </tbody>
               </row>
               <row>
                 <entry>rply</entry>
-                <entry>INT32</entry>
+                <entry>UINT32</entry>
                 <entry>The serial number of the message this message is a reply
                 to. (The serial number is one of the mandatory header fields,
                 see <xref linkend="message-protocol-header-encoding">.)</entry>