]> git.sesse.net Git - vlc/blobdiff - src/playlist/services_discovery.c
simplify service discoveries
[vlc] / src / playlist / services_discovery.c
index f3691da6cb6139741ee1ba483f75b1b723a2b0fe..987073dc01a3f60469ed5cc283a9485a34c0c01b 100644 (file)
@@ -31,8 +31,6 @@
 #include "playlist_internal.h"
 #include "../libvlc.h"
 
-static void RunSD( services_discovery_t *p_sd );
-
 /*
  * Services discovery
  * Basically you just listen to Service discovery event through the
@@ -62,7 +60,6 @@ services_discovery_Create ( vlc_object_t * p_super, const char * psz_module_name
     if( !p_sd )
         return NULL;
 
-    p_sd->pf_run = NULL;
     p_sd->psz_localized_name = NULL;
 
     vlc_event_manager_init( &p_sd->event_manager, p_sd, (vlc_object_t *)p_sd );
@@ -87,50 +84,48 @@ services_discovery_Create ( vlc_object_t * p_super, const char * 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;
 }
 
+static void ObjectKillChildrens( vlc_object_t *p_obj )
+{
+    vlc_list_t *p_list;
+    int i;
+    vlc_object_kill( p_obj );
+
+    p_list = vlc_list_children( p_obj );
+    for( i = 0; i < p_list->i_count; i++ )
+        ObjectKillChildrens( p_list->p_values[i].p_object );
+    vlc_list_release( p_list );
+}
+
 /***********************************************************************
  * Destroy
  ***********************************************************************/
 void services_discovery_Destroy ( 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 );
+
     vlc_event_manager_fini( &p_sd->event_manager );
 
     free( p_sd->psz_module );
     free( p_sd->psz_localized_name );
 
-    vlc_object_detach( p_sd );
     vlc_object_release( p_sd );
 }
 
-/***********************************************************************
- * Start
- ***********************************************************************/
-int services_discovery_Start ( services_discovery_t * p_sd )
-{
-    if ((p_sd->pf_run != NULL)
-        && vlc_thread_create( p_sd, "services_discovery", RunSD,
-                              VLC_THREAD_PRIORITY_LOW, false))
-    {
-        msg_Err( p_sd, "cannot create services discovery thread" );
-        vlc_object_release( p_sd );
-        return VLC_EGENERIC;
-    }
-    return VLC_SUCCESS;
-}
-
-/***********************************************************************
- * Stop
- ***********************************************************************/
-void services_discovery_Stop ( services_discovery_t * p_sd )
-{
-    vlc_object_kill( p_sd );
-    if( p_sd->pf_run ) vlc_thread_join( p_sd );
-
-    module_Unneed( p_sd, p_sd->p_module );
-}
-
 /***********************************************************************
  * GetLocalizedName
  ***********************************************************************/
@@ -187,23 +182,6 @@ services_discovery_RemoveItem ( services_discovery_t * p_sd, input_item_t * p_it
     vlc_event_send( &p_sd->event_manager, &event );
 }
 
-/***********************************************************************
- * RunSD (Private)
- ***********************************************************************/
-static void RunSD( services_discovery_t *p_sd )
-{
-    vlc_event_t event;
-
-    event.type = vlc_ServicesDiscoveryStarted;
-    vlc_event_send( &p_sd->event_manager, &event );
-
-    p_sd->pf_run( p_sd );
-
-    event.type = vlc_ServicesDiscoveryEnded;
-    vlc_event_send( &p_sd->event_manager, &event );
-    return;
-}
-
 /*
  * Playlist - Services discovery bridge
  */
@@ -266,11 +244,12 @@ static void playlist_sd_item_removed( const vlc_event_t * p_event, void * user_d
         vlc_object_unlock( p_parent->p_playlist );
         return;
     }
-    vlc_object_unlock( p_parent->p_playlist );
 
     /* Delete the non-node item normally */
-    playlist_DeleteInputInParent( p_parent->p_playlist, p_input->i_id,
-                                  p_parent, false );
+    playlist_DeleteFromInputInParent( p_parent->p_playlist, p_input->i_id,
+                                      p_parent, pl_Locked );
+
+    vlc_object_unlock( p_parent->p_playlist );
 }
 
 int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,  const char *psz_modules )
@@ -335,12 +314,13 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,  const char *psz_modu
                           playlist_sd_item_removed,
                           p_cat );
 
-        services_discovery_Start( p_sd );
-
         /* Free in playlist_ServicesDiscoveryRemove */
         p_sds = malloc( sizeof(struct playlist_services_discovery_support_t) );
         if( !p_sds )
             return VLC_ENOMEM;
+
+        /* We want tree-view for service directory */
+        p_one->p_input->b_prefers_tree = true;
         p_sds->p_sd = p_sd;
         p_sds->p_one = p_one;
         p_sds->p_cat = p_cat;
@@ -377,8 +357,6 @@ int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist,
         return VLC_EGENERIC;
     }
 
-    services_discovery_Stop( p_sds->p_sd );
-
     vlc_event_detach( services_discovery_EventManager( p_sds->p_sd ),
                         vlc_ServicesDiscoveryItemAdded,
                         playlist_sd_item_added,
@@ -410,6 +388,7 @@ int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist,
     PL_UNLOCK;
 
     services_discovery_Destroy( p_sds->p_sd );
+    free( p_sds );
 
     return VLC_SUCCESS;
 }