]> git.sesse.net Git - vlc/blobdiff - src/playlist/services_discovery.c
playlist: allow non-recursive search
[vlc] / src / playlist / services_discovery.c
index 571160678bd0cd0f45a6043ebd137980edfeb011..88c03611ff0847187a9381ebf0e9636cc3e61b9b 100644 (file)
@@ -37,12 +37,13 @@ typedef struct
 {
     char *name;
     char *longname;
+    int category;
 } vlc_sd_probe_t;
 
 int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
-                      const char *longname)
+                      const char *longname, int category)
 {
-    vlc_sd_probe_t names = { strdup(name), strdup(longname) };
+    vlc_sd_probe_t names = { strdup(name), strdup(longname), category };
 
     if (unlikely (names.name == NULL || names.longname == NULL
                || vlc_probe_add (probe, &names, sizeof (names))))
@@ -59,7 +60,7 @@ int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
 /**
  * Gets the list of available services discovery plugins.
  */
-char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames)
+char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames, int **pp_categories)
 {
     size_t count;
     vlc_sd_probe_t *tab = vlc_probe (obj, "services probe", &count);
@@ -72,17 +73,22 @@ char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames)
 
     char **names = malloc (sizeof(char *) * (count + 1));
     char **longnames = malloc (sizeof(char *) * (count + 1));
+    int *categories = malloc(sizeof(int) * (count + 1));
 
-    if (unlikely (names == NULL || longnames == NULL))
+    if (unlikely (names == NULL || longnames == NULL || categories == NULL))
         abort();
     for( size_t i = 0; i < count; i++ )
     {
         names[i] = tab[i].name;
         longnames[i] = tab[i].longname;
+        categories[i] = tab[i].category;
     }
     free (tab);
     names[count] = longnames[count] = NULL;
+    categories[count] = 0;
     *pppsz_longnames = longnames;
+    if( pp_categories ) *pp_categories = categories;
+    else free( categories );
     return names;
 }
 
@@ -148,14 +154,14 @@ bool vlc_sd_Start ( services_discovery_t * p_sd )
         msg_Err( p_sd, "no suitable services discovery module" );
         return false;
     }
-        
+
     vlc_event_t event = {
         .type = vlc_ServicesDiscoveryStarted
     };
     vlc_event_send( &p_sd->event_manager, &event );
     return true;
 }
-                          
+
 /***********************************************************************
  * Stop
  ***********************************************************************/
@@ -164,7 +170,7 @@ void vlc_sd_Stop ( services_discovery_t * p_sd )
     vlc_event_t event = {
         .type = vlc_ServicesDiscoveryEnded
     };
-    
+
     vlc_event_send( &p_sd->event_manager, &event );
 
     module_unneed( p_sd, p_sd->p_module );
@@ -291,30 +297,36 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,
     if( !p_sd )
         return VLC_ENOMEM;
 
-    module_t *m = module_find_by_shortcut( psz_name );
-    if( !m )
-    {
-        msg_Err( p_playlist, "No such module: %s", psz_name );
-        vlc_sd_Destroy( p_sd );
-        return VLC_EGENERIC;
-    }
-
     /* Free in playlist_ServicesDiscoveryRemove */
     vlc_sd_internal_t * p_sds = malloc( sizeof(*p_sds) );
     if( !p_sds )
     {
         vlc_sd_Destroy( p_sd );
-        module_release( m );
         return VLC_ENOMEM;
     }
 
     playlist_item_t *p_node;
 
+    /* Look for configuration chain "longname" */
+    const char *psz_longname = "?";
+    if( p_sd->p_cfg )
+    {
+        config_chain_t *cfg = p_sd->p_cfg;
+        while( cfg )
+        {
+            if( cfg->psz_name && !strcmp( cfg->psz_name, "longname" ) )
+            {
+                psz_longname = cfg->psz_value;
+                break;
+            }
+            cfg = cfg->p_next;
+        }
+    }
+
     PL_LOCK;
-    p_node = playlist_NodeCreate( p_playlist, module_get_name( m, true ),
+    p_node = playlist_NodeCreate( p_playlist, psz_longname,
                                   p_playlist->p_root, 0, NULL );
     PL_UNLOCK;
-    module_release( m );
 
     vlc_event_attach( services_discovery_EventManager( p_sd ),
                       vlc_ServicesDiscoveryItemAdded,