static int vlclua_dummy_require( lua_State *L )
{
(void) L;
+ // const char *psz_module = luaL_checkstring( L, 1 );
return 0;
}
/**
* Batch scan all Lua files in folder "extensions": callback
* @param p_this This extensions_manager_t object
- * @param psz_script Name of the script to run
+ * @param psz_filename Name of the script to run
* @param L Lua State, common to all scripts here
* @param dummy: unused
**/
-int ScanLuaCallback( vlc_object_t *p_this, const char *psz_script,
+int ScanLuaCallback( vlc_object_t *p_this, const char *psz_filename,
void *dummy )
{
VLC_UNUSED(dummy);
extensions_manager_t *p_mgr = ( extensions_manager_t* ) p_this;
bool b_ok = false;
- msg_Dbg( p_mgr, "Scanning Lua script %s", psz_script );
+ msg_Dbg( p_mgr, "Scanning Lua script %s", psz_filename );
+
+ /* Experimental: read .vle packages (Zip archives) */
+ char *psz_script = NULL;
+ int i_flen = strlen( psz_filename );
+ if( !strncasecmp( psz_filename + i_flen - 4, ".vle", 4 ) )
+ {
+ msg_Dbg( p_this, "reading Lua script in a zip archive" );
+ psz_script = calloc( 1, i_flen + 6 + 2 + 10 + 1 );
+ if( !psz_script )
+ return 0;
+ strcpy( psz_script, "zip://" );
+ strncat( psz_script, psz_filename, i_flen + 19 );
+ strncat( psz_script, "!/script.lua", i_flen + 19 );
+ }
+ else
+ {
+ psz_script = strdup( psz_filename );
+ if( !psz_script )
+ return 0;
+ }
/* Create new script descriptor */
extension_t *p_ext = ( extension_t* ) calloc( 1, sizeof( extension_t ) );
if( !p_ext )
return 0;
- p_ext->psz_name = strdup( psz_script );
+ p_ext->psz_name = psz_script;
p_ext->p_sys = (extension_sys_t*) calloc( 1, sizeof( extension_sys_t ) );
if( !p_ext->p_sys || !p_ext->psz_name )
{
lua_register( L, "require", &vlclua_dummy_require );
/* Let's run it */
- if( luaL_dofile( L, psz_script ) )
+ if( vlclua_dofile( p_this, L, psz_script ) ) // luaL_dofile
{
msg_Warn( p_mgr, "Error loading script %s: %s", psz_script,
lua_tostring( L, lua_gettop( L ) ) );
}
/* Load and run the script(s) */
- if( luaL_dofile( L, p_ext->psz_name ) != 0 )
+ if( vlclua_dofile( p_mgr, L, p_ext->psz_name ) ) // luaL_dofile
{
msg_Warn( p_mgr, "Error loading script %s: %s", p_ext->psz_name,
lua_tostring( L, lua_gettop( L ) ) );
#include <vlc_fs.h>
#include <vlc_aout.h>
#include <vlc_services_discovery.h>
+#include <vlc_stream.h>
#include <sys/stat.h>
#include <lua.h> /* Low level lua C API */
/*****************************************************************************
*
*****************************************************************************/
-static const char *ppsz_lua_exts[] = { ".luac", ".lua", NULL };
+static const char *ppsz_lua_exts[] = { ".luac", ".lua", ".vle", NULL };
static int file_select( const char *file )
{
int i = strlen( file );
return 0;
}
+/** Replacement for luaL_dofile, using VLC's input capabilities */
+int vlclua_dofile( vlc_object_t *p_this, lua_State *L, const char *uri )
+{
+ if( !strstr( uri, "://" ) )
+ return luaL_dofile( L, uri );
+ if( !strncasecmp( uri, "file://", 7 ) )
+ return luaL_dofile( L, uri + 7 );
+ stream_t *s = stream_UrlNew( p_this, uri );
+ if( !s )
+ return 1;
+ int64_t i_size = stream_Size( s );
+ char *p_buffer = ( i_size > 0 ) ? malloc( i_size ) : NULL;
+ if( !p_buffer )
+ {
+ // FIXME: read the whole stream until we reach the end (if no size)
+ stream_Delete( s );
+ return 1;
+ }
+ int64_t i_read = stream_Read( s, p_buffer, (int) i_size );
+ int i_ret = ( i_read == i_size ) ? 0 : 1;
+ if( !i_ret )
+ i_ret = luaL_loadbuffer( L, p_buffer, (size_t) i_size, uri );
+ if( !i_ret )
+ i_ret = lua_pcall( L, 0, LUA_MULTRET, 0 );
+ stream_Delete( s );
+ free( p_buffer );
+ return i_ret;
+}
+
void vlclua_dir_list_free( char **ppsz_dir_list );
char *vlclua_find_file( vlc_object_t *p_this, const char *psz_luadirname, const char *psz_name );
+/*****************************************************************************
+ * Replace Lua file reader by VLC input. Allows loadings scripts in Zip pkg.
+ *****************************************************************************/
+int vlclua_dofile( vlc_object_t *p_this, lua_State *L, const char *url );
+
/*****************************************************************************
* Playlist and meta data internal utilities.
*****************************************************************************/