*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h>
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include "bonjour.h"
#ifdef HAVE_AVAHI_CLIENT
-#include <vlc/intf.h>
-#include <vlc/sout.h>
+#include <vlc_sout.h>
#include <avahi-client/client.h>
-#ifdef HAVE_AVAHI_06
-# include <avahi-client/publish.h>
-# include <avahi-client/lookup.h>
-#endif
+#include <avahi-client/publish.h>
+#include <avahi-client/lookup.h>
#include <avahi-common/alternative.h>
#include <avahi-common/simple-watch.h>
#include <avahi-common/malloc.h>
/*****************************************************************************
* Structures
*****************************************************************************/
-typedef struct poll_thread_t
-{
- VLC_COMMON_MEMBERS
-
- AvahiSimplePoll *simple_poll;
-} poll_thread_t;
-
typedef struct bonjour_t
{
vlc_object_t *p_log;
- poll_thread_t *poll_thread;
+ vlc_thread_t thread;
AvahiSimplePoll *simple_poll;
AvahiEntryGroup *group;
AvahiClient *client;
AvahiEntryGroupState state,
void *userdata )
{
+ (void)g;
bonjour_t *p_sys = (bonjour_t *)userdata;
if( state == AVAHI_ENTRY_GROUP_ESTABLISHED )
}
error = avahi_entry_group_add_service( p_sys->group, AVAHI_IF_UNSPEC,
-#ifdef HAVE_AVAHI_06
AVAHI_PROTO_UNSPEC, 0, p_sys->psz_name,
-#else
- AVAHI_PROTO_UNSPEC, p_sys->psz_name,
-#endif
p_sys->psz_stype, NULL, NULL,
p_sys->i_port,
p_sys->psz_txt, NULL );
if( p_sys->group != NULL )
avahi_entry_group_reset( p_sys->group );
}
-#ifdef HAVE_AVAHI_06
else if( state == AVAHI_CLIENT_FAILURE &&
(avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) )
-#else
- else if( state == AVAHI_CLIENT_DISCONNECTED )
-#endif
{
msg_Err( p_sys->p_log, "avahi client disconnected" );
avahi_simple_poll_quit( p_sys->simple_poll );
/*****************************************************************************
* poll_iterate_thread
*****************************************************************************/
-static void poll_iterate_thread( poll_thread_t *p_pt )
+static void *poll_iterate_thread( void *data )
{
- vlc_thread_ready( p_pt );
+ AvahiSimplePoll *simple_poll = data;
- while( !p_pt->b_die )
- if( avahi_simple_poll_iterate( p_pt->simple_poll, 100 ) != 0 )
+ for( ;; )
+ {
+ vlc_testcancel();
+ int canc = vlc_savecancel();
+ int ret = avahi_simple_poll_iterate( p_pt->simple_poll, 100 );
+ vlc_restorecancel( canc );
+ if (ret)
break;
+ }
+ return NULL;
}
/*****************************************************************************
* bonjour_start_service
*****************************************************************************/
-void *bonjour_start_service( vlc_object_t *p_log, char *psz_stype,
- char *psz_name, int i_port, char *psz_txt )
+void *bonjour_start_service( vlc_object_t *p_log, const char *psz_stype,
+ const char *psz_name, int i_port, char *psz_txt )
{
int err;
- bonjour_t *p_sys;
- p_sys = (bonjour_t *)malloc( sizeof(*p_sys) );
+ bonjour_t* p_sys = calloc( 1, sizeof(*p_sys) );
if( p_sys == NULL )
- {
- msg_Err( p_log, "out of memory" );
return NULL;
- }
-
- memset( p_sys, 0, sizeof(*p_sys) );
p_sys->p_log = p_log;
-
p_sys->i_port = i_port;
p_sys->psz_name = avahi_strdup( psz_name );
p_sys->psz_stype = avahi_strdup( psz_stype );
if( p_sys->psz_name == NULL || p_sys->psz_stype == NULL )
- {
- msg_Err( p_sys->p_log, "out of memory" );
goto error;
- }
if( psz_txt != NULL )
{
p_sys->psz_txt = avahi_strdup( psz_txt );
if( p_sys->psz_txt == NULL )
- {
- msg_Err( p_sys->p_log, "out of memory" );
goto error;
- }
}
p_sys->simple_poll = avahi_simple_poll_new();
}
p_sys->client = avahi_client_new( avahi_simple_poll_get(p_sys->simple_poll),
-#ifdef HAVE_AVAHI_06
0,
-#endif
client_callback, p_sys, &err );
if( p_sys->client == NULL )
{
goto error;
}
- p_sys->poll_thread = vlc_object_create( p_sys->p_log,
- sizeof(poll_thread_t) );
- if( p_sys->poll_thread == NULL )
- {
- msg_Err( p_sys->p_log, "out of memory" );
- goto error;
- }
- p_sys->poll_thread->simple_poll = p_sys->simple_poll;
-
- if( vlc_thread_create( p_sys->poll_thread, "Avahi Poll Iterate Thread",
- poll_iterate_thread,
- VLC_THREAD_PRIORITY_HIGHEST, VLC_FALSE ) )
+ if( vlc_clone( &p_sys->thread,
+ poll_iterate_thread, p_sys->simple_poll,
+ VLC_THREAD_PRIORITY_HIGHEST ) )
{
msg_Err( p_sys->p_log, "failed to create poll iterate thread" );
goto error;
return (void *)p_sys;
error:
- if( p_sys->poll_thread != NULL )
- vlc_object_destroy( p_sys->poll_thread );
if( p_sys->client != NULL )
avahi_client_free( p_sys->client );
if( p_sys->simple_poll != NULL )
if( p_sys->psz_txt != NULL )
avahi_free( p_sys->psz_txt );
- free( (void *)p_sys );
+ free( p_sys );
return NULL;
}
{
bonjour_t *p_sys = (bonjour_t *)_p_sys;
- if( p_sys->poll_thread->b_thread )
- {
- p_sys->poll_thread->b_die = 1;
- vlc_thread_join( p_sys->poll_thread );
- }
-
- vlc_object_destroy( p_sys->poll_thread );
+ vlc_cancel( p_sys->thread );
+ vlc_join( p_sys->thread, NULL );
if( p_sys->group != NULL )
avahi_entry_group_free( p_sys->group );