[vlc-devel] commit: Add new functions to Lua API. (Antoine Cellerier )

git version control git at videolan.org
Wed Sep 10 02:46:08 CEST 2008


vlc | branch: 0.9-bugfix | Antoine Cellerier <dionoea at videolan.org> | Wed Sep 10 02:29:53 2008 +0200| [65983cfa4b73b6265379dd7a2d528ef1a86f7cbc] | committer: Antoine Cellerier 

Add new functions to Lua API.

Add misc.mwait(), var.create() and strings.encode_uri_component()
functions to VLC's Lua API.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=65983cfa4b73b6265379dd7a2d528ef1a86f7cbc
---

 modules/misc/lua/libs/misc.c      |    8 ++++++++
 modules/misc/lua/libs/strings.c   |   16 ++++++++++++++++
 modules/misc/lua/libs/variables.c |   35 +++++++++++++++++++++++++++++++++--
 modules/misc/lua/meta.c           |    3 +++
 share/lua/README.txt              |    6 ++++++
 share/lua/meta/README.txt         |    3 ++-
 6 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/modules/misc/lua/libs/misc.c b/modules/misc/lua/libs/misc.c
index 08804a1..8188957 100644
--- a/modules/misc/lua/libs/misc.c
+++ b/modules/misc/lua/libs/misc.c
@@ -197,6 +197,13 @@ static int vlclua_mdate( lua_State *L )
     return 1;
 }
 
+static int vlclua_mwait( lua_State *L )
+{
+    double f = luaL_checknumber( L, 1 );
+    mwait( (int64_t)f );
+    return 0;
+}
+
 static int vlclua_intf_should_die( lua_State *L )
 {
     intf_thread_t *p_intf = (intf_thread_t*)vlclua_get_this( L );
@@ -220,6 +227,7 @@ static const luaL_Reg vlclua_misc_reg[] = {
     { "datadir_list", vlclua_datadir_list },
 
     { "mdate", vlclua_mdate },
+    { "mwait", vlclua_mwait },
 
     { "lock_and_wait", vlclua_lock_and_wait },
     { "signal", vlclua_signal },
diff --git a/modules/misc/lua/libs/strings.c b/modules/misc/lua/libs/strings.c
index f1a1f3d..b9a56a4 100644
--- a/modules/misc/lua/libs/strings.c
+++ b/modules/misc/lua/libs/strings.c
@@ -66,6 +66,21 @@ static int vlclua_decode_uri( lua_State *L )
     return i_top;
 }
 
+static int vlclua_encode_uri_component( lua_State *L )
+{
+    int i_top = lua_gettop( L );
+    int i;
+    for( i = 1; i <= i_top; i++ )
+    {
+        const char *psz_cstring = luaL_checkstring( L, 1 );
+        char *psz_string = encode_URI_component( psz_cstring );
+        lua_remove( L,1 );
+        lua_pushstring( L, psz_string );
+        free( psz_string );
+    }
+    return i_top;
+}
+
 static int vlclua_resolve_xml_special_chars( lua_State *L )
 {
     int i_top = lua_gettop( L );
@@ -103,6 +118,7 @@ static int vlclua_convert_xml_special_chars( lua_State *L )
  *****************************************************************************/
 static const luaL_Reg vlclua_strings_reg[] = {
     { "decode_uri", vlclua_decode_uri },
+    { "encode_uri_component", vlclua_encode_uri_component },
     { "resolve_xml_special_chars", vlclua_resolve_xml_special_chars },
     { "convert_xml_special_chars", vlclua_convert_xml_special_chars },
     { NULL, NULL }
diff --git a/modules/misc/lua/libs/variables.c b/modules/misc/lua/libs/variables.c
index a0b1a6a..8b8d045 100644
--- a/modules/misc/lua/libs/variables.c
+++ b/modules/misc/lua/libs/variables.c
@@ -142,7 +142,8 @@ static int vlclua_var_get( lua_State *L )
     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 );
-    var_Get( *pp_obj, psz_var, &val );
+    if( var_Get( *pp_obj, psz_var, &val ) != VLC_SUCCESS )
+        return 0;
     lua_pop( L, 2 );
     return vlclua_pushvalue( L, i_type, val );
 }
@@ -161,6 +162,34 @@ static int vlclua_var_set( lua_State *L )
     return vlclua_push_ret( L, i_ret );
 }
 
+static int vlclua_var_create( lua_State *L )
+{
+    vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" );
+    const char *psz_var = luaL_checkstring( L, 2 );
+    int i_type;
+    switch( lua_type( L, 3 ) )
+    {
+        case LUA_TNUMBER:
+            i_type = VLC_VAR_FLOAT;
+            break;
+        case LUA_TBOOLEAN:
+            i_type = VLC_VAR_BOOL;
+            break;
+        case LUA_TSTRING:
+            i_type = VLC_VAR_STRING;
+            break;
+        default:
+            return 0;
+    }
+
+    int i_ret = var_Create( *pp_obj, psz_var, i_type );
+    if( i_ret != VLC_SUCCESS )
+        return vlclua_push_ret( L, i_ret );
+    vlc_value_t val;
+    vlclua_tovalue( L, i_type, &val );
+    return vlclua_push_ret( L, var_Set( *pp_obj, psz_var, val ) );
+}
+
 static int vlclua_var_get_list( lua_State *L )
 {
     vlc_value_t val;
@@ -207,7 +236,8 @@ static int vlclua_libvlc_command( lua_State *L )
     psz_cmd = luaL_checkstring( L, 1 );
     val_arg.psz_string = strdup( luaL_optstring( L, 2, "" ) );
     lua_pop( L, 2 );
-    if( !var_Type( p_this->p_libvlc, psz_cmd ) & VLC_VAR_ISCOMMAND )
+    int i_type = var_Type( p_this->p_libvlc, psz_cmd );
+    if( ! i_type & VLC_VAR_ISCOMMAND )
     {
         free( val_arg.psz_string );
         return luaL_error( L, "libvlc's \"%s\" is not a command",
@@ -492,6 +522,7 @@ static const luaL_Reg vlclua_var_reg[] = {
     { "get", vlclua_var_get },
     { "get_list", vlclua_var_get_list },
     { "set", vlclua_var_set },
+    { "create", vlclua_var_create },
     { "add_callback", vlclua_add_callback },
     { "del_callback", vlclua_del_callback },
     { "command", vlclua_command },
diff --git a/modules/misc/lua/meta.c b/modules/misc/lua/meta.c
index 3680789..80474c6 100644
--- a/modules/misc/lua/meta.c
+++ b/modules/misc/lua/meta.c
@@ -78,6 +78,9 @@ static lua_State * vlclua_meta_init( vlc_object_t *p_this, input_item_t * p_item
     luaopen_msg( L );
     luaopen_stream( L );
     luaopen_strings( L );
+    luaopen_variables( L );
+    luaopen_object( L );
+    luaopen_misc( L );
 
     lua_pushlightuserdata( L, p_this );
     lua_setfield( L, -2, "private" );
diff --git a/share/lua/README.txt b/share/lua/README.txt
index 57b26c9..37bdb27 100644
--- a/share/lua/README.txt
+++ b/share/lua/README.txt
@@ -98,6 +98,8 @@ misc.cachedir(): Get the user's VLC cache directory.
 misc.datadir_list( name ): FIXME: write description ... or ditch function if it isn't usefull anymore, we have datadir and userdatadir :)
 
 misc.mdate(): Get the current date (in miliseconds).
+misc.mdate(): Get the current date (in milliseconds).
+misc.mwait(): Wait for the given date (in milliseconds).
 
 misc.lock_and_wait(): Lock our object thread and wait for a wake up signal.
 misc.signal(): Wake up our object thread.
@@ -267,6 +269,8 @@ Strings
 -------
 strings.decode_uri( [uri1, [uri2, [...]]] ): Decode a list of URIs. This
   function returns as many variables as it had arguments.
+strings.encode_uri_component( [uri1, [uri2, [...]]] ): Encode a list of URI
+  components. This function returns as many variables as it had arguments.
 strings.resolve_xml_special_chars( [str1, [str2, [...]]] ): Resolve XML
   special characters in a list of strings. This function returns as many
   variables as it had arguments.
@@ -279,6 +283,8 @@ var.get( object, name ): Get the object's variable "name"'s value.
 var.set( object, name, value ): Set the object's variable "name" to "value".
 var.get_list( object, name ): Get the object's variable "name"'s value list.
   1st return value is the value list, 2nd return value is the text list.
+var.create( object, name, value ): Create and set the object's variable "name"
+  to "value". Created vars can be of type float, string or bool.
 
 var.add_callback( object, name, function, data ): Add a callback to the
   object's "name" variable. Callback functions take 4 arguments: the
diff --git a/share/lua/meta/README.txt b/share/lua/meta/README.txt
index e1e9c05..0d5d6fe 100644
--- a/share/lua/meta/README.txt
+++ b/share/lua/meta/README.txt
@@ -8,4 +8,5 @@ Examples: See googleimage.lua .
 VLC Lua meta modules should define one of the following functions:
  * fetch_art(): returns a path to an artwork for the given item
 
-Available VLC specific Lua modules: msg, stream and strings. See lua/README.txt
+Available VLC specific Lua modules: msg, stream, strings, variables,
+objects and misc. See lua/README.txt




More information about the vlc-devel mailing list