/*****************************************************************************
* announce.c : announce handler
*****************************************************************************
- * Copyright (C) 2002-2004 the VideoLAN team
+ * Copyright (C) 2002-2007 the VideoLAN team
* $Id$
*
- * Authors: Clément Stenac <zorglub@videolan.org>
+ * Authors: Clément Stenac <zorglub@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* 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> /* free() */
-#include <stdio.h> /* sprintf() */
-#include <string.h> /* strerror() */
-
#include <vlc/vlc.h>
-#include <vlc/sout.h>
+#include <vlc_sout.h>
+#include "stream_output.h"
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-#define FREE( p ) if( p ) { free( p ); (p) = NULL; }
+#include <assert.h>
+/* Private functions for the announce handler */
+static announce_handler_t* announce_HandlerCreate( vlc_object_t *);
+static int announce_Register( announce_handler_t *p_announce,
+ session_descriptor_t *p_session,
+ announce_method_t *p_method );
+static int announce_UnRegister( announce_handler_t *p_announce,
+ session_descriptor_t *p_session );
+
+struct announce_method_t
+{
+} sap_method;
/****************************************************************************
* Sout-side functions
****************************************************************************/
/**
- * Register a new session with the announce handler
+ * Create and initialize a session descriptor
*
- * \param p_sout a sout instance structure
- * \param p_session a session descriptor
- * \param p_method an announce method descriptor
- * \return VLC_SUCCESS or an error
+ * \return a new session descriptor
*/
-int sout_AnnounceRegister( sout_instance_t *p_sout,
- session_descriptor_t *p_session,
- announce_method_t *p_method )
+static session_descriptor_t * sout_AnnounceSessionCreate (vlc_object_t *obj,
+ const char *cfgpref)
{
- int i_ret;
- announce_handler_t *p_announce = (announce_handler_t*)
- vlc_object_find( p_sout,
- VLC_OBJECT_ANNOUNCE,
- FIND_ANYWHERE );
+ size_t cfglen = strlen (cfgpref);
+ if (cfglen > 100)
+ return NULL;
- if( !p_announce )
- {
- msg_Dbg( p_sout, "No announce handler found, creating one" );
- p_announce = announce_HandlerCreate( p_sout );
- if( !p_announce )
- {
- msg_Err( p_sout, "Creation failed" );
- return VLC_ENOMEM;
- }
- vlc_object_yield( p_announce );
- msg_Dbg( p_sout,"Creation done" );
- }
+ char varname[cfglen + sizeof ("description")], *subvar = varname + cfglen;
+ strcpy (varname, cfgpref);
- i_ret = announce_Register( p_announce, p_session, p_method );
- vlc_object_release( p_announce );
+ session_descriptor_t *p_session = calloc (1, sizeof (*p_session));
+ if (p_session == NULL)
+ return NULL;
- return i_ret;
+ strcpy (subvar, "name");
+ p_session->psz_name = var_GetNonEmptyString (obj, varname);
+ strcpy (subvar, "group");
+ p_session->psz_group = var_GetNonEmptyString (obj, varname);
+
+ strcpy (subvar, "description");
+ p_session->description = var_GetNonEmptyString (obj, varname);
+ strcpy (subvar, "url");
+ p_session->url = var_GetNonEmptyString (obj, varname);
+ strcpy (subvar, "email");
+ p_session->email = var_GetNonEmptyString (obj, varname);
+ strcpy (subvar, "phone");
+ p_session->phone = var_GetNonEmptyString (obj, varname);
+
+ return p_session;
}
/**
*
* \param p_sout a sout instance structure
* \param psz_sdp the SDP to register
- * \param psz_uri session URI (needed for SAP address auto detection
+ * \param psz_uri session address (needed for SAP address auto detection)
* \param p_method an announce method descriptor
* \return the new session descriptor structure
*/
-session_descriptor_t *sout_AnnounceRegisterSDP( sout_instance_t *p_sout,
+session_descriptor_t *
+sout_AnnounceRegisterSDP( sout_instance_t *p_sout, const char *cfgpref,
const char *psz_sdp, const char *psz_uri,
announce_method_t *p_method )
{
if( !p_announce )
{
msg_Dbg( p_sout, "no announce handler found, creating one" );
- p_announce = announce_HandlerCreate( p_sout );
+ p_announce = announce_HandlerCreate( VLC_OBJECT( p_sout ) );
if( !p_announce )
{
msg_Err( p_sout, "Creation failed" );
vlc_object_yield( p_announce );
}
- if( p_method->i_type != METHOD_TYPE_SAP )
+ p_session = sout_AnnounceSessionCreate(VLC_OBJECT (p_sout), cfgpref);
+ p_session->psz_sdp = strdup( psz_sdp );
+
+ /* GRUIK. We should not convert back-and-forth from string to numbers */
+ struct addrinfo *res;
+ if (vlc_getaddrinfo (VLC_OBJECT (p_sout), psz_uri, 0, NULL, &res) == 0)
{
- msg_Warn( p_sout,"forcing SAP announcement");
+ if (res->ai_addrlen <= sizeof (p_session->addr))
+ memcpy (&p_session->addr, res->ai_addr,
+ p_session->addrlen = res->ai_addrlen);
+ vlc_freeaddrinfo (res);
}
- p_session = sout_AnnounceSessionCreate();
- p_session->psz_sdp = strdup( psz_sdp );
- p_session->psz_uri = strdup( psz_uri );
announce_Register( p_announce, p_session, p_method );
vlc_object_release( p_announce );
FIND_ANYWHERE );
if( !p_announce )
{
- msg_Dbg( p_sout, "Unable to remove announce: no announce handler" );
+ msg_Dbg( p_sout, "unable to remove announce: no announce handler" );
return VLC_ENOOBJ;
}
i_ret = announce_UnRegister( p_announce, p_session );
return i_ret;
}
-/**
- * Create and initialize a session descriptor
- *
- * \return a new session descriptor
- */
-session_descriptor_t * sout_AnnounceSessionCreate(void)
-{
- session_descriptor_t *p_session;
-
- p_session = (session_descriptor_t *)malloc( sizeof(session_descriptor_t));
-
- if( p_session)
- {
- p_session->p_sap = NULL;
- p_session->psz_sdp = NULL;
- p_session->psz_name = NULL;
- p_session->psz_uri = NULL;
- p_session->i_port = 0;
- p_session->psz_group = NULL;
- }
-
- return p_session;
-}
-
/**
* Destroy a session descriptor and free all
*
{
if( p_session )
{
- FREE( p_session->psz_name );
- FREE( p_session->psz_group );
- FREE( p_session->psz_uri );
- FREE( p_session->psz_sdp );
+ free (p_session->psz_name);
+ free (p_session->psz_group);
+ free (p_session->psz_sdp);
+ free (p_session->description);
+ free (p_session->sdpformat);
+ free (p_session->url);
+ free (p_session->email);
+ free (p_session->phone);
free( p_session );
}
}
/**
- * Create and initialize an announcement method structure
- *
- * \param i_type METHOD_TYPE_SAP or METHOD_TYPE_SLP
- * \return a new announce_method structure
+ * \return the SAP announce method
*/
-announce_method_t * sout_AnnounceMethodCreate( int i_type )
+announce_method_t * sout_SAPMethod (void)
{
- announce_method_t *p_method;
-
- p_method = (announce_method_t *)malloc( sizeof(announce_method_t) );
- if( p_method == NULL )
- return NULL;
+ return &sap_method;
+}
- p_method->i_type = i_type;
- return p_method;
+void sout_MethodRelease (announce_method_t *m)
+{
+ assert (m == &sap_method);
}
/************************************************************************
* \param p_this a vlc_object structure
* \return the new announce handler or NULL on error
*/
-announce_handler_t *__announce_HandlerCreate( vlc_object_t *p_this )
+static announce_handler_t *announce_HandlerCreate( vlc_object_t *p_this )
{
announce_handler_t *p_announce;
}
p_announce->p_sap = NULL;
-
- vlc_object_attach( p_announce, p_this->p_vlc);
-
+ vlc_object_attach( p_announce, p_this->p_libvlc);
return p_announce;
}
*/
int announce_HandlerDestroy( announce_handler_t *p_announce )
{
-
if( p_announce->p_sap )
{
- p_announce->p_sap->b_die = VLC_TRUE;
+ vlc_object_kill ((vlc_object_t *)p_announce->p_sap);
/* Wait for the SAP thread to exit */
- vlc_thread_join( p_announce->p_sap );
+ vlc_thread_join( (vlc_object_t *)p_announce->p_sap );
announce_SAPHandlerDestroy( p_announce->p_sap );
}
}
/* Register an announce */
-int announce_Register( announce_handler_t *p_announce,
- session_descriptor_t *p_session,
- announce_method_t *p_method )
+static int announce_Register( announce_handler_t *p_announce,
+ session_descriptor_t *p_session,
+ announce_method_t *p_method )
{
+ if (p_method == NULL)
+ return VLC_EGENERIC;
msg_Dbg( p_announce, "registering announce");
- if( p_method->i_type == METHOD_TYPE_SAP )
+ if( p_method == &sap_method )
{
/* Do we already have a SAP announce handler ? */
if( !p_announce->p_sap )
msg_Dbg( p_announce, "adding SAP session");
p_announce->p_sap->pf_add( p_announce->p_sap, p_session );
}
- else if( p_method->i_type == METHOD_TYPE_SLP )
- {
- msg_Dbg( p_announce, "SLP unsupported at the moment" );
- return VLC_EGENERIC;
- }
else
{
- msg_Dbg( p_announce, "Announce type unsupported" );
+ msg_Err( p_announce, "announce type unsupported" );
return VLC_EGENERIC;
}
- return VLC_SUCCESS;;
+ return VLC_SUCCESS;
}
/* Unregister an announce */
-int announce_UnRegister( announce_handler_t *p_announce,
- session_descriptor_t *p_session )
+static int announce_UnRegister( announce_handler_t *p_announce,
+ session_descriptor_t *p_session )
{
msg_Dbg( p_announce, "unregistering announce" );
- if( p_session->p_sap != NULL ) /* SAP Announce */
- {
- if( !p_announce->p_sap )
- {
- msg_Err( p_announce, "can't remove announce, no SAP handler");
- return VLC_ENOOBJ;
- }
+ if( p_announce->p_sap )
p_announce->p_sap->pf_del( p_announce->p_sap, p_session );
- }
return VLC_SUCCESS;
}