mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2026-05-08 13:58:19 +02:00
wplua: handle more GVariant cases
This commit is contained in:
parent
f693e1a4c7
commit
cbe90a5c75
4 changed files with 127 additions and 56 deletions
|
|
@ -103,51 +103,6 @@ wplua_table_to_asv (lua_State *L, int idx)
|
|||
return g_variant_builder_end (&b);
|
||||
}
|
||||
|
||||
void
|
||||
wplua_asv_to_table (lua_State *L, GVariant *asv)
|
||||
{
|
||||
lua_newtable (L);
|
||||
if (asv) {
|
||||
GVariantIter iter;
|
||||
g_variant_iter_init (&iter, asv);
|
||||
const gchar *key;
|
||||
GVariant *value;
|
||||
|
||||
while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) {
|
||||
lua_pushstring (L, key);
|
||||
|
||||
if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) {
|
||||
lua_pushboolean (L, g_variant_get_boolean (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT16)) {
|
||||
lua_pushinteger (L, g_variant_get_int16 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32)) {
|
||||
lua_pushinteger (L, g_variant_get_int32 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT64)) {
|
||||
lua_pushinteger (L, g_variant_get_int64 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)) {
|
||||
lua_pushnumber (L, g_variant_get_double (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) {
|
||||
lua_pushstring (L, g_variant_get_string (value, NULL));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARDICT)) {
|
||||
wplua_asv_to_table (L, value);
|
||||
}
|
||||
else {
|
||||
wp_warning ("skipping bad value (its type cannot be represented in lua)");
|
||||
lua_pop (L, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
lua_settable (L, -3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wplua_lua_to_gvalue (lua_State *L, int idx, GValue *v)
|
||||
{
|
||||
|
|
@ -229,6 +184,126 @@ wplua_lua_to_gvalue (lua_State *L, int idx, GValue *v)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
wplua_gvariant_to_table (lua_State *L, GVariant *variant)
|
||||
{
|
||||
if (variant == NULL) {
|
||||
lua_pushnil (L);
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16)) {
|
||||
lua_pushinteger (L, g_variant_get_int16 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32)) {
|
||||
lua_pushinteger (L, g_variant_get_int32 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64)) {
|
||||
lua_pushinteger (L, g_variant_get_int64 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16)) {
|
||||
lua_pushinteger (L, g_variant_get_uint16 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)) {
|
||||
lua_pushinteger (L, g_variant_get_uint32 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64)) {
|
||||
lua_pushinteger (L, g_variant_get_uint64 (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE)) {
|
||||
lua_pushnumber (L, g_variant_get_double (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) {
|
||||
lua_pushboolean (L, g_variant_get_boolean (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)) {
|
||||
lua_pushstring (L, g_variant_get_string (variant, NULL));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARIANT)) {
|
||||
wplua_gvariant_to_table (L, g_variant_get_variant (variant));
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARDICT)) {
|
||||
lua_newtable (L);
|
||||
GVariantIter iter;
|
||||
g_variant_iter_init (&iter, variant);
|
||||
const gchar *key;
|
||||
GVariant *value;
|
||||
while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) {
|
||||
lua_pushstring (L, key);
|
||||
if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) {
|
||||
lua_pushboolean (L, g_variant_get_boolean (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT16)) {
|
||||
lua_pushinteger (L, g_variant_get_int16 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32)) {
|
||||
lua_pushinteger (L, g_variant_get_int32 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT64)) {
|
||||
lua_pushinteger (L, g_variant_get_int64 (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)) {
|
||||
lua_pushnumber (L, g_variant_get_double (value));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) {
|
||||
lua_pushstring (L, g_variant_get_string (value, NULL));
|
||||
}
|
||||
else if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARDICT)) {
|
||||
wplua_gvariant_to_table (L, value);
|
||||
}
|
||||
else {
|
||||
wp_warning ("skipping bad value (its type cannot be represented in lua)");
|
||||
lua_pop (L, 1);
|
||||
continue;
|
||||
}
|
||||
lua_settable (L, -3);
|
||||
}
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DICTIONARY)) {
|
||||
gsize n_children, i;
|
||||
n_children = g_variant_n_children (variant);
|
||||
lua_createtable (L, 0, n_children);
|
||||
for (i = 0; i < n_children; i++) {
|
||||
g_autoptr (GVariant) key, value;
|
||||
g_variant_get_child (variant, i, "{@?@*}", &key, &value);
|
||||
wplua_gvariant_to_table (L, key);
|
||||
wplua_gvariant_to_table (L, value);
|
||||
lua_settable (L, -3);
|
||||
}
|
||||
}
|
||||
|
||||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("a?"))) {
|
||||
gsize n_children, i;
|
||||
n_children = g_variant_n_children (variant);
|
||||
lua_createtable (L, n_children, 0);
|
||||
for (i = 0; i < n_children; i++) {
|
||||
g_autoptr (GVariant) value;
|
||||
value = g_variant_get_child_value (variant, i);
|
||||
wplua_gvariant_to_table (L, value);
|
||||
lua_seti (L, -2, i);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME maybe implement if needed */
|
||||
else {
|
||||
g_autofree gchar *type_name =
|
||||
g_variant_type_dup_string (g_variant_get_type (variant));
|
||||
wp_warning ("Unhandled gvariant type %s", type_name);
|
||||
lua_pushnil (L);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
wplua_gvalue_to_lua (lua_State *L, const GValue *v)
|
||||
{
|
||||
|
|
@ -301,12 +376,8 @@ wplua_gvalue_to_lua (lua_State *L, const GValue *v)
|
|||
break;
|
||||
}
|
||||
case G_TYPE_VARIANT: {
|
||||
GVariant *asv = g_value_get_variant (v);
|
||||
if (g_variant_is_of_type (asv, G_VARIANT_TYPE_VARDICT))
|
||||
wplua_asv_to_table (L, asv);
|
||||
else
|
||||
/* FIXME maybe implement if needed */
|
||||
lua_pushnil (L);
|
||||
GVariant *variant = g_value_get_variant (v);
|
||||
wplua_gvariant_to_table (L, variant);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ WpProperties * wplua_table_to_properties (lua_State *L, int idx);
|
|||
void wplua_properties_to_table (lua_State *L, WpProperties *p);
|
||||
|
||||
GVariant * wplua_table_to_asv (lua_State *L, int idx);
|
||||
void wplua_asv_to_table (lua_State *L, GVariant *p);
|
||||
void wplua_gvariant_to_table (lua_State *L, GVariant *p);
|
||||
|
||||
gboolean wplua_load_buffer (lua_State * L, const gchar *buf, gsize size,
|
||||
int nargs, int nres, GError **error);
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ execute_script (lua_State *L, struct ScriptData * s, GError ** error)
|
|||
{
|
||||
int nargs = 0;
|
||||
if (s->args) {
|
||||
wplua_asv_to_table (L, s->args);
|
||||
wplua_gvariant_to_table (L, s->args);
|
||||
nargs++;
|
||||
}
|
||||
return wplua_load_path (L, s->filename, nargs, 0, error);
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ test_wplua_convert_asv ()
|
|||
"'test-boolean': <true>, "
|
||||
"'nested-table': <@a{sv} { 'string': <'baz'> }> "
|
||||
"}");
|
||||
wplua_asv_to_table (L, v);
|
||||
wplua_gvariant_to_table (L, v);
|
||||
lua_setglobal (L, "o");
|
||||
|
||||
const gchar code2[] =
|
||||
|
|
@ -571,7 +571,7 @@ test_wplua_script_arguments ()
|
|||
"'test-boolean': <true>, "
|
||||
"'nested-table': <@a{sv} { 'string': <'baz'> }> "
|
||||
"}");
|
||||
wplua_asv_to_table (L, v);
|
||||
wplua_gvariant_to_table (L, v);
|
||||
|
||||
const gchar code2[] =
|
||||
"local o = ...\n"
|
||||
|
|
@ -585,7 +585,7 @@ test_wplua_script_arguments ()
|
|||
|
||||
/* same test, but with sandbox enabled */
|
||||
wplua_enable_sandbox (L, WP_LUA_SANDBOX_ISOLATE_ENV);
|
||||
wplua_asv_to_table (L, v);
|
||||
wplua_gvariant_to_table (L, v);
|
||||
wplua_load_buffer (L, code2, sizeof (code2) - 1, 1, 0, &error);
|
||||
g_assert_no_error (error);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue