X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fservices_discovery.c;h=88c03611ff0847187a9381ebf0e9636cc3e61b9b;hb=c3d342a2d5bd2d2534f8a34be9de7a1557b60ea9;hp=571160678bd0cd0f45a6043ebd137980edfeb011;hpb=6e160dae0fe92597775f55dff05937dae709ab04;p=vlc diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index 571160678b..88c03611ff 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -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,