forked from enlightenment/efl
edbus: do not use dbus_signature_iter_get_signature in edbus_message_iter_arguments_vget
we are only interested in the first char of the signature so we can use dbus_signature_iter_get_current_type and: a) avoid the allocation of the signature for each complete type b) simplify the check for struct and dict, since *_get_current_type() does TheRightThing (TM) This also rename some variables to clarify the new semantics: iter_type -> iter sig_type -> sig_iter SVN revision: 81169
This commit is contained in:
parent
6adce01faa
commit
7a2a31a436
|
@ -711,32 +711,28 @@ edbus_message_iter_arguments_get(EDBus_Message_Iter *iter, const char *signature
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signature, va_list ap)
|
edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signature, va_list ap)
|
||||||
{
|
{
|
||||||
int current_type;
|
int iter_type;
|
||||||
DBusSignatureIter signature_iter;
|
DBusSignatureIter sig_iter;
|
||||||
|
|
||||||
EDBUS_MESSAGE_ITERATOR_CHECK_RETVAL(iter, EINA_FALSE);
|
EDBUS_MESSAGE_ITERATOR_CHECK_RETVAL(iter, EINA_FALSE);
|
||||||
EINA_SAFETY_ON_TRUE_RETURN_VAL(iter->writable, EINA_FALSE);
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(iter->writable, EINA_FALSE);
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(signature, EINA_FALSE);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(signature, EINA_FALSE);
|
||||||
EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_signature_validate(signature, NULL), EINA_FALSE);
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_signature_validate(signature, NULL), EINA_FALSE);
|
||||||
|
|
||||||
dbus_signature_iter_init(&signature_iter, signature);
|
dbus_signature_iter_init(&sig_iter, signature);
|
||||||
current_type = dbus_message_iter_get_arg_type(&iter->dbus_iterator);
|
iter_type = dbus_message_iter_get_arg_type(&iter->dbus_iterator);
|
||||||
while (current_type != DBUS_TYPE_INVALID)
|
while (iter_type != DBUS_TYPE_INVALID)
|
||||||
{
|
{
|
||||||
char *iter_sig = dbus_signature_iter_get_signature(&signature_iter);
|
int sig_type = dbus_signature_iter_get_current_type(&sig_iter);
|
||||||
int c = iter_sig[0];
|
|
||||||
|
|
||||||
dbus_free(iter_sig);
|
if (sig_type != iter_type)
|
||||||
dbus_signature_iter_next(&signature_iter);
|
|
||||||
|
|
||||||
if ((c != current_type) && !(current_type == 'r' && c == '('))
|
|
||||||
{
|
{
|
||||||
ERR("Type in iterator different of signature");
|
ERR("Type in iterator different of signature");
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dbus_type_is_basic(current_type))
|
if (dbus_type_is_basic(iter_type))
|
||||||
get_basic(current_type, &iter->dbus_iterator, MAKE_PTR_FROM_VA_LIST(ap));
|
get_basic(iter_type, &iter->dbus_iterator, MAKE_PTR_FROM_VA_LIST(ap));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EDBus_Message_Iter **user_itr = va_arg(ap, EDBus_Message_Iter **);
|
EDBus_Message_Iter **user_itr = va_arg(ap, EDBus_Message_Iter **);
|
||||||
|
@ -750,8 +746,10 @@ edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signatur
|
||||||
EINA_INLIST_GET(sub_itr));
|
EINA_INLIST_GET(sub_itr));
|
||||||
*user_itr = sub_itr;
|
*user_itr = sub_itr;
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_message_iter_next(&iter->dbus_iterator);
|
dbus_message_iter_next(&iter->dbus_iterator);
|
||||||
current_type = dbus_message_iter_get_arg_type(&iter->dbus_iterator);
|
dbus_signature_iter_next(&sig_iter);
|
||||||
|
iter_type = dbus_message_iter_get_arg_type(&iter->dbus_iterator);
|
||||||
}
|
}
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue