X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fbonjour.c;h=f30c0e2f2543e6408a49c4c7cc7ef7d839791121;hb=a5c83dda798f93cc7a76bbb50d89352117e6ec46;hp=d7647a741b89f4f9b1c0de1dd008d99f446e2738;hpb=19f542a35b43fadc821547fea49f7cbd90ad0b69;p=vlc diff --git a/modules/services_discovery/bonjour.c b/modules/services_discovery/bonjour.c index d7647a741b..f30c0e2f25 100644 --- a/modules/services_discovery/bonjour.c +++ b/modules/services_discovery/bonjour.c @@ -24,11 +24,15 @@ /***************************************************************************** * Includes *****************************************************************************/ -#define _GNU_SOURCE -#include /* malloc(), free() */ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include #include #ifdef HAVE_AVAHI_06 @@ -49,7 +53,7 @@ vlc_module_begin(); set_shortname( "Bonjour" ); - set_description( _("Bonjour services") ); + set_description( N_("Bonjour services") ); set_category( CAT_PLAYLIST ); set_subcategory( SUBCAT_PLAYLIST_SD ); set_capability( "services_discovery", 0 ); @@ -62,13 +66,10 @@ vlc_module_end(); struct services_discovery_sys_t { - /* playlist node */ - playlist_item_t *p_node_cat, *p_node_one; - playlist_t *p_playlist; - AvahiSimplePoll *simple_poll; AvahiClient *client; AvahiServiceBrowser *sb; + vlc_dictionary_t services_name_to_input_item; }; /***************************************************************************** @@ -121,6 +122,11 @@ static void resolve_callback( { services_discovery_t *p_sd = ( services_discovery_t* )userdata; services_discovery_sys_t *p_sys = p_sd->p_sys; + + VLC_UNUSED(interface); VLC_UNUSED(host_name); +#ifdef HAVE_AVAHI_06 + VLC_UNUSED(flags); +#endif #ifdef HAVE_AVAHI_06 if( event == AVAHI_RESOLVER_FAILURE ) @@ -145,7 +151,8 @@ static void resolve_callback( avahi_address_snprint(a, (sizeof(a)/sizeof(a[0]))-1, address); if( protocol == AVAHI_PROTO_INET6 ) - asprintf( &psz_addr, "[%s]", a ); + if( asprintf( &psz_addr, "[%s]", a ) == -1 ) + return; if( txt != NULL ) asl = avahi_string_list_find( txt, "path" ); @@ -157,8 +164,12 @@ static void resolve_callback( if( avahi_string_list_get_pair( asl, &key, &value, &size ) == 0 && value != NULL ) { - asprintf( &psz_uri, "http://%s:%d%s", - psz_addr != NULL ? psz_addr : a, port, value ); + if( asprintf( &psz_uri, "http://%s:%d%s", + psz_addr != NULL ? psz_addr : a, port, value ) == -1 ) + { + free( psz_addr ); + return; + } } if( key != NULL ) avahi_free( (void *)key ); @@ -167,8 +178,12 @@ static void resolve_callback( } else { - asprintf( &psz_uri, "http://%s:%d", - psz_addr != NULL ? psz_addr : a, port ); + if( asprintf( &psz_uri, "http://%s:%d", + psz_addr != NULL ? psz_addr : a, port ) == -1 ) + { + free( psz_addr ); + return; + } } if( psz_addr != NULL ) @@ -181,17 +196,10 @@ static void resolve_callback( } if( p_input != NULL ) { - playlist_item_t *p_item; - p_item = playlist_NodeAddInput( p_sys->p_playlist, p_input, - p_sys->p_node_cat, - PLAYLIST_APPEND, PLAYLIST_END ); - p_item->i_flags &= ~PLAYLIST_SKIP_FLAG; - p_item->i_flags &= ~PLAYLIST_SAVE_FLAG; - p_item = playlist_NodeAddInput( p_sys->p_playlist, p_input, - p_sys->p_node_one, - PLAYLIST_APPEND, PLAYLIST_END ); - p_item->i_flags &= ~PLAYLIST_SKIP_FLAG; - p_item->i_flags &= ~PLAYLIST_SAVE_FLAG; + vlc_dictionary_insert( &p_sys->services_name_to_input_item, + name, p_input ); + services_discovery_AddItem( p_sd, p_input, NULL /* no category */ ); + vlc_gc_decref( p_input ); } } @@ -214,9 +222,12 @@ static void browse_callback( #endif void* userdata ) { + VLC_UNUSED(b); +#ifdef HAVE_AVAHI_06 + VLC_UNUSED(flags); +#endif services_discovery_t *p_sd = ( services_discovery_t* )userdata; services_discovery_sys_t *p_sys = p_sd->p_sys; - if( event == AVAHI_BROWSER_NEW ) { if( avahi_service_resolver_new( p_sys->client, interface, protocol, @@ -230,17 +241,21 @@ static void browse_callback( avahi_strerror( avahi_client_errno( p_sys->client ) ) ); } } - else + else if( name ) { /** \todo Store the input id and search it, rather than searching the items */ - playlist_item_t *p_item; - p_item = playlist_ChildSearchName( p_sys->p_node_cat, name ); - if( p_item == NULL ) + input_item_t *p_item; + p_item = vlc_dictionary_value_for_key( + &p_sys->services_name_to_input_item, + name ); + if( !p_item ) msg_Err( p_sd, "failed to find service '%s' in playlist", name ); else { - playlist_LockDeleteAllFromInput( p_sys->p_playlist, - p_item->p_input->i_id ); + services_discovery_RemoveItem( p_sd, p_item ); + vlc_dictionary_remove_value_for_key( + &p_sys->services_name_to_input_item, + name ); } } } @@ -252,20 +267,18 @@ static int Open( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_sys_t *p_sys; - playlist_view_t *p_view; - vlc_value_t val; int err; p_sd->p_sys = p_sys = (services_discovery_sys_t *)malloc( sizeof( services_discovery_sys_t ) ); - if( p_sd->p_sys == NULL ) - { - msg_Err( p_sd, "out of memory" ); - return VLC_EGENERIC; - } + + if( !p_sys ) + return VLC_ENOMEM; memset( p_sys, 0, sizeof(*p_sys) ); + vlc_dictionary_init( &p_sys->services_name_to_input_item, 1 ); + p_sys->simple_poll = avahi_simple_poll_new(); if( p_sys->simple_poll == NULL ) { @@ -298,26 +311,13 @@ static int Open( vlc_object_t *p_this ) goto error; } - /* Create our playlist node */ - p_sys->p_playlist = (playlist_t *)vlc_object_find( p_sd, - VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( !p_sys->p_playlist ) - { - msg_Warn( p_sd, "unable to find playlist, cancelling"); - goto error; - } + services_discovery_SetLocalizedName( p_sd, _("Bonjour") ); - playlist_NodesCreate( p_sys->p_playlist, _("Bonjour"), - &p_sys->p_node_cat,&p_sys->p_node_one, - VLC_TRUE ); p_sd->pf_run = Run; return VLC_SUCCESS; error: - if( p_sys->p_playlist != NULL ) - vlc_object_release( p_sys->p_playlist ); if( p_sys->sb != NULL ) avahi_service_browser_free( p_sys->sb ); if( p_sys->client != NULL ) @@ -325,7 +325,8 @@ error: if( p_sys->simple_poll != NULL ) avahi_simple_poll_free( p_sys->simple_poll ); - free( (void *)p_sys ); + vlc_dictionary_clear( &p_sys->services_name_to_input_item ); + free( p_sys ); return VLC_EGENERIC; } @@ -342,10 +343,7 @@ static void Close( vlc_object_t *p_this ) avahi_client_free( p_sys->client ); avahi_simple_poll_free( p_sys->simple_poll ); - playlist_NodeDelete( p_sys->p_playlist, p_sys->p_node_one, VLC_TRUE, VLC_TRUE ); - playlist_NodeDelete( p_sys->p_playlist, p_sys->p_node_cat, VLC_TRUE, VLC_TRUE ); - vlc_object_release( p_sys->p_playlist ); - + vlc_dictionary_clear( &p_sys->services_name_to_input_item ); free( p_sys ); } @@ -356,7 +354,7 @@ static void Run( services_discovery_t *p_sd ) { services_discovery_sys_t *p_sys = p_sd->p_sys; - while( !p_sd->b_die ) + while( vlc_object_alive (p_sd) ) { if( avahi_simple_poll_iterate( p_sys->simple_poll, 100 ) != 0 ) {