[vlc-devel] [PATCH 4/5] lua: sd: factor common input item node creation code
RĂ©mi Denis-Courmont
remi at remlab.net
Wed May 10 20:46:07 CEST 2017
---
modules/lua/libs/sd.c | 169 +++++++++++++++++++++-----------------------------
1 file changed, 72 insertions(+), 97 deletions(-)
diff --git a/modules/lua/libs/sd.c b/modules/lua/libs/sd.c
index 86ac9da49b..d7aea6c460 100644
--- a/modules/lua/libs/sd.c
+++ b/modules/lua/libs/sd.c
@@ -127,7 +127,7 @@ static input_item_t *vlclua_sd_create_item( services_discovery_t *p_sd,
lua_getfield( L, -1, "path" );
if( !lua_isstring( L, -1 ) )
{
- msg_Err( p_sd, "Error: \"path\" parameter is required" );
+ msg_Err( p_sd, "Error: \"%s\" parameter is required", "path" );
return NULL;
}
@@ -230,55 +230,68 @@ static int vlclua_node_add_subitem( lua_State *L )
static const luaL_Reg vlclua_node_reg[];
+static input_item_t *vlclua_sd_create_node( services_discovery_t *p_sd,
+ lua_State *L )
+{
+ if( !lua_istable( L, -1 ) )
+ {
+ msg_Err( p_sd, "Error: argument must be table" );
+ return NULL;
+ }
+
+ lua_getfield( L, -1, "title" );
+ if( !lua_isstring( L, -1 ) )
+ {
+ msg_Err( p_sd, "Error: \"%s\" parameter is required", "title" );
+ return NULL;
+ }
+
+ const char *psz_name = lua_tostring( L, -1 );
+ input_item_t *p_input = input_item_NewExt( "vlc://nop", psz_name, -1,
+ ITEM_TYPE_NODE,
+ ITEM_NET_UNKNOWN );
+ lua_pop( L, 1 );
+
+ if( unlikely(p_input == NULL) )
+ return NULL;
+
+ lua_getfield( L, -1, "arturl" );
+ if( lua_isstring( L, -1 ) && strcmp( lua_tostring( L, -1 ), "" ) )
+ {
+ char *psz_value = strdup( lua_tostring( L, -1 ) );
+ EnsureUTF8( psz_value );
+ msg_Dbg( p_sd, "ArtURL: %s", psz_value );
+ /* TODO: ask for art download if not local file */
+ input_item_SetArtURL( p_input, psz_value );
+ free( psz_value );
+ }
+ lua_pop( L, 1 );
+
+ input_item_t **udata = lua_newuserdata( L, sizeof( input_item_t * ) );
+ *udata = p_input;
+ if( luaL_newmetatable( L, "node" ) )
+ {
+ lua_newtable( L );
+ luaL_register( L, NULL, vlclua_node_reg );
+ lua_setfield( L, -2, "__index" );
+ }
+ lua_setmetatable( L, -2 );
+
+ return p_input;
+}
+
static int vlclua_node_add_subnode( lua_State *L )
{
services_discovery_t *p_sd = (services_discovery_t *)vlclua_get_this( L );
+
input_item_t **pp_node = (input_item_t **)luaL_checkudata( L, 1, "node" );
- if( *pp_node )
- {
- if( lua_istable( L, -1 ) )
- {
- lua_getfield( L, -1, "title" );
- if( lua_isstring( L, -1 ) )
- {
- const char *psz_name = lua_tostring( L, -1 );
- input_item_t *p_input = input_item_NewExt( "vlc://nop",
- psz_name, -1,
- ITEM_TYPE_NODE, ITEM_NET_UNKNOWN );
- lua_pop( L, 1 );
-
- if( p_input )
- {
- lua_getfield( L, -1, "arturl" );
- if( lua_isstring( L, -1 ) && strcmp( lua_tostring( L, -1 ), "" ) )
- {
- char *psz_value = strdup( lua_tostring( L, -1 ) );
- EnsureUTF8( psz_value );
- msg_Dbg( p_sd, "ArtURL: %s", psz_value );
- input_item_SetArtURL( p_input, psz_value );
- free( psz_value );
- }
-
- input_item_t **udata = (input_item_t **)
- lua_newuserdata( L, sizeof( input_item_t * ) );
- *udata = p_input;
- if( luaL_newmetatable( L, "node" ) )
- {
- lua_newtable( L );
- luaL_register( L, NULL, vlclua_node_reg );
- lua_setfield( L, -2, "__index" );
- }
- lua_setmetatable( L, -2 );
-
- input_item_PostSubItem( *pp_node, p_input );
- }
- }
- else
- msg_Err( p_sd, "node:add_node: the \"title\" parameter can't be empty" );
- }
- else
- msg_Err( p_sd, "Error parsing add_node arguments" );
- }
+ if( *pp_node == NULL )
+ return 1;
+
+ input_item_t *p_input = vlclua_sd_create_node( p_sd, L );
+ if( p_input != NULL )
+ input_item_PostSubItem( *pp_node, p_input );
+
return 1;
}
@@ -291,11 +304,9 @@ static const luaL_Reg vlclua_node_reg[] = {
/*** Services discovery instance ***/
-static int vlclua_sd_add_item( lua_State *L )
+static int vlclua_sd_add_common( services_discovery_t *p_sd, lua_State *L,
+ input_item_t *p_input )
{
- services_discovery_t *p_sd = (services_discovery_t *)vlclua_get_this( L );
-
- input_item_t *p_input = vlclua_sd_create_item( p_sd, L );
if( p_input == NULL )
return 1;
@@ -310,56 +321,20 @@ static int vlclua_sd_add_item( lua_State *L )
return 1;
}
+static int vlclua_sd_add_item( lua_State *L )
+{
+ services_discovery_t *p_sd = (services_discovery_t *)vlclua_get_this( L );
+ input_item_t *p_input = vlclua_sd_create_item( p_sd, L );
+
+ return vlclua_sd_add_common( p_sd, L, p_input );
+}
+
static int vlclua_sd_add_node( lua_State *L )
{
services_discovery_t *p_sd = (services_discovery_t *)vlclua_get_this( L );
- if( lua_istable( L, -1 ) )
- {
- lua_getfield( L, -1, "title" );
- if( lua_isstring( L, -1 ) )
- {
- const char *psz_name = lua_tostring( L, -1 );
- input_item_t *p_input = input_item_NewExt( "vlc://nop",
- psz_name, -1,
- ITEM_TYPE_NODE, ITEM_NET_UNKNOWN );
- lua_pop( L, 1 );
-
- if( p_input )
- {
- lua_getfield( L, -1, "arturl" );
- if( lua_isstring( L, -1 ) && strcmp( lua_tostring( L, -1 ), "" ) )
- {
- char *psz_value = strdup( lua_tostring( L, -1 ) );
- EnsureUTF8( psz_value );
- msg_Dbg( p_sd, "ArtURL: %s", psz_value );
- /** @todo Ask for art download if not local file */
- input_item_SetArtURL( p_input, psz_value );
- free( psz_value );
- }
- lua_pop( L, 1 );
- lua_getfield( L, -1, "category" );
- if( lua_isstring( L, -1 ) )
- services_discovery_AddItem( p_sd, p_input, luaL_checkstring( L, -1 ) );
- else
- services_discovery_AddItem( p_sd, p_input, NULL );
- input_item_t **udata = (input_item_t **)
- lua_newuserdata( L, sizeof( input_item_t * ) );
- *udata = p_input;
- if( luaL_newmetatable( L, "node" ) )
- {
- lua_newtable( L );
- luaL_register( L, NULL, vlclua_node_reg );
- lua_setfield( L, -2, "__index" );
- }
- lua_setmetatable( L, -2 );
- }
- }
- else
- msg_Err( p_sd, "vlc.sd.add_node: the \"title\" parameter can't be empty" );
- }
- else
- msg_Err( p_sd, "Error parsing add_node arguments" );
- return 1;
+ input_item_t *p_input = vlclua_sd_create_node( p_sd, L );
+
+ return vlclua_sd_add_common( p_sd, L, p_input );
}
static int vlclua_sd_remove_item( lua_State *L )
--
2.11.0
More information about the vlc-devel
mailing list