* the script pointed by psz_filename.
*****************************************************************************/
static int probe_luascript( vlc_object_t *p_this, const char * psz_filename,
- lua_State * L, void * user_data )
+ void * user_data )
{
VLC_UNUSED(user_data);
demux_t * p_demux = (demux_t *)p_this;
p_demux->p_sys->psz_filename = strdup(psz_filename);
- /* In lua, setting a variable's value to nil is equivalent to deleting it */
- lua_pushnil( L );
- lua_pushnil( L );
- lua_setglobal( L, "probe" );
- lua_setglobal( L, "parse" );
+ /* Initialise Lua state structure */
+ lua_State *L = luaL_newstate();
+ if( !L )
+ {
+ msg_Err( p_demux, "Could not create new Lua State" );
+ goto error;
+ }
+ p_demux->p_sys->L = L;
+
+ /* Load Lua libraries */
+ luaL_openlibs( L ); /* FIXME: Don't open all the libs? */
+
+ vlclua_set_this( L, p_demux );
+ luaL_register( L, "vlc", p_reg );
+ luaopen_msg( L );
+ luaopen_strings( L );
+ luaopen_stream( L );
+ luaopen_xml( L );
+ luaopen_md5( L );
+ lua_pushstring( L, p_demux->psz_location );
+ lua_setfield( L, -2, "path" );
+ lua_pushstring( L, p_demux->psz_access );
+ lua_setfield( L, -2, "access" );
+
+ lua_pop( L, 1 );
+
+ /* Setup the module search path */
+ if( vlclua_add_modules_path( p_demux, L, psz_filename ) )
+ {
+ msg_Warn( p_demux, "Error while setting the module search path for %s",
+ psz_filename );
+ goto error;
+ }
/* Load and run the script(s) */
if( luaL_dofile( L, psz_filename ) )
if( !lua_isfunction( L, -1 ) )
{
- msg_Warn( p_demux, "Error while runing script %s, "
+ msg_Warn( p_demux, "Error while running script %s, "
"function probe() not found", psz_filename );
goto error;
}
if( lua_pcall( L, 0, 1, 0 ) )
{
- msg_Warn( p_demux, "Error while runing script %s, "
+ msg_Warn( p_demux, "Error while running script %s, "
"function probe(): %s", psz_filename,
lua_tostring( L, lua_gettop( L ) ) );
goto error;
error:
lua_pop( L, 1 );
+ lua_close( p_demux->p_sys->L );
+ p_demux->p_sys->L = NULL;
FREENULL( p_demux->p_sys->psz_filename );
return VLC_EGENERIC;
}
int Import_LuaPlaylist( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
- lua_State *L;
int ret;
- p_demux->p_sys = (demux_sys_t*)malloc( sizeof( demux_sys_t ) );
+ p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) );
if( !p_demux->p_sys )
- {
return VLC_ENOMEM;
- }
-
- p_demux->p_sys->psz_filename = NULL;
p_demux->pf_control = Control;
p_demux->pf_demux = Demux;
- /* Initialise Lua state structure */
- L = luaL_newstate();
- if( !L )
- {
- msg_Err( p_demux, "Could not create new Lua State" );
- free( p_demux->p_sys );
- return VLC_EGENERIC;
- }
- p_demux->p_sys->L = L;
-
- /* Load Lua libraries */
- luaL_openlibs( L ); /* FIXME: Don't open all the libs? */
-
- luaL_register( L, "vlc", p_reg );
- luaopen_msg( L );
- luaopen_strings( L );
- lua_pushlightuserdata( L, p_demux );
- lua_setfield( L, -2, "private" );
- lua_pushstring( L, p_demux->psz_path );
- lua_setfield( L, -2, "path" );
- lua_pushstring( L, p_demux->psz_access );
- lua_setfield( L, -2, "access" );
-
- lua_pop( L, 1 );
-
ret = vlclua_scripts_batch_execute( p_this, "playlist",
- &probe_luascript, L, NULL );
+ &probe_luascript, NULL );
if( ret )
Close_LuaPlaylist( p_this );
return ret;
void Close_LuaPlaylist( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
- lua_close( p_demux->p_sys->L );
+ if( p_demux->p_sys->L )
+ lua_close( p_demux->p_sys->L );
free( p_demux->p_sys->psz_filename );
free( p_demux->p_sys );
}
if( !lua_isfunction( L, -1 ) )
{
- msg_Warn( p_demux, "Error while runing script %s, "
+ msg_Warn( p_demux, "Error while running script %s, "
"function parse() not found", psz_filename );
+ vlc_object_release( p_input_thread );
return VLC_EGENERIC;
}
if( lua_pcall( L, 0, 1, 0 ) )
{
- msg_Warn( p_demux, "Error while runing script %s, "
+ msg_Warn( p_demux, "Error while running script %s, "
"function parse(): %s", psz_filename,
lua_tostring( L, lua_gettop( L ) ) );
+ vlc_object_release( p_input_thread );
return VLC_EGENERIC;
}