[vlc-devel] [discussion] To be, or not to be, a directory! [ pf_readdir vs STREAM_IS_DIRECTORY ]
Filip Roséen
filip at atch.se
Fri Jul 22 01:42:45 CEST 2016
Introduction
============
/**
* stream_t definition
*/
struct stream_t
{
*/ ... */
/**
* Read directory.
*
* Callback to fill an item node from a directory
* (see doc/browsing.txt for details).
*
* NULL if the stream is not a directory.
*/
int (*pf_readdir)(stream_t *, input_item_node_t *);
/* ... */
};
Given the new, and awesome (thank you Remi), documentation in
`include/vlc_stream.h` it is clear that we have two mechanisms to
check whether a `stream_t*` refers to a directory or not - as such,
one of them is redundant.
I propose that we resolve the issue by either;
- remove `STREAM_IS_DIRECTORY` and rely entirely on the state of
`stream_t.pf_readdir`, or;
- change the documented behavior (remove the constraint of
`pf_readdir`), so that `STREAM_IS_DIRECTORY` is the mechanism
to use.
Discussion
----------
The contents later in this post will contain my immediate reactions
relevant to this issue, but the purpose of this post is of course to
discuss the following:
- What should we do about `STREAM_IS_DIRECTORY` and
the constraints documented for `stream_t.pf_readdir`?
-----------------------------------------------------------------------
Note: `s->pf_readdir == NULL` is currently b0rked
-------------------------------------------------
The currently documented behavior does not correspond to what we
actually do when creating an access.
Below is the relevant snippet from `src/input/access.c`:
stream_t *stream_AccessNew(vlc_object_t *parent, input_thread_t *input,
bool preparsing, const char *url)
{
/* ... */
if (access->pf_readdir != NULL)
s->pf_readdir = AStreamReadDir;
else
s->pf_readdir = AStreamNoReadDir;
/* ... */
}
-----------------------------------------------------------------------
Immediate reactions
===================
Given that we have two alternatives, this section will include my
thoughts on the different paths we can decide to walk.
I strongly feel that we should not have two separate mechanisms for
checking the same thing.
Implications of removing `STREAM_IS_DIRECTORY`
----------------------------------------------
- **Unable to privatize callbacks**
It will be more complicated to (in the future) move `pf_readdir`
(and the related callbacks) currently within `struct stream_t` to
a private area not accessible by entities, outside the core/the
module itself, using a stream.
- **The codebase currently favors `STREAM_IS_DIRECTORY`**
As previously stated in the *Note*, `stream_AccessNew` must comply
with the mentioned documented behavior (it currently does not, and
has not since (at least) d2e07d11 (2015-08-25).
- **Conditional paths on `s->pf_readdir` are non-existant**
As far as I can see, there is not a single place where the state
of `s->pf_readdir` (where `s` can be any `stream_t*`) is used to
check whether a stream is considered a directory or not.
Implications of removing the constraints of `pf_readdir`
--------------------------------------------------------
- **More difficult to check stream-"type"**
It will require additional logic in order to check whether a
stream is a directory or not. `if( s->pf_readdir )` is of course
easier to write than the below:
bool b_isdir;
if( stream_Control( s, STREAM_IS_DIRECTORY, &b_isdir ) )
b_isdir = false;
if( b_isdir )
{
/* ... */
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20160722/d8ffa134/attachment.html>
More information about the vlc-devel
mailing list