X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fbonjour.c;h=e118ab260c9024b04deeb85f205abf6976c2b97c;hb=54452fcda2370a3907786ae5e7cdabac1d278597;hp=2c896117a1ba1e8ddcab456c63a2a07312634fd2;hpb=99fab9089e9e1709d9c3a4bc5ced0c137ac59134;p=vlc diff --git a/modules/services_discovery/bonjour.c b/modules/services_discovery/bonjour.c index 2c896117a1..e118ab260c 100644 --- a/modules/services_discovery/bonjour.c +++ b/modules/services_discovery/bonjour.c @@ -1,7 +1,7 @@ /***************************************************************************** * bonjour.c: Bonjour services discovery module ***************************************************************************** - * Copyright (C) 2005 the VideoLAN team + * Copyright (C) 2005-2009 the VideoLAN team * $Id$ * * Authors: Jon Lech Johansen @@ -29,16 +29,14 @@ # include "config.h" #endif -#include -#include -#include +#include +#include +#include #include -#ifdef HAVE_AVAHI_06 -# include -# include -#endif -#include +#include +#include +#include #include #include @@ -50,14 +48,18 @@ static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); -vlc_module_begin(); - set_shortname( "Bonjour" ); - set_description( _("Bonjour services") ); - set_category( CAT_PLAYLIST ); - set_subcategory( SUBCAT_PLAYLIST_SD ); - set_capability( "services_discovery", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); +VLC_SD_PROBE_HELPER("bonjour", "Bonjour services", SD_CAT_LAN) + +vlc_module_begin () + set_shortname( "Bonjour" ) + set_description( N_("Bonjour services") ) + set_category( CAT_PLAYLIST ) + set_subcategory( SUBCAT_PLAYLIST_SD ) + set_capability( "services_discovery", 0 ) + set_callbacks( Open, Close ) + + VLC_SD_PROBE_SUBMODULE +vlc_module_end () /***************************************************************************** * Local structures @@ -65,7 +67,7 @@ vlc_module_end(); struct services_discovery_sys_t { - AvahiSimplePoll *simple_poll; + AvahiThreadedPoll *poll; AvahiClient *client; AvahiServiceBrowser *sb; vlc_dictionary_t services_name_to_input_item; @@ -75,9 +77,6 @@ struct services_discovery_sys_t * Local prototypes *****************************************************************************/ -/* Main functions */ - static void Run ( services_discovery_t *p_intf ); - /***************************************************************************** * client_callback *****************************************************************************/ @@ -87,15 +86,11 @@ static void client_callback( AvahiClient *c, AvahiClientState state, services_discovery_t *p_sd = ( services_discovery_t* )userdata; services_discovery_sys_t *p_sys = p_sd->p_sys; -#ifdef HAVE_AVAHI_06 if( state == AVAHI_CLIENT_FAILURE && (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) ) -#else - if( state == AVAHI_CLIENT_DISCONNECTED ) -#endif { msg_Err( p_sd, "avahi client disconnected" ); - avahi_simple_poll_quit( p_sys->simple_poll ); + avahi_threaded_poll_quit( p_sys->poll ); } } @@ -114,19 +109,16 @@ static void resolve_callback( const AvahiAddress *address, uint16_t port, AvahiStringList *txt, -#ifdef HAVE_AVAHI_06 AvahiLookupResultFlags flags, -#endif void* userdata ) { 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); + VLC_UNUSED(flags); -#ifdef HAVE_AVAHI_06 if( event == AVAHI_RESOLVER_FAILURE ) -#else - if( event == AVAHI_RESOLVER_TIMEOUT ) -#endif { msg_Err( p_sd, "failed to resolve service '%s' of type '%s' in domain '%s'", @@ -180,13 +172,12 @@ static void resolve_callback( } } - if( psz_addr != NULL ) - free( (void *)psz_addr ); + free( psz_addr ); if( psz_uri != NULL ) { - p_input = input_ItemNewExt( p_sd, psz_uri, name, 0, NULL, -1 ); - free( (void *)psz_uri ); + p_input = input_item_New( psz_uri, name ); + free( psz_uri ); } if( p_input != NULL ) { @@ -211,20 +202,18 @@ static void browse_callback( const char *name, const char *type, const char *domain, -#ifdef HAVE_AVAHI_06 AvahiLookupResultFlags flags, -#endif void* userdata ) { + VLC_UNUSED(b); + VLC_UNUSED(flags); 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, name, type, domain, AVAHI_PROTO_UNSPEC, -#ifdef HAVE_AVAHI_06 0, -#endif resolve_callback, userdata ) == NULL ) { msg_Err( p_sd, "failed to resolve service '%s': %s", name, @@ -245,7 +234,7 @@ static void browse_callback( services_discovery_RemoveItem( p_sd, p_item ); vlc_dictionary_remove_value_for_key( &p_sys->services_name_to_input_item, - name ); + name, NULL, NULL ); } } } @@ -259,30 +248,21 @@ static int Open( vlc_object_t *p_this ) services_discovery_sys_t *p_sys; 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; - } - - memset( p_sys, 0, sizeof(*p_sys) ); + p_sd->p_sys = p_sys = calloc( 1, sizeof( services_discovery_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; 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 ) + p_sys->poll = avahi_threaded_poll_new(); + if( p_sys->poll == NULL ) { - msg_Err( p_sd, "failed to create avahi simple poll" ); + msg_Err( p_sd, "failed to create Avahi threaded poll" ); goto error; } - p_sys->client = avahi_client_new( avahi_simple_poll_get(p_sys->simple_poll), -#ifdef HAVE_AVAHI_06 - 0, -#endif - client_callback, p_sd, &err ); + p_sys->client = avahi_client_new( avahi_threaded_poll_get(p_sys->poll), + 0, client_callback, p_sd, &err ); if( p_sys->client == NULL ) { msg_Err( p_sd, "failed to create avahi client: %s", @@ -293,20 +273,13 @@ static int Open( vlc_object_t *p_this ) p_sys->sb = avahi_service_browser_new( p_sys->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_vlc-http._tcp", NULL, -#ifdef HAVE_AVAHI_06 - 0, -#endif - browse_callback, p_sd ); + 0, browse_callback, p_sd ); if( p_sys->sb == NULL ) { msg_Err( p_sd, "failed to create avahi service browser" ); goto error; } - services_discovery_SetLocalizedName( p_sd, _("Bonjour") ); - - p_sd->pf_run = Run; - return VLC_SUCCESS; error: @@ -314,10 +287,10 @@ error: avahi_service_browser_free( p_sys->sb ); if( p_sys->client != NULL ) avahi_client_free( p_sys->client ); - if( p_sys->simple_poll != NULL ) - avahi_simple_poll_free( p_sys->simple_poll ); + if( p_sys->poll != NULL ) + avahi_threaded_poll_free( p_sys->poll ); - vlc_dictionary_clear( &p_sys->services_name_to_input_item ); + vlc_dictionary_clear( &p_sys->services_name_to_input_item, NULL, NULL ); free( p_sys ); return VLC_EGENERIC; @@ -333,25 +306,8 @@ static void Close( vlc_object_t *p_this ) avahi_service_browser_free( p_sys->sb ); avahi_client_free( p_sys->client ); - avahi_simple_poll_free( p_sys->simple_poll ); + avahi_threaded_poll_free( p_sys->poll ); - vlc_dictionary_clear( &p_sys->services_name_to_input_item ); + vlc_dictionary_clear( &p_sys->services_name_to_input_item, NULL, NULL ); free( p_sys ); } - -/***************************************************************************** - * Run: main thread - *****************************************************************************/ -static void Run( services_discovery_t *p_sd ) -{ - services_discovery_sys_t *p_sys = p_sd->p_sys; - - while( !p_sd->b_die ) - { - if( avahi_simple_poll_iterate( p_sys->simple_poll, 100 ) != 0 ) - { - msg_Err( p_sd, "poll iterate failed" ); - break; - } - } -}