From 3840a03dbbf8a3f530fa16e0f029970881564716 Mon Sep 17 00:00:00 2001 From: Thomas Guillem <thomas@gllm.fr> Date: Thu, 7 May 2015 09:34:27 +0200 Subject: [PATCH] access: extend STREAM_IS_DIRECTORY It now takes two new bool* arguments. - specify if the access returns items that are already sorted. - specify if directories can loop into themselves --- include/vlc_access.h | 7 +++++++ include/vlc_stream.h | 2 +- modules/access/archive/stream.c | 11 ++++++++++- modules/demux/playlist/directory.c | 3 ++- modules/demux/playlist/playlist.h | 2 +- src/input/demux.c | 6 +++++- src/input/stream.c | 6 ++++++ 7 files changed, 32 insertions(+), 5 deletions(-) diff --git a/include/vlc_access.h b/include/vlc_access.h index a23d3b1d2293..a6a84cf3c8fd 100644 --- a/include/vlc_access.h +++ b/include/vlc_access.h @@ -111,6 +111,13 @@ struct access_t { uint64_t i_pos; /* idem */ bool b_eof; /* idem */ + + bool b_dir_sorted; /* Set it to true if items returned by + * pf_readdir are already sorted. */ + + bool b_dir_can_loop; /* Set it to true if the access can't know + * if children can loop into their parents. + * It's the case for most network accesses. */ } info; access_sys_t *p_sys; diff --git a/include/vlc_stream.h b/include/vlc_stream.h index a9e85862399e..dda58ceb4abb 100644 --- a/include/vlc_stream.h +++ b/include/vlc_stream.h @@ -93,7 +93,7 @@ enum stream_query_e STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/ STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/ STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/ - STREAM_IS_DIRECTORY, /**< arg1= bool * res=cannot fail*/ + STREAM_IS_DIRECTORY, /**< arg1= bool *, arg2= bool *, arg3=bool *, res=cannot fail*/ /* */ STREAM_SET_POSITION, /**< arg1= uint64_t res=can fail */ diff --git a/modules/access/archive/stream.c b/modules/access/archive/stream.c index a74bf535d6fb..3b9887ef9c34 100644 --- a/modules/access/archive/stream.c +++ b/modules/access/archive/stream.c @@ -47,8 +47,17 @@ static int Control(stream_t *p_stream, int i_query, va_list args) switch( i_query ) { case STREAM_IS_DIRECTORY: - *va_arg( args, bool* ) = true; + { + bool *pb_canreaddir = va_arg( args, bool * ); + bool *pb_dirsorted = va_arg( args, bool * ); + bool *pb_dircanloop = va_arg( args, bool * ); + *pb_canreaddir = true; + if (pb_dirsorted) + *pb_dirsorted = false; + if (pb_dircanloop) + pb_dircanloop = false; break; + } case STREAM_CAN_SEEK: case STREAM_CAN_FASTSEEK: diff --git a/modules/demux/playlist/directory.c b/modules/demux/playlist/directory.c index f614307e0c53..30b2bfa9df3b 100644 --- a/modules/demux/playlist/directory.c +++ b/modules/demux/playlist/directory.c @@ -44,7 +44,8 @@ int Import_Dir ( vlc_object_t *p_this) demux_t *p_demux = (demux_t *)p_this; bool b_is_dir = false; - int i_err = stream_Control( p_demux->s, STREAM_IS_DIRECTORY, &b_is_dir ); + int i_err = stream_Control( p_demux->s, STREAM_IS_DIRECTORY, &b_is_dir, + NULL, NULL ); if ( !( i_err == VLC_SUCCESS && b_is_dir ) ) return VLC_EGENERIC; diff --git a/modules/demux/playlist/playlist.h b/modules/demux/playlist/playlist.h index ea6ef4be08a2..eb3a58320036 100644 --- a/modules/demux/playlist/playlist.h +++ b/modules/demux/playlist/playlist.h @@ -84,7 +84,7 @@ bool CheckContentType( stream_t * p_stream, const char * psz_ctype ); #define CHECK_FILE() do { \ bool b_is_dir = false; \ - stream_Control( ((demux_t *)p_this)->s, STREAM_IS_DIRECTORY, &b_is_dir ); \ + stream_Control( ((demux_t *)p_this)->s, STREAM_IS_DIRECTORY, &b_is_dir, NULL, NULL ); \ if( b_is_dir ) \ return VLC_EGENERIC; \ } while(0) diff --git a/src/input/demux.c b/src/input/demux.c index dcc6b16cdecc..ff5c1ba23b1d 100644 --- a/src/input/demux.c +++ b/src/input/demux.c @@ -309,7 +309,11 @@ int demux_vaControlHelper( stream_t *s, return stream_vaControl( s, STREAM_GET_META, args ); case DEMUX_IS_PLAYLIST: - return stream_vaControl(s, STREAM_IS_DIRECTORY, args ); + { + bool *pb_isplaylist = va_arg( args, bool * ); + return stream_Control( s, STREAM_IS_DIRECTORY, pb_isplaylist, + NULL, NULL ); + } case DEMUX_GET_PTS_DELAY: case DEMUX_GET_FPS: diff --git a/src/input/stream.c b/src/input/stream.c index e2207422fc66..b74a05c1cc03 100644 --- a/src/input/stream.c +++ b/src/input/stream.c @@ -644,7 +644,13 @@ static int AStreamControl( stream_t *s, int i_query, va_list args ) case STREAM_IS_DIRECTORY: { bool *pb_canreaddir = va_arg( args, bool * ); + bool *pb_dirsorted = va_arg( args, bool * ); + bool *pb_dircanloop = va_arg( args, bool * ); *pb_canreaddir = p_sys->method == STREAM_METHOD_READDIR; + if( pb_dirsorted ) + *pb_dirsorted = p_access->info.b_dir_sorted; + if( pb_dircanloop ) + *pb_dircanloop = p_access->info.b_dir_can_loop; return VLC_SUCCESS; } -- GitLab