Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
Steve Lhomme
VLC
Commits
e4a403d7
Commit
e4a403d7
authored
Sep 20, 2017
by
Thomas Guillem
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
input: rename access_fsdir to vlc_readdir_helper
This helper can now be used by other modules like "stream directory".
parent
c458178a
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
153 additions
and
148 deletions
+153
-148
include/vlc_input_item.h
include/vlc_input_item.h
+16
-14
modules/access/directory.c
modules/access/directory.c
+5
-4
modules/access/dsm/access.c
modules/access/dsm/access.c
+12
-11
modules/access/ftp.c
modules/access/ftp.c
+5
-5
modules/access/nfs.c
modules/access/nfs.c
+10
-10
modules/access/sftp.c
modules/access/sftp.c
+5
-5
modules/access/smb.c
modules/access/smb.c
+5
-5
src/input/item.c
src/input/item.c
+92
-91
src/libvlccore.sym
src/libvlccore.sym
+3
-3
No files found.
include/vlc_input_item.h
View file @
e4a403d7
...
...
@@ -412,11 +412,11 @@ struct input_stats_t
/**
* Access pf_readdir helper struct
* \see
access_fsdi
r_init()
* \see
access_fsdi
r_additem()
* \see
access_fsdi
r_finish()
* \see
vlc_readdir_helpe
r_init()
* \see
vlc_readdir_helpe
r_additem()
* \see
vlc_readdir_helpe
r_finish()
*/
struct
access_fsdi
r
struct
vlc_readdir_helpe
r
{
input_item_node_t
*
p_node
;
void
**
pp_slaves
;
...
...
@@ -427,32 +427,34 @@ struct access_fsdir
};
/**
* Init a
access_fsdi
r struct
* Init a
vlc_readdir_helpe
r struct
*
* \param p_
fsdir
need to be cleaned with
access_fsdi
r_finish()
* \param p_
rdh
need to be cleaned with
vlc_readdir_helpe
r_finish()
* \param p_node node that will be used to add items
*/
VLC_API
void
access_fsdir_init
(
struct
access_fsdir
*
p_fsdir
,
stream_t
*
p_access
,
input_item_node_t
*
p_node
);
VLC_API
void
vlc_readdir_helper_init
(
struct
vlc_readdir_helper
*
p_rdh
,
vlc_object_t
*
p_obj
,
input_item_node_t
*
p_node
);
#define vlc_readdir_helper_init(p_rdh, p_obj, p_node) \
vlc_readdir_helper_init(p_rdh, VLC_OBJECT(p_obj), p_node)
/**
* Finish adding items to the node
*
* \param b_success if true, items of the node will be sorted.
*/
VLC_API
void
access_fsdir_finish
(
struct
access_fsdir
*
p_fsdir
,
bool
b_success
);
VLC_API
void
vlc_readdir_helper_finish
(
struct
vlc_readdir_helper
*
p_rdh
,
bool
b_success
);
/**
* Add a new input_item_t entry to the node of the
access_fsdi
r struct.
* Add a new input_item_t entry to the node of the
vlc_readdir_helpe
r struct.
*
* \param p_
fsdir
previously inited
access_fsdi
r struct
* \param p_
rdh
previously inited
vlc_readdir_helpe
r struct
* \param psz_uri uri of the new item
* \param psz_filename file name of the new item
* \param i_type see \ref input_item_type_e
* \param i_net see \ref input_item_net_type
*/
VLC_API
int
access_fsdir_additem
(
struct
access_fsdir
*
p_fsdir
,
const
char
*
psz_uri
,
const
char
*
psz_filename
,
int
i_type
,
int
i_net
);
VLC_API
int
vlc_readdir_helper_additem
(
struct
vlc_readdir_helper
*
p_rdh
,
const
char
*
psz_uri
,
const
char
*
psz_filename
,
int
i_type
,
int
i_net
);
#endif
modules/access/directory.c
View file @
e4a403d7
...
...
@@ -117,8 +117,8 @@ int DirRead (stream_t *access, input_item_node_t *node)
bool
special_files
=
var_InheritBool
(
access
,
"list-special-files"
);
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
access
,
node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
access
,
node
);
while
(
ret
==
VLC_SUCCESS
&&
(
entry
=
vlc_readdir
(
sys
->
dir
))
!=
NULL
)
{
...
...
@@ -181,11 +181,12 @@ int DirRead (stream_t *access, input_item_node_t *node)
ret
=
VLC_ENOMEM
;
break
;
}
ret
=
access_fsdir_additem
(
&
fsdir
,
uri
,
entry
,
type
,
ITEM_NET_UNKNOWN
);
ret
=
vlc_readdir_helper_additem
(
&
rdh
,
uri
,
entry
,
type
,
ITEM_NET_UNKNOWN
);
free
(
uri
);
}
access_fsdi
r_finish
(
&
fsdir
,
ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
ret
==
VLC_SUCCESS
);
return
ret
;
}
modules/access/dsm/access.c
View file @
e4a403d7
...
...
@@ -98,7 +98,7 @@ static int BrowserInit( stream_t *p_access );
static
int
get_address
(
stream_t
*
p_access
);
static
int
login
(
stream_t
*
p_access
);
static
bool
get_path
(
stream_t
*
p_access
);
static
int
add_item
(
stream_t
*
p_access
,
struct
access_fsdir
*
p_fsdir
,
static
int
add_item
(
stream_t
*
p_access
,
struct
vlc_readdir_helper
*
p_rdh
,
const
char
*
psz_name
,
int
i_type
);
struct
access_sys_t
...
...
@@ -511,7 +511,7 @@ static int Control( stream_t *p_access, int i_query, va_list args )
return
VLC_SUCCESS
;
}
static
int
add_item
(
stream_t
*
p_access
,
struct
access_fsdir
*
p_fsdir
,
static
int
add_item
(
stream_t
*
p_access
,
struct
vlc_readdir_helper
*
p_rdh
,
const
char
*
psz_name
,
int
i_type
)
{
char
*
psz_uri
;
...
...
@@ -529,7 +529,8 @@ static int add_item( stream_t *p_access, struct access_fsdir *p_fsdir,
if
(
i_ret
==
-
1
)
return
VLC_ENOMEM
;
return
access_fsdir_additem
(
p_fsdir
,
psz_uri
,
psz_name
,
i_type
,
ITEM_NET
);
return
vlc_readdir_helper_additem
(
p_rdh
,
psz_uri
,
psz_name
,
i_type
,
ITEM_NET
);
}
static
int
BrowseShare
(
stream_t
*
p_access
,
input_item_node_t
*
p_node
)
...
...
@@ -544,8 +545,8 @@ static int BrowseShare( stream_t *p_access, input_item_node_t *p_node )
!=
DSM_SUCCESS
)
return
VLC_EGENERIC
;
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_node
);
for
(
size_t
i
=
0
;
i
<
share_count
&&
i_ret
==
VLC_SUCCESS
;
i
++
)
{
...
...
@@ -554,10 +555,10 @@ static int BrowseShare( stream_t *p_access, input_item_node_t *p_node )
if
(
psz_name
[
strlen
(
psz_name
)
-
1
]
==
'$'
)
continue
;
i_ret
=
add_item
(
p_access
,
&
fsdir
,
psz_name
,
ITEM_TYPE_DIRECTORY
);
i_ret
=
add_item
(
p_access
,
&
rdh
,
psz_name
,
ITEM_TYPE_DIRECTORY
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
smb_share_list_destroy
(
shares
);
return
i_ret
;
...
...
@@ -586,8 +587,8 @@ static int BrowseDirectory( stream_t *p_access, input_item_node_t *p_node )
if
(
files
==
NULL
)
return
VLC_EGENERIC
;
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_node
);
files_count
=
smb_stat_list_count
(
files
);
for
(
size_t
i
=
0
;
i
<
files_count
&&
i_ret
==
VLC_SUCCESS
;
i
++
)
...
...
@@ -605,10 +606,10 @@ static int BrowseDirectory( stream_t *p_access, input_item_node_t *p_node )
i_type
=
smb_stat_get
(
st
,
SMB_STAT_ISDIR
)
?
ITEM_TYPE_DIRECTORY
:
ITEM_TYPE_FILE
;
i_ret
=
add_item
(
p_access
,
&
fsdir
,
psz_name
,
i_type
);
i_ret
=
add_item
(
p_access
,
&
rdh
,
psz_name
,
i_type
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
smb_stat_list_destroy
(
files
);
return
i_ret
;
...
...
modules/access/ftp.c
View file @
e4a403d7
...
...
@@ -911,8 +911,8 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_current_node)
assert
(
p_sys
->
data
!=
NULL
);
assert
(
!
p_sys
->
out
);
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_current_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_current_node
);
while
(
i_ret
==
VLC_SUCCESS
)
{
...
...
@@ -956,15 +956,15 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_current_node)
p_sys
->
url
.
psz_path
?
p_sys
->
url
.
psz_path
:
""
,
psz_filename
)
!=
-
1
)
{
i_ret
=
access_fsdi
r_additem
(
&
fsdir
,
psz_uri
,
psz_file
,
type
,
ITEM_NET
);
i_ret
=
vlc_readdir_helpe
r_additem
(
&
rdh
,
psz_uri
,
psz_file
,
type
,
ITEM_NET
);
free
(
psz_uri
);
}
free
(
psz_filename
);
free
(
psz_line
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
return
i_ret
;
}
...
...
modules/access/nfs.c
View file @
e4a403d7
...
...
@@ -329,8 +329,8 @@ DirRead(stream_t *p_access, input_item_node_t *p_node)
int
i_ret
=
VLC_SUCCESS
;
assert
(
p_sys
->
p_nfsdir
);
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_node
);
while
(
i_ret
==
VLC_SUCCESS
&&
(
p_nfsdirent
=
nfs_readdir
(
p_sys
->
p_nfs
,
p_sys
->
p_nfsdir
))
!=
NULL
)
...
...
@@ -361,12 +361,12 @@ DirRead(stream_t *p_access, input_item_node_t *p_node)
default:
i_type
=
ITEM_TYPE_UNKNOWN
;
}
i_ret
=
access_fsdi
r_additem
(
&
fsdir
,
psz_url
,
p_nfsdirent
->
name
,
i_type
,
ITEM_NET
);
i_ret
=
vlc_readdir_helpe
r_additem
(
&
rdh
,
psz_url
,
p_nfsdirent
->
name
,
i_type
,
ITEM_NET
);
free
(
psz_url
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
return
i_ret
;
}
...
...
@@ -378,8 +378,8 @@ MountRead(stream_t *p_access, input_item_node_t *p_node)
assert
(
p_sys
->
p_mount
!=
NULL
&&
p_sys
->
res
.
exports
.
i_count
>=
0
);
int
i_ret
=
VLC_SUCCESS
;
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_node
);
for
(
int
i
=
0
;
i
<
p_sys
->
res
.
exports
.
i_count
&&
i_ret
==
VLC_SUCCESS
;
++
i
)
{
...
...
@@ -391,12 +391,12 @@ MountRead(stream_t *p_access, input_item_node_t *p_node)
i_ret
=
VLC_ENOMEM
;
break
;
}
i_ret
=
access_fsdi
r_additem
(
&
fsdir
,
psz_url
,
psz_name
,
ITEM_TYPE_DIRECTORY
,
ITEM_NET
);
i_ret
=
vlc_readdir_helpe
r_additem
(
&
rdh
,
psz_url
,
psz_name
,
ITEM_TYPE_DIRECTORY
,
ITEM_NET
);
free
(
psz_url
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
return
i_ret
;
}
...
...
modules/access/sftp.c
View file @
e4a403d7
...
...
@@ -547,8 +547,8 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_current_node)
if
(
!
psz_file
)
return
VLC_ENOMEM
;
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_current_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_current_node
);
while
(
i_ret
==
VLC_SUCCESS
&&
0
!=
(
err
=
libssh2_sftp_readdir
(
p_sys
->
file
,
psz_file
,
i_size
,
&
attrs
)
)
)
...
...
@@ -589,12 +589,12 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_current_node)
free
(
psz_uri
);
int
i_type
=
LIBSSH2_SFTP_S_ISDIR
(
attrs
.
permissions
)
?
ITEM_TYPE_DIRECTORY
:
ITEM_TYPE_FILE
;
i_ret
=
access_fsdi
r_additem
(
&
fsdir
,
psz_full_uri
,
psz_file
,
i_type
,
ITEM_NET
);
i_ret
=
vlc_readdir_helpe
r_additem
(
&
rdh
,
psz_full_uri
,
psz_file
,
i_type
,
ITEM_NET
);
free
(
psz_full_uri
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
free
(
psz_file
);
return
i_ret
;
}
modules/access/smb.c
View file @
e4a403d7
...
...
@@ -340,8 +340,8 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_node )
struct
smbc_dirent
*
p_entry
;
int
i_ret
=
VLC_SUCCESS
;
struct
access_fsdir
fsdir
;
access_fsdi
r_init
(
&
fsdir
,
p_access
,
p_node
);
struct
vlc_readdir_helper
rdh
;
vlc_readdir_helpe
r_init
(
&
rdh
,
p_access
,
p_node
);
while
(
i_ret
==
VLC_SUCCESS
&&
(
p_entry
=
smbc_readdir
(
p_sys
->
i_smb
)
)
)
{
...
...
@@ -388,12 +388,12 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_node )
break
;
}
free
(
psz_encoded_name
);
i_ret
=
access_fsdi
r_additem
(
&
fsdir
,
psz_uri
,
p_entry
->
name
,
i_type
,
ITEM_NET
);
i_ret
=
vlc_readdir_helpe
r_additem
(
&
rdh
,
psz_uri
,
p_entry
->
name
,
i_type
,
ITEM_NET
);
free
(
psz_uri
);
}
access_fsdi
r_finish
(
&
fsdir
,
i_ret
==
VLC_SUCCESS
);
vlc_readdir_helpe
r_finish
(
&
rdh
,
i_ret
==
VLC_SUCCESS
);
return
i_ret
;
}
...
...
src/input/item.c
View file @
e4a403d7
...
...
@@ -1322,7 +1322,7 @@ void input_item_UpdateTracksInfo(input_item_t *item, const es_format_t *fmt)
vlc_mutex_unlock
(
&
item
->
lock
);
}
static
int
compar_type
(
input_item_t
*
p1
,
input_item_t
*
p2
)
static
int
rdh_
compar_type
(
input_item_t
*
p1
,
input_item_t
*
p2
)
{
if
(
p1
->
i_type
!=
p2
->
i_type
)
{
...
...
@@ -1334,19 +1334,19 @@ static int compar_type(input_item_t *p1, input_item_t *p2)
return
0
;
}
static
int
compar_filename
(
const
void
*
a
,
const
void
*
b
)
static
int
rdh_
compar_filename
(
const
void
*
a
,
const
void
*
b
)
{
input_item_node_t
*
const
*
na
=
a
,
*
const
*
nb
=
b
;
input_item_t
*
ia
=
(
*
na
)
->
p_item
,
*
ib
=
(
*
nb
)
->
p_item
;
int
i_ret
=
compar_type
(
ia
,
ib
);
int
i_ret
=
rdh_
compar_type
(
ia
,
ib
);
if
(
i_ret
!=
0
)
return
i_ret
;
return
vlc_filenamecmp
(
ia
->
psz_name
,
ib
->
psz_name
);
}
static
void
fsdir
_sort
(
input_item_node_t
*
p_node
)
static
void
rdh
_sort
(
input_item_node_t
*
p_node
)
{
if
(
p_node
->
i_children
<=
0
)
return
;
...
...
@@ -1358,7 +1358,7 @@ static void fsdir_sort(input_item_node_t *p_node)
/* Sort current node */
qsort
(
p_node
->
pp_children
,
p_node
->
i_children
,
sizeof
(
input_item_node_t
*
),
compar_filename
);
sizeof
(
input_item_node_t
*
),
rdh_
compar_filename
);
/* Unlock all children */
for
(
int
i
=
0
;
i
<
p_node
->
i_children
;
i
++
)
...
...
@@ -1366,14 +1366,14 @@ static void fsdir_sort(input_item_node_t *p_node)
/* Sort all children */
for
(
int
i
=
0
;
i
<
p_node
->
i_children
;
i
++
)
fsdir
_sort
(
p_node
->
pp_children
[
i
]);
rdh
_sort
(
p_node
->
pp_children
[
i
]);
}
/**
* Does the provided file name has one of the extension provided ?
*/
static
bool
fsdir
_has_ext
(
const
char
*
psz_filename
,
const
char
*
psz_ignored_exts
)
static
bool
rdh_file
_has_ext
(
const
char
*
psz_filename
,
const
char
*
psz_ignored_exts
)
{
if
(
psz_ignored_exts
==
NULL
)
return
false
;
...
...
@@ -1400,24 +1400,24 @@ static bool fsdir_has_ext(const char *psz_filename,
return
false
;
}
static
bool
fsdir
_is_ignored
(
struct
access_fsdir
*
p_fsdir
,
const
char
*
psz_filename
)
static
bool
rdh_file
_is_ignored
(
struct
vlc_readdir_helper
*
p_rdh
,
const
char
*
psz_filename
)
{
return
(
psz_filename
[
0
]
==
'\0'
||
strcmp
(
psz_filename
,
"."
)
==
0
||
strcmp
(
psz_filename
,
".."
)
==
0
||
(
!
p_
fsdir
->
b_show_hiddenfiles
&&
psz_filename
[
0
]
==
'.'
)
||
fsdir
_has_ext
(
psz_filename
,
p_
fsdir
->
psz_ignored_exts
));
||
(
!
p_
rdh
->
b_show_hiddenfiles
&&
psz_filename
[
0
]
==
'.'
)
||
rdh_file
_has_ext
(
psz_filename
,
p_
rdh
->
psz_ignored_exts
));
}
struct
fsdir
_slave
struct
rdh
_slave
{
input_item_slave_t
*
p_slave
;
char
*
psz_filename
;
input_item_node_t
*
p_node
;
};
static
char
*
fsdir
_name_from_filename
(
const
char
*
psz_filename
)
static
char
*
rdh
_name_from_filename
(
const
char
*
psz_filename
)
{
/* remove leading white spaces */
while
(
*
psz_filename
!=
'\0'
&&
*
psz_filename
==
' '
)
...
...
@@ -1448,13 +1448,13 @@ static char *fsdir_name_from_filename(const char *psz_filename)
return
psz_name
;
}
static
uint8_t
fsdir
_get_slave_priority
(
input_item_t
*
p_item
,
input_item_slave_t
*
p_slave
,
const
char
*
psz_slave_filename
)
static
uint8_t
rdh
_get_slave_priority
(
input_item_t
*
p_item
,
input_item_slave_t
*
p_slave
,
const
char
*
psz_slave_filename
)
{
uint8_t
i_priority
=
SLAVE_PRIORITY_MATCH_NONE
;
char
*
psz_item_name
=
fsdir
_name_from_filename
(
p_item
->
psz_name
);
char
*
psz_slave_name
=
fsdir
_name_from_filename
(
psz_slave_filename
);
char
*
psz_item_name
=
rdh
_name_from_filename
(
p_item
->
psz_name
);
char
*
psz_slave_name
=
rdh
_name_from_filename
(
psz_slave_filename
);
if
(
!
psz_item_name
||
!
psz_slave_name
)
goto
done
;
...
...
@@ -1498,10 +1498,10 @@ done:
return
i_priority
;
}
static
int
fsdir
_should_match_idx
(
struct
access_fsdir
*
p_fsdir
,
struct
fsdir
_slave
*
p_
fsdir
_sub
)
static
int
rdh
_should_match_idx
(
struct
vlc_readdir_helper
*
p_rdh
,
struct
rdh
_slave
*
p_
rdh
_sub
)
{
char
*
psz_ext
=
strrchr
(
p_
fsdir
_sub
->
psz_filename
,
'.'
);
char
*
psz_ext
=
strrchr
(
p_
rdh
_sub
->
psz_filename
,
'.'
);
if
(
!
psz_ext
)
return
false
;
psz_ext
++
;
...
...
@@ -1509,25 +1509,25 @@ static int fsdir_should_match_idx(struct access_fsdir *p_fsdir,
if
(
strcasecmp
(
psz_ext
,
"sub"
)
!=
0
)
return
false
;
for
(
unsigned
int
i
=
0
;
i
<
p_
fsdir
->
i_slaves
;
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
p_
rdh
->
i_slaves
;
i
++
)
{
struct
fsdir
_slave
*
p_
fsdir
_slave
=
p_
fsdir
->
pp_slaves
[
i
];
struct
rdh
_slave
*
p_
rdh
_slave
=
p_
rdh
->
pp_slaves
[
i
];
if
(
p_
fsdir
_slave
==
NULL
||
p_
fsdir
_slave
==
p_
fsdir
_sub
)
if
(
p_
rdh
_slave
==
NULL
||
p_
rdh
_slave
==
p_
rdh
_sub
)
continue
;
/* check that priorities match */
if
(
p_
fsdir
_slave
->
p_slave
->
i_priority
!=
p_
fsdir
_sub
->
p_slave
->
i_priority
)
if
(
p_
rdh
_slave
->
p_slave
->
i_priority
!=
p_
rdh
_sub
->
p_slave
->
i_priority
)
continue
;
/* check that the filenames without extension match */
if
(
strncasecmp
(
p_
fsdir
_sub
->
psz_filename
,
p_
fsdir
_slave
->
psz_filename
,
strlen
(
p_
fsdir
_sub
->
psz_filename
)
-
3
)
!=
0
)
if
(
strncasecmp
(
p_
rdh
_sub
->
psz_filename
,
p_
rdh
_slave
->
psz_filename
,
strlen
(
p_
rdh
_sub
->
psz_filename
)
-
3
)
!=
0
)
continue
;
/* check that we have an idx file */
char
*
psz_ext_idx
=
strrchr
(
p_
fsdir
_slave
->
psz_filename
,
'.'
);
char
*
psz_ext_idx
=
strrchr
(
p_
rdh
_slave
->
psz_filename
,
'.'
);
if
(
psz_ext_idx
==
NULL
)
continue
;
psz_ext_idx
++
;
...
...
@@ -1537,42 +1537,42 @@ static int fsdir_should_match_idx(struct access_fsdir *p_fsdir,
return
false
;
}
static
void
fsdir
_attach_slaves
(
struct
access_fsdir
*
p_fsdir
)
static
void
rdh
_attach_slaves
(
struct
vlc_readdir_helper
*
p_rdh
)
{
if
(
p_
fsdir
->
i_sub_autodetect_fuzzy
==
0
)
if
(
p_
rdh
->
i_sub_autodetect_fuzzy
==
0
)
return
;
/* Try to match slaves for each items of the node */
for
(
int
i
=
0
;
i
<
p_
fsdir
->
p_node
->
i_children
;
i
++
)
for
(
int
i
=
0
;
i
<
p_
rdh
->
p_node
->
i_children
;
i
++
)
{
input_item_node_t
*
p_node
=
p_
fsdir
->
p_node
->
pp_children
[
i
];
input_item_node_t
*
p_node
=
p_
rdh
->
p_node
->
pp_children
[
i
];
input_item_t
*
p_item
=
p_node
->
p_item
;
for
(
unsigned
int
j
=
0
;
j
<
p_
fsdir
->
i_slaves
;
j
++
)
for
(
unsigned
int
j
=
0
;
j
<
p_
rdh
->
i_slaves
;
j
++
)
{
struct
fsdir
_slave
*
p_
fsdir
_slave
=
p_
fsdir
->
pp_slaves
[
j
];
struct
rdh
_slave
*
p_
rdh
_slave
=
p_
rdh
->
pp_slaves
[
j
];
/* Don't try to match slaves with themselves or slaves already
* attached with the higher priority */
if
(
p_
fsdir
_slave
->
p_node
==
p_node
||
p_
fsdir
_slave
->
p_slave
->
i_priority
==
SLAVE_PRIORITY_MATCH_ALL
)
if
(
p_
rdh
_slave
->
p_node
==
p_node
||
p_
rdh
_slave
->
p_slave
->
i_priority
==
SLAVE_PRIORITY_MATCH_ALL
)
continue
;
uint8_t
i_priority
=
fsdir
_get_slave_priority
(
p_item
,
p_
fsdir
_slave
->
p_slave
,
p_
fsdir
_slave
->
psz_filename
);
rdh
_get_slave_priority
(
p_item
,
p_
rdh
_slave
->
p_slave
,
p_
rdh
_slave
->
psz_filename
);
if
(
i_priority
<
p_
fsdir
->
i_sub_autodetect_fuzzy
)
if
(
i_priority
<
p_
rdh
->
i_sub_autodetect_fuzzy
)
continue
;
/* Drop the ".sub" slave if a ".idx" slave matches */
if
(
p_
fsdir
_slave
->
p_slave
->
i_type
==
SLAVE_TYPE_SPU
&&
fsdir
_should_match_idx
(
p_
fsdir
,
p_fsdir
_slave
))
if
(
p_
rdh
_slave
->
p_slave
->
i_type
==
SLAVE_TYPE_SPU
&&
rdh
_should_match_idx
(
p_
rdh
,
p_rdh
_slave
))
continue
;
input_item_slave_t
*
p_slave
=
input_item_slave_New
(
p_
fsdir
_slave
->
p_slave
->
psz_uri
,
p_
fsdir
_slave
->
p_slave
->
i_type
,
input_item_slave_New
(
p_
rdh
_slave
->
p_slave
->
psz_uri
,
p_
rdh
_slave
->
p_slave
->
i_type
,
i_priority
);
if
(
p_slave
==
NULL
)
break
;
...
...
@@ -1585,84 +1585,85 @@ static void fsdir_attach_slaves(struct access_fsdir *p_fsdir)
/* Remove the corresponding node if any: This slave won't be
* added in the parent node */
if
(
p_
fsdir
_slave
->
p_node
!=
NULL
)
if
(
p_
rdh
_slave
->
p_node
!=
NULL
)
{
input_item_node_RemoveNode
(
p_
fsdir
->
p_node
,
p_
fsdir
_slave
->
p_node
);
input_item_node_Delete
(
p_
fsdir
_slave
->
p_node
);
p_
fsdir
_slave
->
p_node
=
NULL
;
input_item_node_RemoveNode
(
p_
rdh
->
p_node
,
p_
rdh
_slave
->
p_node
);
input_item_node_Delete
(
p_
rdh
_slave
->
p_node
);
p_
rdh
_slave
->
p_node
=
NULL
;
}
p_
fsdir
_slave
->
p_slave
->
i_priority
=
i_priority
;
p_
rdh
_slave
->
p_slave
->
i_priority
=
i_priority
;
}
}
}
void
access_fsdir_init
(
struct
access_fsdir
*
p_fsdir
,
stream_t
*
p_access
,
input_item_node_t
*
p_node
)
#undef vlc_readdir_helper_init
void
vlc_readdir_helper_init
(
struct
vlc_readdir_helper
*
p_rdh
,
vlc_object_t
*
p_obj
,
input_item_node_t
*
p_node
)
{
p_
fsdir
->
p_node
=
p_node
;
p_
fsdir
->
b_show_hiddenfiles
=
var_InheritBool
(
p_
access
,
"show-hiddenfiles"
);
p_
fsdir
->
psz_ignored_exts
=
var_InheritString
(
p_
access
,
"ignore-filetypes"
);
bool
b_autodetect
=
var_InheritBool
(
p_
access
,
"sub-autodetect-file"
);
p_
fsdir
->
i_sub_autodetect_fuzzy
=
!
b_autodetect
?
0
:
var_InheritInteger
(
p_
access
,
"sub-autodetect-fuzzy"
);
TAB_INIT
(
p_
fsdir
->
i_slaves
,
p_
fsdir
->
pp_slaves
);
p_
rdh
->
p_node
=
p_node
;
p_
rdh
->
b_show_hiddenfiles
=
var_InheritBool
(
p_
obj
,
"show-hiddenfiles"
);
p_
rdh
->
psz_ignored_exts
=
var_InheritString
(
p_
obj
,
"ignore-filetypes"
);
bool
b_autodetect
=
var_InheritBool
(
p_
obj
,
"sub-autodetect-file"
);
p_
rdh
->
i_sub_autodetect_fuzzy
=
!
b_autodetect
?
0
:
var_InheritInteger
(
p_
obj
,
"sub-autodetect-fuzzy"
);
TAB_INIT
(
p_
rdh
->
i_slaves
,
p_
rdh
->
pp_slaves
);
}
void
access_fsdir_finish
(
struct
access_fsdir
*
p_fsdir
,
bool
b_success
)
void
vlc_readdir_helper_finish
(
struct
vlc_readdir_helper
*
p_rdh
,
bool
b_success
)
{
if
(
b_success
)
{
fsdir
_attach_slaves
(
p_
fsdir
);
fsdir
_sort
(
p_
fsdir
->
p_node
);
rdh
_attach_slaves
(
p_
rdh
);
rdh
_sort
(
p_
rdh
->
p_node
);
}
free
(
p_
fsdir
->
psz_ignored_exts
);
free
(
p_
rdh
->
psz_ignored_exts
);
/* Remove unmatched slaves */
for
(
unsigned
int
i
=
0
;
i
<
p_
fsdir
->
i_slaves
;
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
p_
rdh
->
i_slaves
;
i
++
)
{
struct
fsdir
_slave
*
p_
fsdir
_slave
=
p_
fsdir
->
pp_slaves
[
i
];
if
(
p_
fsdir
_slave
!=
NULL
)
struct
rdh
_slave
*
p_
rdh
_slave
=
p_
rdh
->
pp_slaves
[
i
];
if
(
p_
rdh
_slave
!=
NULL
)
{
input_item_slave_Delete
(
p_
fsdir
_slave
->
p_slave
);
free
(
p_
fsdir
_slave
->
psz_filename
);
free
(
p_
fsdir
_slave
);
input_item_slave_Delete
(
p_
rdh
_slave
->
p_slave
);
free
(
p_
rdh
_slave
->
psz_filename
);
free
(
p_
rdh
_slave
);
}
}
TAB_CLEAN
(
p_
fsdir
->
i_slaves
,
p_
fsdir
->
pp_slaves
);
TAB_CLEAN
(
p_
rdh
->
i_slaves
,
p_
rdh
->
pp_slaves
);
}
int
access_fsdir_additem
(
struct
access_fsdir
*
p_fsdir
,
const
char
*
psz_uri
,
const
char
*
psz_filename
,
int
i_type
,
int
i_net
)
int
vlc_readdir_helper_additem
(
struct
vlc_readdir_helper
*
p_rdh
,
const
char
*
psz_uri
,
const
char
*
psz_filename
,
int
i_type
,
int
i_net
)
{
enum
slave_type
i_slave_type
;
struct
fsdir
_slave
*
p_
fsdir
_slave
=
NULL
;
struct
rdh
_slave
*
p_
rdh
_slave
=
NULL
;
input_item_node_t
*
p_node
;
if
(
p_
fsdir
->
i_sub_autodetect_fuzzy
!=
0
if
(
p_
rdh
->
i_sub_autodetect_fuzzy
!=
0
&&
input_item_slave_GetType
(
psz_filename
,
&
i_slave_type
))
{
p_
fsdir
_slave
=
malloc
(
sizeof
(
*
p_
fsdir
_slave
));
if
(
!
p_
fsdir
_slave
)
p_
rdh
_slave
=
malloc
(
sizeof
(
*
p_
rdh
_slave
));
if
(
!
p_
rdh
_slave
)
return
VLC_ENOMEM
;