[vlc-devel] [PATCH] sd: allow passing longname in separate argument

Pierre Ynard linkfanel at yahoo.fr
Tue Nov 15 02:13:35 CET 2016


I'm not sure why it was done that way in the first place, but passing
the longname from the probe into the config chain so it gets passed back
along to the core and parsed back there, sounds like a very convulated
way of essentially passing two separate arguments. It introduces many
complications and just doesn't work correctly when loading SD from the
-S config option or the CLI. Interfaces have the longname from probing
and can pass it correctly with this, so this is the first step to get
rid of this backwards mechanism.


diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h
index 8ed337c..c2ee5bd 100644
--- a/include/vlc_playlist.h
+++ b/include/vlc_playlist.h
@@ -324,7 +324,7 @@ VLC_API int playlist_Import( playlist_t *p_playlist, const char *psz_file );
 /********************** Services discovery ***********************/
 
 /** Add a service discovery module */
-VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *);
+VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *, const char *);
 /** Remove a services discovery module by name */
 VLC_API int playlist_ServicesDiscoveryRemove(playlist_t *, const char *);
 /** Check whether a given SD is loaded */
diff --git a/modules/gui/macosx/VLCMainWindow.m b/modules/gui/macosx/VLCMainWindow.m
index ceebbe7..d8bfd3a 100644
--- a/modules/gui/macosx/VLCMainWindow.m
+++ b/modules/gui/macosx/VLCMainWindow.m
@@ -1110,7 +1110,7 @@ static const float f_min_window_height = 307.;
         BOOL sd_loaded = playlist_IsServicesDiscoveryLoaded(p_playlist, [identifier UTF8String]);
 
         if (!sd_loaded)
-            playlist_ServicesDiscoveryAdd(p_playlist, [identifier UTF8String]);
+            playlist_ServicesDiscoveryAdd(p_playlist, [identifier UTF8String], NULL);
         else
             playlist_ServicesDiscoveryRemove(p_playlist, [identifier UTF8String]);
     }
@@ -1138,7 +1138,7 @@ static const float f_min_window_height = 307.;
     if ([item sdtype] > -1 && [[item identifier] length] > 0) {
         BOOL sd_loaded = playlist_IsServicesDiscoveryLoaded(p_playlist, [[item identifier] UTF8String]);
         if (!sd_loaded)
-            playlist_ServicesDiscoveryAdd(p_playlist, [[item identifier] UTF8String]);
+            playlist_ServicesDiscoveryAdd(p_playlist, [[item identifier] UTF8String], NULL);
     }
 
     [_categoryLabel setStringValue:[item title]];
diff --git a/modules/gui/qt/components/playlist/selector.cpp b/modules/gui/qt/components/playlist/selector.cpp
index 2761903..5c09da8 100644
--- a/modules/gui/qt/components/playlist/selector.cpp
+++ b/modules/gui/qt/components/playlist/selector.cpp
@@ -365,7 +365,7 @@ void PLSelector::setSource( QTreeWidgetItem *item )
         sd_loaded = playlist_IsServicesDiscoveryLoaded( THEPL, qtu( qs ) );
         if( !sd_loaded )
         {
-            if ( playlist_ServicesDiscoveryAdd( THEPL, qtu( qs ) ) != VLC_SUCCESS )
+            if ( playlist_ServicesDiscoveryAdd( THEPL, qtu( qs ), NULL ) != VLC_SUCCESS )
                 return ;
 
             services_discovery_descriptor_t *p_test = new services_discovery_descriptor_t;
diff --git a/modules/gui/qt/dialogs_provider.cpp b/modules/gui/qt/dialogs_provider.cpp
index 5951b65..55e91a2 100644
--- a/modules/gui/qt/dialogs_provider.cpp
+++ b/modules/gui/qt/dialogs_provider.cpp
@@ -825,7 +825,7 @@ void DialogsProvider::menuUpdateAction( QObject *data )
 void DialogsProvider::SDMenuAction( const QString& data )
 {
     if( !playlist_IsServicesDiscoveryLoaded( THEPL, qtu( data ) ) )
-        playlist_ServicesDiscoveryAdd( THEPL, qtu( data ) );
+        playlist_ServicesDiscoveryAdd( THEPL, qtu( data ), NULL );
     else
         playlist_ServicesDiscoveryRemove( THEPL, qtu( data ) );
 }
diff --git a/modules/lua/libs/sd.c b/modules/lua/libs/sd.c
index 65c36c6..777fffe 100644
--- a/modules/lua/libs/sd.c
+++ b/modules/lua/libs/sd.c
@@ -152,7 +152,7 @@ static int vlclua_sd_add( lua_State *L )
 {
     const char *psz_sd = luaL_checkstring( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
-    int i_ret = playlist_ServicesDiscoveryAdd( p_playlist, psz_sd );
+    int i_ret = playlist_ServicesDiscoveryAdd( p_playlist, psz_sd, NULL );
     return vlclua_push_ret( L, i_ret );
 }
 
diff --git a/src/playlist/engine.c b/src/playlist/engine.c
index 1f29ee4..41443f5 100644
--- a/src/playlist/engine.c
+++ b/src/playlist/engine.c
@@ -289,7 +289,7 @@ playlist_t *playlist_Create( vlc_object_t *p_parent )
     {
         char *s = mods, *m;
         while( (m = strsep( &s, " :," )) != NULL )
-            playlist_ServicesDiscoveryAdd( p_playlist, m );
+            playlist_ServicesDiscoveryAdd( p_playlist, m, NULL );
         free( mods );
     }
 
diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c
index 0efdabe..3d9ab81 100644
--- a/src/playlist/services_discovery.c
+++ b/src/playlist/services_discovery.c
@@ -222,27 +222,33 @@ static void playlist_sd_item_removed(services_discovery_t *sd,
     PL_UNLOCK;
 }
 
-int playlist_ServicesDiscoveryAdd(playlist_t *playlist, const char *chain)
+int playlist_ServicesDiscoveryAdd(playlist_t *playlist, const char *chain,
+                                  const char *longname)
 {
     vlc_sd_internal_t *sds = malloc(sizeof (*sds) + strlen(chain) + 1);
     if (unlikely(sds == NULL))
         return VLC_ENOMEM;
 
-    /* Look for configuration chain "longname" */
-    const char *longname = "?";
-    config_chain_t *cfg;
-    char *name;
-
-    free(config_ChainCreate(&name, &cfg, chain));
-    msg_Dbg(playlist, "adding services_discovery %s...", name);
+    config_chain_t *cfg = NULL;
+    if (longname == NULL)
+    {
+        longname = "?";
+
+        /* Look for configuration chain "longname" */
+        char *name;
+        free(config_ChainCreate(&name, &cfg, chain));
+        free(name);
+
+        for (config_chain_t *p = cfg; p != NULL; p = p->p_next)
+            if (p->psz_name != NULL && !strcmp(p->psz_name, "longname"))
+            {
+                if (p->psz_value != NULL)
+                    longname = p->psz_value;
+                break;
+            }
+    }
 
-    for (config_chain_t *p = cfg; p != NULL; p = p->p_next)
-        if (p->psz_name != NULL && !strcmp(p->psz_name, "longname"))
-        {
-            if (p->psz_value != NULL)
-                longname = p->psz_value;
-            break;
-        }
+    msg_Dbg(playlist, "adding services_discovery %s '%s'...", chain, longname);
 
     playlist_Lock(playlist);
     sds->node = playlist_NodeCreate(playlist, longname, playlist->p_root,
@@ -251,7 +257,6 @@ int playlist_ServicesDiscoveryAdd(playlist_t *playlist, const char *chain)
     playlist_Unlock(playlist);
 
     config_ChainDestroy(cfg);
-    free(name);
 
     if (unlikely(sds->node == NULL))
     {


-- 
Pierre Ynard
"Une âme dans un corps, c'est comme un dessin sur une feuille de papier."


More information about the vlc-devel mailing list