-
-/*****************************************************************************
- * DemuxOpen:
- *****************************************************************************/
-static int DemuxOpen ( vlc_object_t *p_this )
-{
- demux_t *p_demux = (demux_t*)p_this;
-
- if( strcmp( p_demux->psz_demux, "directory" ) )
- return VLC_EGENERIC;
-
- p_demux->pf_demux = Demux;
- p_demux->pf_control = DemuxControl;
- return VLC_SUCCESS;
-}
-
-/*****************************************************************************
- * Demux: EOF
- *****************************************************************************/
-static int Demux( demux_t *p_demux )
-{
- return 0;
-}
-/*****************************************************************************
- * DemuxControl:
- *****************************************************************************/
-static int DemuxControl( demux_t *p_demux, int i_query, va_list args )
-{
- return demux2_vaControlHelper( p_demux->s, 0, 0, 0, 1, i_query, args );
-}
-
-#if defined(SYS_BEOS) || defined(WIN32)
-/* BeOS doesn't have scandir/alphasort/versionsort */
-static int alphasort( const struct dirent **a, const struct dirent **b )
-{
- return strcoll( (*a)->d_name, (*b)->d_name );
-}
-
-static int scandir( const char *name, struct dirent ***namelist,
- int (*filter) ( const struct dirent * ),
- int (*compar) ( const struct dirent **,
- const struct dirent ** ) )
-{
- DIR * p_dir;
- struct dirent * p_content;
- struct dirent ** pp_list;
- int ret, size;
-
- if( !namelist || !( p_dir = opendir( name ) ) ) return -1;
-
- ret = 0;
- pp_list = NULL;
- while( ( p_content = readdir( p_dir ) ) )
- {
- if( filter && !filter( p_content ) )
- {
- continue;
- }
- pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) );
- size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1;
- pp_list[ret] = malloc( size );
- memcpy( pp_list[ret], p_content, size );
- ret++;
- }
-
- closedir( p_dir );
-
- if( compar )
- {
- qsort( pp_list, ret, sizeof( struct dirent * ),
- (int (*)(const void *, const void *)) compar );
- }
-
- *namelist = pp_list;
- return ret;
-}
-#endif
-
-static int Filter( const struct dirent *foo )
-{
- return VLC_TRUE;
-}
-/*****************************************************************************
- * ReadDir: read a directory and add its content to the list
- *****************************************************************************/
-static int ReadDir( playlist_t *p_playlist,
- char *psz_name , int i_mode, int *pi_position,
- playlist_item_t *p_parent )
-{
- struct dirent *p_dir_content;
- struct dirent **pp_dir_content;
- int i_dir_content, i = 0;
- playlist_item_t *p_node;
-
- /* Change the item to a node */
- if( p_parent->i_children == -1 )
- {
- playlist_LockItemToNode( p_playlist,p_parent );
- }
-
- /* get the first directory entry */
- i_dir_content = scandir( psz_name, &pp_dir_content, Filter, alphasort );
- if( i_dir_content == -1 )
- {
- msg_Warn( p_playlist, "Failed to read directory" );
- return VLC_EGENERIC;
- }
- else if( i_dir_content <= 0 )
- {
- /* directory is empty */
- return VLC_SUCCESS;
- }
- p_dir_content = pp_dir_content[0];
-
- /* while we still have entries in the directory */
- while( i < i_dir_content )
- {
- int i_size_entry = strlen( psz_name ) +
- strlen( p_dir_content->d_name ) + 2;
- char *psz_uri = (char *)malloc( sizeof(char)*i_size_entry);
-
- sprintf( psz_uri, "%s/%s", psz_name, p_dir_content->d_name );
-
- /* if it starts with '.' then forget it */
- if( p_dir_content->d_name[0] != '.' )
- {
-#if defined( S_ISDIR )
- struct stat stat_data;
- stat( psz_uri, &stat_data );
- if( S_ISDIR(stat_data.st_mode) && i_mode != MODE_COLLAPSE )
-#elif defined( DT_DIR )
- if( ( p_dir_content->d_type & DT_DIR ) && i_mode != MODE_COLLAPSE )
-#else
- if( 0 )
-#endif
- {
- if( i_mode == MODE_NONE )
- {
- msg_Dbg( p_playlist, "Skipping subdirectory %s", psz_uri );
- i++;
- p_dir_content = pp_dir_content[i];
- continue;
- }
- else if(i_mode == MODE_EXPAND )
- {
- char *psz_newname;
- msg_Dbg(p_playlist, "Reading subdirectory %s", psz_uri );
-
- if( !strncmp( psz_uri, psz_name, strlen( psz_name ) ) )
- {
- char *psz_subdir = psz_uri;
- /* Skip the parent path + the separator */
- psz_subdir += strlen( psz_name ) + 1;
- psz_newname = strdup( psz_subdir );
- }
- else
- {
- psz_newname = strdup( psz_uri );
- }
- p_node = playlist_NodeCreate( p_playlist,
- p_parent->pp_parents[0]->i_view,
- psz_newname, p_parent );
-
- playlist_CopyParents( p_parent, p_node );
-
- p_node->input.i_type = ITEM_TYPE_DIRECTORY;
-
- if( ReadDir( p_playlist, psz_uri , MODE_EXPAND,
- pi_position, p_node ) != VLC_SUCCESS )
- {
- return VLC_EGENERIC;
- }
-
- free( psz_newname );
- }
- }
- else
- {
- playlist_item_t *p_item = playlist_ItemNewWithType(
- p_playlist,
- psz_uri,
- p_dir_content->d_name,
- ITEM_TYPE_VFILE );
- playlist_NodeAddItem( p_playlist,p_item,
- p_parent->pp_parents[0]->i_view,
- p_parent,
- PLAYLIST_APPEND, PLAYLIST_END );
-
- playlist_CopyParents( p_parent, p_item );
- }
- }
- free( psz_uri );
- i++;
- p_dir_content = pp_dir_content[i];
- }
- free( pp_dir_content );
- return VLC_SUCCESS;
-}