-
-/*****************************************************************************
- * 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 );
-}
-
-static int Filter( struct direct *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 )
-{
- DIR * p_current_dir;
- struct dirent * p_dir_content;
- struct dirent ** pp_dir_content;
- int i_dir_content;
- playlist_item_t *p_node;
- int i = 0;
-
- /* Change the item to a node */
- if( p_parent->i_children == -1)
- {
- playlist_ItemToNode( 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;
- }
- 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 );
- p_dir_content = readdir( p_current_dir );
- 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_ItemNew( p_playlist,
- psz_uri, p_dir_content->d_name );
- 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;
-}
-
-