InputStream: add static method OpenReady()
Merge some duplicate code.
This commit is contained in:
@@ -57,6 +57,28 @@ InputStream::Open(const char *url,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
InputStream *
|
||||
InputStream::OpenReady(const char *uri,
|
||||
Mutex &mutex, Cond &cond,
|
||||
Error &error)
|
||||
{
|
||||
InputStream *is = Open(uri, mutex, cond, error);
|
||||
if (is == nullptr)
|
||||
return nullptr;
|
||||
|
||||
mutex.lock();
|
||||
is->WaitReady();
|
||||
bool success = is->Check(error);
|
||||
mutex.unlock();
|
||||
|
||||
if (!success) {
|
||||
is->Close();
|
||||
is = nullptr;
|
||||
}
|
||||
|
||||
return is;
|
||||
}
|
||||
|
||||
bool
|
||||
InputStream::Check(Error &error)
|
||||
{
|
||||
|
@@ -118,6 +118,15 @@ struct InputStream {
|
||||
static InputStream *Open(const char *uri, Mutex &mutex, Cond &cond,
|
||||
Error &error);
|
||||
|
||||
/**
|
||||
* Just like Open(), but waits for the stream to become ready.
|
||||
* It is a wrapper for Open(), WaitReady() and Check().
|
||||
*/
|
||||
gcc_malloc gcc_nonnull_all
|
||||
static InputStream *OpenReady(const char *uri,
|
||||
Mutex &mutex, Cond &cond,
|
||||
Error &error);
|
||||
|
||||
/**
|
||||
* Close the input stream and free resources.
|
||||
*
|
||||
|
@@ -41,7 +41,7 @@ playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond,
|
||||
}
|
||||
|
||||
Error error;
|
||||
InputStream *is = InputStream::Open(uri, mutex, cond, error);
|
||||
InputStream *is = InputStream::OpenReady(uri, mutex, cond, error);
|
||||
if (is == nullptr) {
|
||||
if (error.IsDefined())
|
||||
FormatError(error, "Failed to open %s", uri);
|
||||
|
@@ -269,9 +269,7 @@ playlist_list_open_stream_suffix(InputStream &is, const char *suffix)
|
||||
SongEnumerator *
|
||||
playlist_list_open_stream(InputStream &is, const char *uri)
|
||||
{
|
||||
const char *suffix;
|
||||
|
||||
is.LockWaitReady();
|
||||
assert(is.ready);
|
||||
|
||||
const char *const mime = is.GetMimeType();
|
||||
if (mime != nullptr) {
|
||||
@@ -280,7 +278,7 @@ playlist_list_open_stream(InputStream &is, const char *uri)
|
||||
return playlist;
|
||||
}
|
||||
|
||||
suffix = uri != nullptr ? uri_get_suffix(uri) : nullptr;
|
||||
const char *suffix = uri != nullptr ? uri_get_suffix(uri) : nullptr;
|
||||
if (suffix != nullptr) {
|
||||
auto playlist = playlist_list_open_stream_suffix(is, suffix);
|
||||
if (playlist != nullptr)
|
||||
@@ -317,7 +315,7 @@ playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond,
|
||||
return nullptr;
|
||||
|
||||
Error error;
|
||||
InputStream *is = InputStream::Open(path_fs, mutex, cond, error);
|
||||
InputStream *is = InputStream::OpenReady(path_fs, mutex, cond, error);
|
||||
if (is == nullptr) {
|
||||
if (error.IsDefined())
|
||||
LogError(error);
|
||||
@@ -325,8 +323,6 @@ playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
is->LockWaitReady();
|
||||
|
||||
auto playlist = playlist_list_open_stream_suffix(*is, suffix);
|
||||
if (playlist != nullptr)
|
||||
*is_r = is;
|
||||
|
@@ -62,9 +62,9 @@ public:
|
||||
|
||||
/* open the InputStream (if not already open) */
|
||||
if (is == nullptr) {
|
||||
is = InputStream::Open(path_fs.c_str(),
|
||||
mutex, cond,
|
||||
IgnoreError());
|
||||
is = InputStream::OpenReady(path_fs.c_str(),
|
||||
mutex, cond,
|
||||
IgnoreError());
|
||||
if (is == nullptr)
|
||||
return false;
|
||||
} else
|
||||
|
@@ -146,7 +146,7 @@ bz2_open(const char *pathname, Error &error)
|
||||
{
|
||||
static Mutex mutex;
|
||||
static Cond cond;
|
||||
InputStream *is = InputStream::Open(pathname, mutex, cond, error);
|
||||
InputStream *is = InputStream::OpenReady(pathname, mutex, cond, error);
|
||||
if (is == nullptr)
|
||||
return nullptr;
|
||||
|
||||
|
@@ -254,8 +254,8 @@ soundcloud_parse_json(const char *url, yajl_handle hand,
|
||||
Mutex &mutex, Cond &cond)
|
||||
{
|
||||
Error error;
|
||||
InputStream *input_stream = InputStream::Open(url, mutex, cond,
|
||||
error);
|
||||
InputStream *input_stream = InputStream::OpenReady(url, mutex, cond,
|
||||
error);
|
||||
if (input_stream == nullptr) {
|
||||
if (error.IsDefined())
|
||||
LogError(error);
|
||||
@@ -263,7 +263,6 @@ soundcloud_parse_json(const char *url, yajl_handle hand,
|
||||
}
|
||||
|
||||
mutex.lock();
|
||||
input_stream->WaitReady();
|
||||
|
||||
yajl_status stat;
|
||||
int done = 0;
|
||||
|
Reference in New Issue
Block a user