📄 directory.c
字号:
p_playlist->status.i_view, p_playlist->status.p_item, NULL ); } if( psz_name ) free( psz_name ); vlc_object_release( p_playlist ); /* Return fake data forever */ p_access->pf_read = ReadNull; return ReadNull( p_access, p_buffer, i_len );}/***************************************************************************** * DemuxOpen: *****************************************************************************/static int Control( access_t *p_access, int i_query, va_list args ){ vlc_bool_t *pb_bool; int *pi_int; int64_t *pi_64; switch( i_query ) { /* */ case ACCESS_CAN_SEEK: case ACCESS_CAN_FASTSEEK: case ACCESS_CAN_PAUSE: case ACCESS_CAN_CONTROL_PACE: pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* ); *pb_bool = VLC_FALSE; /* FIXME */ break; /* */ case ACCESS_GET_MTU: pi_int = (int*)va_arg( args, int * ); *pi_int = 0; break; case ACCESS_GET_PTS_DELAY: pi_64 = (int64_t*)va_arg( args, int64_t * ); *pi_64 = DEFAULT_PTS_DELAY * 1000; break; /* */ case ACCESS_SET_PAUSE_STATE: case ACCESS_GET_TITLE_INFO: case ACCESS_SET_TITLE: case ACCESS_SET_SEEKPOINT: case ACCESS_SET_PRIVATE_ID_STATE: return VLC_EGENERIC; default: msg_Warn( p_access, "unimplemented query in control" ); return VLC_EGENERIC; } return VLC_SUCCESS;}/***************************************************************************** * 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( 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, const char *psz_name, int i_mode, playlist_item_t *p_parent ){ struct dirent **pp_dir_content = 0; int i_dir_content, i, i_return = VLC_SUCCESS; playlist_item_t *p_node; char **ppsz_extensions = 0; int i_extensions = 0; char *psz_ignore; /* 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 */ if( pp_dir_content ) free( pp_dir_content ); return VLC_SUCCESS; } /* Build array with ignores */ psz_ignore = var_CreateGetString( p_playlist, "ignore-filetypes" ); if( psz_ignore && *psz_ignore ) { char *psz_parser = psz_ignore; int a; for( a = 0; psz_parser[a] != '\0'; a++ ) { if( psz_parser[a] == ',' ) i_extensions++; } ppsz_extensions = (char **)malloc( sizeof( char * ) * i_extensions ); for( a = 0; a < i_extensions; a++ ) { char *tmp, *ptr; while( psz_parser[0] != '\0' && psz_parser[0] == ' ' ) psz_parser++; ptr = strchr( psz_parser, ','); tmp = ( ptr == NULL ) ? strdup( psz_parser ) : strndup( psz_parser, ptr - psz_parser ); ppsz_extensions[a] = tmp; psz_parser = ptr + 1; } } /* Change the item to a node */ if( p_parent->i_children == -1 ) { playlist_LockItemToNode( p_playlist,p_parent ); } /* While we still have entries in the directory */ for( i = 0; i < i_dir_content; i++ ) { struct dirent *p_dir_content = pp_dir_content[i]; 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; if( !stat( psz_uri, &stat_data ) && 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 defined( S_ISLNK )/* * FIXME: there is a ToCToU race condition here; but it is rather tricky * impossible to fix while keeping some kind of portable code, and maybe even * in a non-portable way. */ if( lstat( psz_uri, &stat_data ) || S_ISLNK(stat_data.st_mode) ) { msg_Dbg( p_playlist, "skipping directory symlink %s", psz_uri ); free( psz_uri ); continue; }#endif if( i_mode == MODE_NONE ) { msg_Dbg( p_playlist, "skipping subdirectory %s", psz_uri ); free( psz_uri ); continue; } else if( i_mode == MODE_EXPAND ) { char *psz_newname, *psz_tmp; msg_Dbg(p_playlist, "reading subdirectory %s", psz_uri ); psz_tmp = FromLocale( p_dir_content->d_name ); psz_newname = vlc_fix_readdir_charset( p_playlist, psz_tmp ); LocaleFree( psz_tmp ); 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; /* an strdup() just because of Mac OS X */ free( psz_newname ); /* If we had the parent in category, the it is now node. * Else, we still don't have */ if( ReadDir( p_playlist, psz_uri , MODE_EXPAND, p_node ) != VLC_SUCCESS ) { i_return = VLC_EGENERIC; break; } } } else { playlist_item_t *p_item; char *psz_tmp1, *psz_tmp2, *psz_loc; if( i_extensions > 0 ) { char *psz_dot = strrchr( p_dir_content->d_name, '.' ); if( psz_dot++ && *psz_dot ) { int a; for( a = 0; a < i_extensions; a++ ) { if( !strcmp( psz_dot, ppsz_extensions[a] ) ) break; } if( a < i_extensions ) { msg_Dbg( p_playlist, "ignoring file %s", psz_uri ); free( psz_uri ); continue; } } } psz_loc = FromLocale( psz_uri ); psz_tmp1 = vlc_fix_readdir_charset( VLC_OBJECT(p_playlist), psz_loc ); LocaleFree( psz_loc ); psz_loc = FromLocale( p_dir_content->d_name ); psz_tmp2 = vlc_fix_readdir_charset( VLC_OBJECT(p_playlist), psz_loc ); LocaleFree( psz_loc ); p_item = playlist_ItemNewWithType( VLC_OBJECT(p_playlist), psz_tmp1, psz_tmp2, ITEM_TYPE_VFILE ); playlist_NodeAddItem( p_playlist,p_item, p_parent->pp_parents[0]->i_view, p_parent, PLAYLIST_APPEND | PLAYLIST_PREPARSE, PLAYLIST_END ); playlist_CopyParents( p_parent, p_item ); } } free( psz_uri ); } for( i = 0; i < i_extensions; i++ ) if( ppsz_extensions[i] ) free( ppsz_extensions[i] ); if( ppsz_extensions ) free( ppsz_extensions ); if( psz_ignore ) free( psz_ignore ); for( i = 0; i < i_dir_content; i++ ) if( pp_dir_content[i] ) free( pp_dir_content[i] ); if( pp_dir_content ) free( pp_dir_content ); return i_return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -