]> git.sesse.net Git - vlc/blobdiff - src/playlist/services_discovery.c
services_discovery: implement SD categories and use in Qt interface
[vlc] / src / playlist / services_discovery.c
index eb35edb4725592d6923bdf37178057d5731191c0..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;
 }
 
@@ -291,27 +297,18 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,
     if( !p_sd )
         return VLC_ENOMEM;
 
-    module_t *m = module_find_by_shortcut( p_sd->psz_name );
-    if( !m )
-    {
-        msg_Err( p_playlist, "No such module: %s", p_sd->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 = NULL;
+    const char *psz_longname = "?";
     if( p_sd->p_cfg )
     {
         config_chain_t *cfg = p_sd->p_cfg;
@@ -326,17 +323,10 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,
         }
     }
 
-    /* Fallback on module's long name if not found */
-    if( !psz_longname )
-    {
-        psz_longname = module_get_name( m, true );
-    }
-
     PL_LOCK;
     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,