/*****************************************************************************
* tree.c : Playlist tree walking functions
*****************************************************************************
- * Copyright (C) 1999-2004 the VideoLAN team
+ * Copyright (C) 1999-2007 the VideoLAN team
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
* 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"
+#endif
+
#include <vlc/vlc.h>
#include <assert.h>
#include "vlc_playlist.h"
* \param p_playlist the playlist
* \paam psz_name the name of the node
* \param p_parent the parent node to attach to or NULL if no attach
+ * \param p_flags miscellaneous flags
+ * \param p_input the input_item to attach to or NULL if it has to be created
* \return the new node
*/
-playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist, const char *psz_name,
- playlist_item_t *p_parent )
+playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist,
+ const char *psz_name,
+ playlist_item_t *p_parent, int i_flags,
+ input_item_t *p_input )
{
- input_item_t *p_input;
+ input_item_t *p_new_input;
playlist_item_t *p_item;
if( !psz_name ) psz_name = _("Undefined");
- p_input = input_ItemNewWithType( VLC_OBJECT(p_playlist), NULL, psz_name,
- 0, NULL, -1, ITEM_TYPE_NODE );
- p_input->i_id = ++p_playlist->i_last_input_id;
- p_item = playlist_ItemNewFromInput( VLC_OBJECT(p_playlist), p_input );
- p_item->i_children = 0;
+
+ if( !p_input )
+ p_new_input = input_ItemNewWithType( VLC_OBJECT(p_playlist), NULL,
+ psz_name, 0, NULL, -1, ITEM_TYPE_NODE );
+ p_item = playlist_ItemNewFromInput( VLC_OBJECT(p_playlist),
+ p_input ? p_input : p_new_input );
+ if( !p_input )
+ vlc_gc_decref( p_new_input );
if( p_item == NULL ) return NULL;
+ p_item->i_children = 0;
ARRAY_APPEND(p_playlist->all_items, p_item);
if( p_parent != NULL )
playlist_NodeAppend( p_playlist, p_item, p_parent );
playlist_SendAddNotify( p_playlist, p_item->i_id,
- p_parent ? p_parent->i_id : -1 );
+ p_parent ? p_parent->i_id : -1,
+ !( i_flags & PLAYLIST_NO_REBUILD ));
return p_item;
}
{
int i;
var_SetInteger( p_playlist, "item-deleted", p_root->i_id );
- ARRAY_BSEARCH( p_playlist->all_items, ->p_input->i_id, int,
- p_root->p_input->i_id, i );
+ ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int,
+ p_root->i_id, i );
if( i != -1 )
ARRAY_REMOVE( p_playlist->all_items, i );
playlist_item_t *p_parent,
int i_position )
{
+ (void)p_playlist;
assert( p_parent && p_parent->i_children != -1 );
if( i_position == -1 ) i_position = p_parent->i_children ;
playlist_item_t *p_item,
playlist_item_t *p_parent )
{
- int i;
- for( i= 0; i< p_parent->i_children ; i++ )
+ (void)p_playlist;
+
+ for(int i= 0; i< p_parent->i_children ; i++ )
{
if( p_parent->pp_children[i] == p_item )
{
/**
* Create a pair of nodes in the category and onelevel trees.
- * They share the same input ID.
- * \todo really share the input item
+ * They share the same input item.
* \param p_playlist the playlist
* \param psz_name the name of the nodes
* \param pp_node_cat pointer to return the node in category tree
vlc_bool_t b_for_sd )
{
*pp_node_cat = playlist_NodeCreate( p_playlist, psz_name,
- p_playlist->p_root_category );
+ p_playlist->p_root_category, 0, NULL );
*pp_node_one = playlist_NodeCreate( p_playlist, psz_name,
- p_playlist->p_root_onelevel );
- (*pp_node_one)->p_input->i_id = (*pp_node_cat)->p_input->i_id;
+ p_playlist->p_root_onelevel, 0,
+ (*pp_node_cat)->p_input );
if( b_for_sd )
{
(*pp_node_cat)->i_flags |= PLAYLIST_RO_FLAG;
/**
* Get the node in the preferred tree from a node in one of category
- * or onelevel tree.
+ * or onelevel tree.
* For example, for the SAP node, it will return the node in the category
* tree if --playlist-tree is not set to never, because the SAP node prefers
* category
playlist_item_t *p_grandparent;
vlc_bool_t b_found = VLC_FALSE;
+ (void)p_playlist;
+
if( p_parent != NULL )
{
p_grandparent = p_parent->p_parent;
- while( 1 )
+ while( p_grandparent )
{
int i;
for( i = 0 ; i< p_grandparent->i_children ; i++ )
playlist_item_t *p_grandparent;
vlc_bool_t b_found = VLC_FALSE;
+ (void)p_playlist;
+
if( p_parent != NULL )
{
p_grandparent = p_parent->p_parent;