services_discovery_sys_t *p_sys;
};
-
/***********************************************************************
* Service Discovery
***********************************************************************/
/* Creation of a service_discovery object */
VLC_EXPORT( services_discovery_t *, services_discovery_Create, ( vlc_object_t * p_super, const char * psz_service_name ) );
-VLC_EXPORT( void, services_discovery_Destroy, ( services_discovery_t * p_this ) );
+VLC_EXPORT( bool, services_discovery_Start, ( services_discovery_t * p_this ) );
+VLC_EXPORT( void, services_discovery_Stop, ( services_discovery_t * p_this ) );
+
+static inline void services_discovery_CreateAndStart( vlc_object_t * p_super, const char * psz_service_name )
+{
+ services_discovery_t * sd = services_discovery_Create( p_super, psz_service_name );
+ services_discovery_Start( sd );
+}
+
+static inline void services_discovery_StopAndRelease( services_discovery_t * p_this )
+{
+ services_discovery_Stop( p_this );
+ vlc_object_release( p_this );
+}
/* Read info from discovery object */
VLC_EXPORT( char *, services_discovery_GetLocalizedName, ( services_discovery_t * p_this ) );
#include "playlist_internal.h"
#include "../libvlc.h"
+
+static void services_discovery_Destructor ( services_discovery_t * p_sd );
+
/*
* Services discovery
* Basically you just listen to Service discovery event through the
services_discovery_Create ( vlc_object_t * p_super, const char * psz_module_name )
{
services_discovery_t *p_sd;
+ assert( psz_module_name );
p_sd = vlc_custom_create( p_super, sizeof( *p_sd ), VLC_OBJECT_GENERIC,
"services discovery" );
if( !p_sd )
return NULL;
- p_sd->psz_localized_name = NULL;
+ p_sd->psz_localized_name = strdup( "Unnamed service discovery" ); // FIXME: Set that back to NULL
+ p_sd->psz_module = strdup( psz_module_name );
vlc_event_manager_init( &p_sd->event_manager, p_sd, (vlc_object_t *)p_sd );
vlc_event_manager_register_event_type( &p_sd->event_manager,
vlc_event_manager_register_event_type( &p_sd->event_manager,
vlc_ServicesDiscoveryEnded );
- p_sd->p_module = module_Need( p_sd, "services_discovery", psz_module_name, true );
-
- if( p_sd->p_module == NULL )
- {
- msg_Err( p_super, "no suitable services discovery module" );
- vlc_object_release( p_sd );
- return NULL;
- }
- p_sd->psz_module = strdup( psz_module_name );
+ p_sd->b_die = false; /* FIXME */
vlc_object_attach( p_sd, p_super );
- vlc_event_t event = {
- .type = vlc_ServicesDiscoveryStarted
- };
- vlc_event_send( &p_sd->event_manager, &event );
return p_sd;
}
}
/***********************************************************************
- * Destroy
+ * Stop
+ ***********************************************************************/
+bool services_discovery_Start ( services_discovery_t * p_sd )
+{
+ assert(!p_sd->p_module);
+
+ p_sd->p_module = module_Need( p_sd, "services_discovery", p_sd->psz_module, true );
+
+ if( p_sd->p_module == NULL )
+ {
+ 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
***********************************************************************/
-void services_discovery_Destroy ( services_discovery_t * p_sd )
+void services_discovery_Stop ( services_discovery_t * p_sd )
{
vlc_event_t event = {
.type = vlc_ServicesDiscoveryEnded
};
-
+
ObjectKillChildrens( VLC_OBJECT(p_sd) );
-
+
vlc_event_send( &p_sd->event_manager, &event );
+
module_Unneed( p_sd, p_sd->p_module );
+ p_sd->p_module = NULL;
+}
- vlc_event_manager_fini( &p_sd->event_manager );
+/***********************************************************************
+ * Destructor
+ ***********************************************************************/
+static void services_discovery_Destructor ( services_discovery_t * p_sd )
+{
+ assert(!p_sd->p_module); /* Forgot to call Stop */
+ vlc_event_manager_fini( &p_sd->event_manager );
+
free( p_sd->psz_module );
free( p_sd->psz_localized_name );
-
+
vlc_object_release( p_sd );
}
if( !p_sd )
continue;
+ /* FIXME: Thanks to previous changeset this is broken */
char * psz = services_discovery_GetLocalizedName( p_sd );
assert( psz );
PL_LOCK;
vlc_ServicesDiscoveryItemAdded,
playlist_sd_item_added,
p_one );
-
+
vlc_event_attach( services_discovery_EventManager( p_sd ),
vlc_ServicesDiscoveryItemAdded,
playlist_sd_item_added,
playlist_sd_item_removed,
p_cat );
+ bool ret = services_discovery_Start( p_sd );
+ if(!ret)
+ {
+ vlc_object_release( p_sd );
+ return VLC_EGENERIC;
+ }
+
/* Free in playlist_ServicesDiscoveryRemove */
p_sds = malloc( sizeof(struct playlist_services_discovery_support_t) );
if( !p_sds )
PL_LOCK;
TAB_APPEND( p_playlist->i_sds, p_playlist->pp_sds, p_sds );
PL_UNLOCK;
+
}
return retval;
}
PL_UNLOCK;
- services_discovery_Destroy( p_sds->p_sd );
+ services_discovery_StopAndRelease( p_sds->p_sd );
free( p_sds );
return VLC_SUCCESS;
playlist_ServicesDiscoveryRemove( p_playlist,
p_playlist->pp_sds[0]->p_sd->psz_module );
}
-