/* A new item has been removed from a certain sd */ 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_item_t * p_pl_item; /* First make sure that if item is a node it will be deleted. * XXX: Why don't we have a function to ensure that in the playlist code ? */ vlc_object_lock( p_parent->p_playlist ); p_pl_item = playlist_ItemFindFromInputAndRoot( p_parent->p_playlist, p_input->i_id, p_parent, false ); if( p_pl_item && p_pl_item->i_children > -1 ) { playlist_NodeDelete( p_parent->p_playlist, p_pl_item, true, false ); vlc_object_unlock( p_parent->p_playlist ); return; } /* Delete the non-node item normally */ playlist_DeleteFromInputInParent( p_parent->p_playlist, p_input->i_id, p_parent, pl_Locked ); vlc_object_unlock( p_parent->p_playlist ); }
/** * Delete input item * * Remove an input item when it appears from a root playlist item * \param p_playlist playlist object * \param p_input the input to delete * \param p_root root playlist item * \param b_do_stop must stop or not the playlist * \return VLC_SUCCESS or VLC_EGENERIC */ static int DeleteFromInput( playlist_t *p_playlist, input_item_t *p_input, playlist_item_t *p_root, bool b_do_stop ) { PL_ASSERT_LOCKED; playlist_item_t *p_item = playlist_ItemFindFromInputAndRoot( p_playlist, p_input, p_root, false ); if( !p_item ) return VLC_EGENERIC; return playlist_DeleteItem( p_playlist, p_item, b_do_stop ); }
/** * Find an item within a root, given its input id. * * \param p_playlist the playlist object * \param p_item the input item * \param p_root root playlist item * \param b_items_only TRUE if we want the item himself * \return the first found item, or NULL if not found */ playlist_item_t *playlist_ItemFindFromInputAndRoot( playlist_t *p_playlist, input_item_t *p_item, playlist_item_t *p_root, bool b_items_only ) { int i; for( i = 0 ; i< p_root->i_children ; i++ ) { if( ( b_items_only ? p_root->pp_children[i]->i_children == -1 : 1 ) && p_root->pp_children[i]->p_input == p_item ) { return p_root->pp_children[i]; } else if( p_root->pp_children[i]->i_children >= 0 ) { playlist_item_t *p_search = playlist_ItemFindFromInputAndRoot( p_playlist, p_item, p_root->pp_children[i], b_items_only ); if( p_search ) return p_search; } } return NULL; }