]> git.sesse.net Git - vlc/commitdiff
SD: remove category node when it becomes empty
authorJakob Leben <jleben@videolan.org>
Mon, 15 Feb 2010 18:09:33 +0000 (19:09 +0100)
committerJakob Leben <jleben@videolan.org>
Mon, 15 Feb 2010 18:11:27 +0000 (19:11 +0100)
src/playlist/services_discovery.c

index 88c03611ff0847187a9381ebf0e9636cc3e61b9b..fe6bfde9b15bb577b6db689069023e2a3ca01e72 100644 (file)
@@ -282,8 +282,25 @@ static void playlist_sd_item_added( const vlc_event_t * p_event, void * user_dat
 static void playlist_sd_item_removed( const vlc_event_t * p_event, void * user_data )
 {
     input_item_t * p_input = p_event->u.services_discovery_item_removed.p_item;
-    playlist_item_t * p_parent = user_data;
-    playlist_DeleteFromInput( p_parent->p_playlist, p_input, false );
+    playlist_item_t * p_sd_node = user_data;
+    playlist_t *p_playlist = p_sd_node->p_playlist;
+
+    PL_LOCK;
+    playlist_item_t *p_item =
+        playlist_ItemFindFromInputAndRoot( p_playlist, p_input,
+                                           p_sd_node, false );
+    if( !p_item )
+    {
+        PL_UNLOCK; return;
+    }
+    playlist_item_t *p_parent = p_item->p_parent;
+    /* if the item was added under a category and the category node
+       becomes empty, delete that node as well */
+    if( p_parent->i_children > 1 || p_parent == p_sd_node )
+        playlist_DeleteItem( p_playlist, p_item, true );
+    else
+        playlist_NodeDelete( p_playlist, p_parent, true, true );
+    PL_UNLOCK;
 }
 
 int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist,