/*****************************************************************************
* tree.c : Playlist tree walking functions
*****************************************************************************
- * Copyright (C) 1999-2007 the VideoLAN team
+ * Copyright (C) 1999-2007 VLC authors and VideoLAN
* $Id$
*
* 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
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
if( !psz_name ) psz_name = _("Undefined");
if( !p_input )
- p_new_input = input_item_NewWithType( VLC_OBJECT(p_playlist), NULL,
- psz_name, 0, NULL, 0, -1, ITEM_TYPE_NODE );
+ p_new_input = input_item_NewWithType( NULL, psz_name, 0, NULL, 0, -1,
+ ITEM_TYPE_NODE );
p_item = playlist_ItemNewFromInput( p_playlist,
p_input ? p_input : p_new_input );
if( p_new_input )
playlist_SendAddNotify( p_playlist, p_item->i_id,
p_parent ? p_parent->i_id : -1,
!( i_flags & PLAYLIST_NO_REBUILD ));
+
+ p_item->i_flags |= i_flags;
+
return p_item;
}
bool b_delete_items, bool b_force )
{
PL_ASSERT_LOCKED;
- int i;
-
- if( p_root->i_children == -1 )
- {
- return VLC_EGENERIC;
- }
/* Delete the children */
- for( i = p_root->i_children - 1 ; i >= 0; i-- )
- {
- if( p_root->pp_children[i]->i_children > -1 )
- {
+ for( int i = p_root->i_children - 1 ; i >= 0; i-- )
+ if( b_delete_items || p_root->pp_children[i]->i_children >= 0 )
playlist_NodeDelete( p_playlist, p_root->pp_children[i],
- b_delete_items , b_force );
- }
- else if( b_delete_items )
- {
- playlist_DeleteItem( p_playlist, p_root->pp_children[i], true );
- }
- }
+ b_delete_items, b_force );
+
/* Delete the node */
if( p_root->i_flags & PLAYLIST_RO_FLAG && !b_force )
- {
+ return VLC_SUCCESS;
+
+ pl_priv(p_playlist)->b_reset_currently_playing = true;
+
+ int i;
+ var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
+ ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int, p_root->i_id, i );
+ if( i != -1 )
+ ARRAY_REMOVE( p_playlist->all_items, i );
+
+ if( p_root->i_children == -1 ) {
+ ARRAY_BSEARCH( p_playlist->items,->i_id, int, p_root->i_id, i );
+ if( i != -1 )
+ ARRAY_REMOVE( p_playlist->items, i );
}
- else
+
+ /* Check if it is the current item */
+ if( get_current_status_item( p_playlist ) == p_root )
{
- int i;
- var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
- ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int,
- p_root->i_id, i );
- if( i != -1 )
- ARRAY_REMOVE( p_playlist->all_items, i );
+ /* Stop */
+ playlist_Control( p_playlist, PLAYLIST_STOP, pl_Locked );
+ msg_Info( p_playlist, "stopping playback" );
+ /* This item can't be the next one to be played ! */
+ set_current_status_item( p_playlist, NULL );
+ }
- /* Remove the item from its parent */
- if( p_root->p_parent )
- playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
+ ARRAY_BSEARCH( p_playlist->current,->i_id, int, p_root->i_id, i );
+ if( i != -1 )
+ ARRAY_REMOVE( p_playlist->current, i );
- playlist_ItemRelease( p_root );
- }
+ PL_DEBUG( "deleting item `%s'", p_root->p_input->psz_name );
+
+ /* Remove the item from its parent */
+ if( p_root->p_parent )
+ playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
+
+ playlist_ItemRelease( p_root );
return VLC_SUCCESS;
}
int i_position )
{
PL_ASSERT_LOCKED;
- (void)p_playlist;
- assert( p_parent && p_parent->i_children != -1 );
- if( i_position == -1 ) i_position = p_parent->i_children ;
-
- INSERT_ELEM( p_parent->pp_children,
- p_parent->i_children,
- i_position,
- p_item );
- p_item->p_parent = p_parent;
- return VLC_SUCCESS;
+ (void)p_playlist;
+ assert( p_parent && p_parent->i_children != -1 );
+ if( i_position == -1 ) i_position = p_parent->i_children ;
+ assert( i_position <= p_parent->i_children);
+
+ INSERT_ELEM( p_parent->pp_children,
+ p_parent->i_children,
+ i_position,
+ p_item );
+ p_item->p_parent = p_parent;
+ return VLC_SUCCESS;
}
/**
playlist_item_t *p_parent )
{
PL_ASSERT_LOCKED;
- (void)p_playlist;
+ (void)p_playlist;
+
+ int ret = VLC_EGENERIC;
+
+ for(int i= 0; i< p_parent->i_children ; i++ )
+ {
+ if( p_parent->pp_children[i] == p_item )
+ {
+ REMOVE_ELEM( p_parent->pp_children, p_parent->i_children, i );
+ ret = VLC_SUCCESS;
+ }
+ }
- for(int i= 0; i< p_parent->i_children ; i++ )
- {
- if( p_parent->pp_children[i] == p_item )
- {
- REMOVE_ELEM( p_parent->pp_children, p_parent->i_children, i );
- }
- }
+ if( ret == VLC_SUCCESS ) {
+ assert( p_item->p_parent == p_parent );
+ p_item->p_parent = NULL;
+ }
- return VLC_SUCCESS;
+ return ret;
}
/**