* 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 */
}
}
+#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,
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,
_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,
* 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;
append_header_padding (message);
}
+#ifdef DBUS_BUILD_TESTS
static dbus_bool_t
set_int_field (DBusMessage *message,
int field,
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;
return TRUE;
}
}
+#endif
static dbus_bool_t
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;
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;
}
* @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;
* @param message the message
* @returns the client serial
*/
-dbus_int32_t
+dbus_uint32_t
dbus_message_get_serial (DBusMessage *message)
{
return message->client_serial;
/**
* 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;
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)
_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);
}
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))
{