dbus: add support for array as returned type

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2009-12-22 15:10:23 +01:00
parent af01e176d7
commit 596cac5fb1
1 changed files with 36 additions and 1 deletions

37
dbus.c
View File

@ -264,11 +264,42 @@ a_dbus_convert_value(lua_State *L, int idx, DBusMessageIter *iter)
size_t len; size_t len;
const char *type = lua_tolstring(globalconf.L, idx, &len); const char *type = lua_tolstring(globalconf.L, idx, &len);
if(!type || len != 1) if(!type || len < 1)
return false; return false;
switch(*type) switch(*type)
{ {
case DBUS_TYPE_ARRAY:
{
DBusMessageIter subiter;
dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
type + 1,
&subiter);
int arraylen = lua_objlen(L, idx + 1);
if(arraylen % 2 != 0)
luaL_error(globalconf.L,
"your D-Bus signal handling method returned wrong number of arguments");
/* Push the array */
lua_pushvalue(L, idx + 1);
for(int i = 1; i < arraylen; i += 2)
{
lua_rawgeti(L, -1, i);
lua_rawgeti(L, -2, i + 1);
if(!a_dbus_convert_value(L, -2, &subiter))
return false;
lua_pop(L, 2);
}
/* Remove the array */
lua_pop(L, 1);
dbus_message_iter_close_container(iter, &subiter);
}
break;
case DBUS_TYPE_BOOLEAN: case DBUS_TYPE_BOOLEAN:
{ {
dbus_bool_t b = lua_toboolean(globalconf.L, idx + 1); dbus_bool_t b = lua_toboolean(globalconf.L, idx + 1);
@ -385,6 +416,10 @@ a_dbus_process_request(DBusConnection *dbus_connection, DBusMessage *msg)
dbus_message_iter_init_append(reply, &iter); dbus_message_iter_init_append(reply, &iter);
if(n % 2 != 0)
luaL_error(globalconf.L,
"your D-Bus signal handling method returned wrong number of arguments");
/* i is negative */ /* i is negative */
for(int i = n; i < 0; i += 2) for(int i = n; i < 0; i += 2)
{ {