mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-05 01:48:00 +02:00
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:
commit
19d7dbb4a7
3 changed files with 43 additions and 0 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue