static int vlclua_var_get_list( lua_State *L ) { vlc_value_t val; vlc_value_t text; vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); int i_ret = var_Change( *pp_obj, psz_var, VLC_VAR_GETLIST, &val, &text ); if( i_ret < 0 ) return vlclua_push_ret( L, i_ret ); vlclua_pushvalue( L, VLC_VAR_LIST, val ); vlclua_pushvalue( L, VLC_VAR_LIST, text ); var_FreeList( &val, &text ); return 2; }
static int vlclua_callback( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { vlclua_callback_t *p_callback = (vlclua_callback_t*)p_data; lua_State *L = p_callback->L; /* <empty stack> */ lua_getglobal( L, "vlc" ); /* vlc */ lua_getfield( L, -1, "callbacks" ); /* vlc callbacks */ lua_remove( L, -2 ); /* callbacks */ lua_pushinteger( L, p_callback->i_index ); /* callbacks index */ lua_gettable( L, -2 ); /* callbacks callbacks[index] */ lua_remove( L, -2 ); /* callbacks[index] */ lua_getfield( L, -1, "callback" ); /* callbacks[index] callback */ lua_pushstring( L, psz_var ); /* callbacks[index] callback var */ vlclua_pushvalue( L, p_callback->i_type, oldval ); /* callbacks[index] callback var oldval */ vlclua_pushvalue( L, p_callback->i_type, newval ); /* callbacks[index] callback var oldval newval */ lua_getfield( L, -5, "data" ); /* callbacks[index] callback var oldval newval data */ lua_remove( L, -6 ); /* callback var oldval newval data */ if( lua_pcall( L, 4, 0, 0 ) ) { /* errormessage */ const char *psz_err = lua_tostring( L, -1 ); msg_Err( p_this, "Error while running lua interface callback: %s", psz_err ); /* empty the stack (should only contain the error message) */ lua_settop( L, 0 ); return VLC_EGENERIC; } /* empty the stack (should already be empty) */ lua_settop( L, 0 ); return VLC_SUCCESS; }
static int vlclua_var_get( lua_State *L ) { int i_type; vlc_value_t val; vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); i_type = var_Type( *pp_obj, psz_var ); if( var_Get( *pp_obj, psz_var, &val ) != VLC_SUCCESS ) return 0; lua_pop( L, 2 ); return vlclua_pushvalue( L, i_type, val ); }
static int vlclua_pushlist( lua_State *L, vlc_list_t *p_list ) { int i_count = p_list->i_count; lua_createtable( L, i_count, 0 ); for( int i = 0; i < i_count; i++ ) { lua_pushinteger( L, i+1 ); if( !vlclua_pushvalue( L, p_list->i_type, p_list->p_values[i], true ) ) lua_pushnil( L ); lua_settable( L, -3 ); } return 1; }
/***************************************************************************** * Variables handling *****************************************************************************/ int vlclua_pushvalue( lua_State *L, int i_type, vlc_value_t val ) { switch( i_type &= VLC_VAR_CLASS ) { case VLC_VAR_VOID: vlclua_error( L ); break; case VLC_VAR_BOOL: lua_pushboolean( L, val.b_bool ); break; case VLC_VAR_INTEGER: lua_pushinteger( L, val.i_int ); break; case VLC_VAR_STRING: lua_pushstring( L, val.psz_string ); break; case VLC_VAR_FLOAT: lua_pushnumber( L, val.f_float ); break; case VLC_VAR_TIME: /* FIXME? (we're losing some precision, but does it really matter?) */ lua_pushnumber( L, ((double)val.i_time)/1000000. ); break; case VLC_VAR_ADDRESS: vlclua_error( L ); break; case VLC_VAR_MUTEX: vlclua_error( L ); break; case VLC_VAR_LIST: { int i_count = val.p_list->i_count; int i; lua_createtable( L, i_count, 0 ); for( i = 0; i < i_count; i++ ) { lua_pushinteger( L, i+1 ); if( !vlclua_pushvalue( L, val.p_list->pi_types[i], val.p_list->p_values[i] ) ) lua_pushnil( L ); lua_settable( L, -3 ); } } break; default: vlclua_error( L ); } return 1; }
static int vlclua_var_inherit( lua_State *L ) { vlc_value_t val; vlc_object_t *p_obj; if( lua_type( L, 1 ) == LUA_TNIL ) p_obj = vlclua_get_this( L ); else { vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); p_obj = *pp_obj; } const char *psz_var = luaL_checkstring( L, 2 ); int i_type = config_GetType( p_obj, psz_var ); if( var_Inherit( p_obj, psz_var, i_type, &val ) != VLC_SUCCESS ) return 0; lua_pop( L, 2 ); return vlclua_pushvalue( L, i_type, val, true ); }