Merge branch 'add_msg_iter_sig_check' into 'main'

DBusMessageIter: add `dbus_message_iter_has_signature()`

See merge request dbus/dbus!447
This commit is contained in:
Barnabás Pőcze 2026-01-10 09:11:28 +01:00
commit 19d7dbb4a7
3 changed files with 43 additions and 0 deletions

View file

@ -2318,6 +2318,36 @@ oom:
return ret;
}
/**
* Checks whether the current item pointed to by an iterator has the given signature;
* see dbus_message_get_signature() for more details on what the signature looks like.
*
* @param iter the iterator
* @param signature typecode array
* @returns #TRUE if iterator has the given signature
*/
dbus_bool_t
dbus_message_iter_has_signature (DBusMessageIter *iter, const char *signature)
{
DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
const DBusString *iter_sig;
DBusString actual_sig;
int start, len;
_dbus_return_val_if_fail (iter != NULL, FALSE);
_dbus_return_val_if_fail (signature != NULL, FALSE);
_dbus_return_val_if_fail (_dbus_message_iter_check (real), FALSE);
_dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE);
_dbus_type_reader_get_signature (&real->u.reader, &iter_sig, &start, &len);
if (_dbus_string_get_byte (iter_sig, start) == DBUS_TYPE_INVALID)
len = 0;
_dbus_string_init_const_len (&actual_sig, _dbus_string_get_const_data (iter_sig) + start, len);
return _dbus_string_equal_c_str (&actual_sig, signature);
}
/**
* Reads a basic-typed value from the message iterator.
* Basic types are the non-containers such as integer and string.

View file

@ -275,6 +275,9 @@ dbus_bool_t dbus_message_iter_next (DBusMessageIter *iter);
DBUS_EXPORT
char* dbus_message_iter_get_signature (DBusMessageIter *iter);
DBUS_EXPORT
dbus_bool_t dbus_message_iter_has_signature (DBusMessageIter *iter,
const char *signature);
DBUS_EXPORT
int dbus_message_iter_get_arg_type (DBusMessageIter *iter);
DBUS_EXPORT
int dbus_message_iter_get_element_type (DBusMessageIter *iter);

View file

@ -195,9 +195,19 @@ iterate_fully (DBusMessageIter *iter,
while (TRUE)
{
int arg_type = dbus_message_iter_get_arg_type (iter);
char *signature = dbus_message_iter_get_signature (iter);
dbus_bool_t should_have_next;
dbus_bool_t had_next;
if (signature != NULL)
{
g_assert_true (dbus_message_iter_has_signature (iter, signature));
g_assert_false (dbus_message_iter_has_signature (iter, "invalid"));
if (!g_str_equal (signature, "a{sv}"))
g_assert_false (dbus_message_iter_has_signature (iter, "a{sv}"));
dbus_free (signature);
}
if (arg_type == DBUS_TYPE_INVALID)
return; /* end of iteration */