X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fdirectory.c;h=b5a38af7aa4decb10a714ff7af0959b2d6fbb73d;hb=825d0b869e74665117bfc4ffd92ffd10f427cc8a;hp=1cde31422b754126ca5b4419f24208c8c169e542;hpb=7b6ad1735535ad12338cb2739f5065a829ac5469;p=vlc diff --git a/modules/access/directory.c b/modules/access/directory.c index 1cde31422b..b5a38af7aa 100644 --- a/modules/access/directory.c +++ b/modules/access/directory.c @@ -30,6 +30,7 @@ # include "config.h" #endif +#include #include #include #warning playlist code must not be used here. @@ -135,8 +136,8 @@ static int Demux( demux_t *p_demux ); static int DemuxControl( demux_t *p_demux, int i_query, va_list args ); -static int ReadDir( playlist_t *, const char *psz_name, int i_mode, - playlist_item_t *, input_item_t *, +static int ReadDir( access_t *, playlist_t *, const char *psz_name, + int i_mode, playlist_item_t *, input_item_t *, DIR *handle, stat_list_t *stats ); static DIR *OpenDir (vlc_object_t *obj, const char *psz_name); @@ -188,6 +189,7 @@ static void Close( vlc_object_t * p_this ) *****************************************************************************/ static ssize_t ReadNull( access_t *p_access, uint8_t *p_buffer, size_t i_len) { + (void)p_access; /* Return fake data */ memset( p_buffer, 0, i_len ); return i_len; @@ -198,9 +200,10 @@ static ssize_t ReadNull( access_t *p_access, uint8_t *p_buffer, size_t i_len) *****************************************************************************/ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len) { + (void)p_buffer; (void)i_len; char *psz; int i_mode; - char *psz_name = strdup (p_access->psz_path); + char *psz_name = strdup( p_access->psz_path ); if( psz_name == NULL ) return VLC_ENOMEM; @@ -215,18 +218,20 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len) if( !p_input ) { msg_Err( p_access, "unable to find input (internal error)" ); - vlc_object_release( p_playlist ); + free( psz_name ); + pl_Release( p_access ); return VLC_ENOOBJ; } p_current_input = input_GetItem( p_input ); - p_current = playlist_ItemGetByInput( p_playlist, p_current_input, false ); + p_current = playlist_ItemGetByInput( p_playlist, p_current_input, pl_Unlocked ); if( !p_current ) { msg_Err( p_access, "unable to find item in playlist" ); vlc_object_release( p_input ); - vlc_object_release( p_playlist ); + free( psz_name ); + pl_Release( p_access ); return VLC_ENOOBJ; } @@ -254,16 +259,18 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len) p_current->p_input->i_type = ITEM_TYPE_DIRECTORY; p_item_in_category = playlist_ItemToNode( p_playlist, p_current, - false ); + pl_Unlocked ); + assert( p_item_in_category ); - ReadDir( p_playlist, psz_name, i_mode, p_item_in_category, + ReadDir( p_access, p_playlist, psz_name, i_mode, + p_item_in_category, p_current_input, (DIR *)p_access->p_sys, NULL ); playlist_Signal( p_playlist ); free( psz_name ); vlc_object_release( p_input ); - vlc_object_release( p_playlist ); + pl_Release( p_access ); /* Return fake data forever */ p_access->pf_read = ReadNull; @@ -308,6 +315,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_SET_SEEKPOINT: case ACCESS_SET_PRIVATE_ID_STATE: case ACCESS_GET_CONTENT_TYPE: + case ACCESS_GET_META: return VLC_EGENERIC; default: @@ -337,6 +345,7 @@ static int DemuxOpen ( vlc_object_t *p_this ) *****************************************************************************/ static int Demux( demux_t *p_demux ) { + (void)p_demux; return 0; } @@ -364,7 +373,8 @@ struct stat_list_t /***************************************************************************** * ReadDir: read a directory and add its content to the list *****************************************************************************/ -static int ReadDir( playlist_t *p_playlist, const char *psz_name, +static int ReadDir( access_t *p_access, playlist_t *p_playlist, + const char *psz_name, int i_mode, playlist_item_t *p_parent_category, input_item_t *p_current_input, @@ -374,6 +384,9 @@ static int ReadDir( playlist_t *p_playlist, const char *psz_name, int i_dir_content, i, i_return = VLC_SUCCESS; playlist_item_t *p_node; + if( !vlc_object_alive( p_access ) ) + return VLC_EGENERIC; + if( !vlc_object_alive( p_playlist ) ) return VLC_EGENERIC; @@ -488,10 +501,10 @@ static int ReadDir( playlist_t *p_playlist, const char *psz_name, p_parent_category, PLAYLIST_NO_REBUILD, NULL ); PL_UNLOCK; - + assert( p_node ); /* If we had the parent in category, the it is now node. * Else, we still don't have */ - i_return = ReadDir( p_playlist, psz_uri , MODE_EXPAND, + i_return = ReadDir( p_access, p_playlist, psz_uri , MODE_EXPAND, p_parent_category ? p_node : NULL, p_current_input, subdir, &stself ); closedir (subdir); @@ -523,19 +536,20 @@ static int ReadDir( playlist_t *p_playlist, const char *psz_name, memmove (psz_uri + 7, psz_uri, sizeof (psz_uri) - 7); memcpy (psz_uri, "file://", 7); - p_input = input_ItemNewWithType( p_playlist, + p_input = input_item_NewWithType( VLC_OBJECT( p_playlist ), psz_uri, entry, 0, NULL, -1, ITEM_TYPE_FILE ); if (p_input != NULL) { if( p_current_input ) - input_ItemCopyOptions( p_current_input, p_input ); + input_item_CopyOptions( p_current_input, p_input ); + assert( p_parent_category ); int i_ret = playlist_BothAddInput( p_playlist, p_input, p_parent_category, PLAYLIST_APPEND|PLAYLIST_PREPARSE| PLAYLIST_NO_REBUILD, PLAYLIST_END, NULL, NULL, - false ); + pl_Unlocked ); vlc_gc_decref( p_input ); if( i_ret != VLC_SUCCESS ) return VLC_EGENERIC;