1 /*****************************************************************************
2 * media_list_path.h : Some inlined function that allows media_list_path
3 * manipulation. This is internal and used only by media_list_player.
4 *****************************************************************************
5 * Copyright (C) 2005 the VideoLAN team
8 * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 #ifndef _LIBVLC_MEDIA_LIST_PATH_H
26 #define _LIBVLC_MEDIA_LIST_PATH_H 1
28 /**************************************************************************
29 * path_empty (Media List Player Internal)
30 **************************************************************************/
31 static inline libvlc_media_list_path_t libvlc_media_list_path_empty( void )
33 libvlc_media_list_path_t ret = malloc(sizeof(int));
38 /**************************************************************************
39 * path_with_root_index (Media List Player Internal)
40 **************************************************************************/
41 static inline libvlc_media_list_path_t libvlc_media_list_path_with_root_index( int index )
43 libvlc_media_list_path_t ret = malloc(sizeof(int)*2);
49 /**************************************************************************
50 * path_deepness (Media List Player Internal)
51 **************************************************************************/
52 static inline int libvlc_media_list_path_deepness( libvlc_media_list_path_t path )
55 for( i = 0; path[i] != -1; i++ );
59 /**************************************************************************
60 * path_append (Media List Player Internal)
61 **************************************************************************/
62 static inline void libvlc_media_list_path_append( libvlc_media_list_path_t * p_path, int index )
64 int old_deepness = libvlc_media_list_path_deepness( *p_path );
65 *p_path = realloc( *p_path, sizeof(int)*(old_deepness+2));
66 *p_path[old_deepness] = index;
67 *p_path[old_deepness+1] = -1;
70 /**************************************************************************
71 * path_copy_by_appending (Media List Player Internal)
72 **************************************************************************/
73 static inline libvlc_media_list_path_t libvlc_media_list_path_copy_by_appending( libvlc_media_list_path_t path, int index )
75 libvlc_media_list_path_t ret;
76 int old_deepness = libvlc_media_list_path_deepness( path );
77 ret = malloc( sizeof(int)*(old_deepness+2) );
78 memcpy( ret, path, sizeof(int)*(old_deepness+2) );
79 ret[old_deepness] = index;
80 ret[old_deepness+1] = -1;
84 /**************************************************************************
85 * path_copy (Media List Player Internal)
86 **************************************************************************/
87 static inline libvlc_media_list_path_t libvlc_media_list_path_copy( libvlc_media_list_path_t path )
89 libvlc_media_list_path_t ret;
90 int deepness = libvlc_media_list_path_deepness( path );
91 ret = malloc( sizeof(int)*(deepness+1) );
92 memcpy( ret, path, sizeof(int)*(deepness+1) );
96 /**************************************************************************
97 * get_path_rec (Media List Player Internal)
98 **************************************************************************/
99 static libvlc_media_list_path_t
100 get_path_rec( libvlc_media_list_path_t path, libvlc_media_list_t * p_current_mlist, libvlc_media_descriptor_t * p_searched_md )
103 count = libvlc_media_list_count( p_current_mlist, NULL );
104 for( i = 0; i < count; i++ )
106 libvlc_media_descriptor_t * p_md = libvlc_media_list_item_at_index( p_current_mlist, i, NULL );
108 if( p_md == p_searched_md )
109 return libvlc_media_list_path_copy_by_appending( path, i ); /* Found! */
111 libvlc_media_list_t * p_subitems = libvlc_media_descriptor_subitems( p_md, NULL );
112 libvlc_media_descriptor_release( p_md );
115 libvlc_media_list_path_t new_path = libvlc_media_list_path_copy_by_appending( path, i );
116 libvlc_media_list_lock( p_subitems );
117 libvlc_media_list_path_t ret = get_path_rec( new_path, p_subitems, p_searched_md );
118 libvlc_media_list_unlock( p_subitems );
120 libvlc_media_list_release( p_subitems );
122 return ret; /* Found in sublist! */
128 /**************************************************************************
129 * path_of_item (Media List Player Internal)
130 **************************************************************************/
131 static inline libvlc_media_list_path_t libvlc_media_list_path_of_item( libvlc_media_list_t * p_mlist, libvlc_media_descriptor_t * p_md )
133 libvlc_media_list_path_t path = libvlc_media_list_path_empty();
134 libvlc_media_list_path_t ret;
135 ret = get_path_rec( path, p_mlist, p_md );
140 /**************************************************************************
141 * item_at_path (Media List Player Internal)
142 **************************************************************************/
143 static libvlc_media_descriptor_t *
144 libvlc_media_list_item_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
146 libvlc_media_list_t * p_current_mlist = p_mlist;
147 libvlc_media_descriptor_t * p_md = NULL;
149 for( i = 0; path[i] != -1; i++ )
151 p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
153 if( p_current_mlist != p_mlist )
154 libvlc_media_list_release( p_current_mlist );
156 if( path[i+1] == -1 )
159 p_current_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
160 libvlc_media_descriptor_release( p_md );
162 if( !p_current_mlist )
167 /* Not found, shouldn't happen if the p_path is not empty */
168 if( p_current_mlist != p_mlist )
169 libvlc_media_list_release( p_current_mlist );
173 /**************************************************************************
174 * parentlist_at_path (Media List Player Internal)
175 **************************************************************************/
176 static libvlc_media_list_t *
177 libvlc_media_list_parentlist_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
179 libvlc_media_list_t * p_current_mlist = p_mlist;
180 libvlc_media_descriptor_t * p_md = NULL;
182 for( i = 0; path[i] != -1; i++ )
184 if( p_current_mlist != p_mlist )
185 libvlc_media_list_release( p_current_mlist );
187 if( path[i+1] == -1 )
188 return p_current_mlist;
190 p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
192 p_current_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
193 libvlc_media_descriptor_release( p_md );
195 if( !p_current_mlist )
200 /* Not found, shouldn't happen if the p_path is not empty */
201 if( p_current_mlist != p_mlist )
202 libvlc_media_list_release( p_current_mlist );
206 /**************************************************************************
207 * sublist_at_path (Media List Player Internal)
208 **************************************************************************/
209 static libvlc_media_list_t *
210 libvlc_media_list_sublist_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
212 libvlc_media_list_t * ret;
213 libvlc_media_descriptor_t * p_md = libvlc_media_list_item_at_path( p_mlist, path );
217 ret = libvlc_media_descriptor_subitems( p_md, NULL );
218 libvlc_media_descriptor_release( p_md );