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 * Definition (Media List Player Internal)
30 **************************************************************************/
31 typedef int * libvlc_media_list_path_t;
34 /**************************************************************************
35 * path_empty (Media List Player Internal)
36 **************************************************************************/
37 static inline libvlc_media_list_path_t libvlc_media_list_path_empty( void )
39 libvlc_media_list_path_t ret = malloc(sizeof(int));
44 /**************************************************************************
45 * path_with_root_index (Media List Player Internal)
46 **************************************************************************/
47 static inline libvlc_media_list_path_t libvlc_media_list_path_with_root_index( int index )
49 libvlc_media_list_path_t ret = malloc(sizeof(int)*2);
55 /**************************************************************************
56 * path_deepness (Media List Player Internal)
57 **************************************************************************/
58 static inline int libvlc_media_list_path_deepness( libvlc_media_list_path_t path )
61 for( i = 0; path[i] != -1; i++ );
65 /**************************************************************************
66 * path_append (Media List Player Internal)
67 **************************************************************************/
68 static inline void libvlc_media_list_path_append( libvlc_media_list_path_t * p_path, int index )
70 int old_deepness = libvlc_media_list_path_deepness( *p_path );
71 *p_path = realloc( *p_path, sizeof(int)*(old_deepness+2));
72 *p_path[old_deepness] = index;
73 *p_path[old_deepness+1] = -1;
76 /**************************************************************************
77 * path_copy_by_appending (Media List Player Internal)
78 **************************************************************************/
79 static inline libvlc_media_list_path_t libvlc_media_list_path_copy_by_appending( libvlc_media_list_path_t path, int index )
81 libvlc_media_list_path_t ret;
82 int old_deepness = libvlc_media_list_path_deepness( path );
83 ret = malloc( sizeof(int)*(old_deepness+2) );
84 memcpy( ret, path, sizeof(int)*(old_deepness+2) );
85 ret[old_deepness] = index;
86 ret[old_deepness+1] = -1;
90 /**************************************************************************
91 * path_copy (Media List Player Internal)
92 **************************************************************************/
93 static inline libvlc_media_list_path_t libvlc_media_list_path_copy( libvlc_media_list_path_t path )
95 libvlc_media_list_path_t ret;
96 int deepness = libvlc_media_list_path_deepness( path );
97 ret = malloc( sizeof(int)*(deepness+1) );
98 memcpy( ret, path, sizeof(int)*(deepness+1) );
102 /**************************************************************************
103 * get_path_rec (Media List Player Internal)
104 **************************************************************************/
105 static libvlc_media_list_path_t
106 get_path_rec( libvlc_media_list_path_t path, libvlc_media_list_t * p_current_mlist, libvlc_media_descriptor_t * p_searched_md )
109 count = libvlc_media_list_count( p_current_mlist, NULL );
110 for( i = 0; i < count; i++ )
112 libvlc_media_descriptor_t * p_md = libvlc_media_list_item_at_index( p_current_mlist, i, NULL );
114 if( p_md == p_searched_md )
115 return libvlc_media_list_path_copy_by_appending( path, i ); /* Found! */
117 libvlc_media_list_t * p_subitems = libvlc_media_descriptor_subitems( p_md, NULL );
118 libvlc_media_descriptor_release( p_md );
121 libvlc_media_list_path_t new_path = libvlc_media_list_path_copy_by_appending( path, i );
122 libvlc_media_list_lock( p_subitems );
123 libvlc_media_list_path_t ret = get_path_rec( new_path, p_subitems, p_searched_md );
124 libvlc_media_list_unlock( p_subitems );
126 libvlc_media_list_release( p_subitems );
128 return ret; /* Found in sublist! */
134 /**************************************************************************
135 * path_of_item (Media List Player Internal)
136 **************************************************************************/
137 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 )
139 libvlc_media_list_path_t path = libvlc_media_list_path_empty();
140 libvlc_media_list_path_t ret;
141 ret = get_path_rec( path, p_mlist, p_md );
146 /**************************************************************************
147 * item_at_path (Media List Player Internal)
148 **************************************************************************/
149 static libvlc_media_descriptor_t *
150 libvlc_media_list_item_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
152 libvlc_media_list_t * p_current_mlist = p_mlist;
153 libvlc_media_descriptor_t * p_md = NULL;
155 for( i = 0; path[i] != -1; i++ )
157 p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
159 if( p_current_mlist != p_mlist )
160 libvlc_media_list_release( p_current_mlist );
162 if( path[i+1] == -1 )
165 p_current_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
166 libvlc_media_descriptor_release( p_md );
168 if( !p_current_mlist )
173 /* Not found, shouldn't happen if the p_path is not empty */
174 if( p_current_mlist != p_mlist )
175 libvlc_media_list_release( p_current_mlist );
179 /**************************************************************************
180 * parentlist_at_path (Media List Player Internal)
181 **************************************************************************/
182 static libvlc_media_list_t *
183 libvlc_media_list_parentlist_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
185 libvlc_media_list_t * p_current_mlist = p_mlist;
186 libvlc_media_descriptor_t * p_md = NULL;
188 for( i = 0; path[i] != -1; i++ )
190 if( p_current_mlist != p_mlist )
191 libvlc_media_list_release( p_current_mlist );
193 if( path[i+1] == -1 )
194 return p_current_mlist;
196 p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
198 p_current_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
199 libvlc_media_descriptor_release( p_md );
201 if( !p_current_mlist )
206 /* Not found, shouldn't happen if the p_path is not empty */
207 if( p_current_mlist != p_mlist )
208 libvlc_media_list_release( p_current_mlist );
212 /**************************************************************************
213 * sublist_at_path (Media List Player Internal)
214 **************************************************************************/
215 static libvlc_media_list_t *
216 libvlc_media_list_sublist_at_path( libvlc_media_list_t * p_mlist, libvlc_media_list_path_t path )
218 libvlc_media_list_t * ret;
219 libvlc_media_descriptor_t * p_md = libvlc_media_list_item_at_path( p_mlist, path );
223 ret = libvlc_media_descriptor_subitems( p_md, NULL );
224 libvlc_media_descriptor_release( p_md );