aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--src/playlist/PlaylistAny.cxx35
-rw-r--r--src/playlist/PlaylistMapper.cxx11
-rw-r--r--src/playlist/PlaylistRegistry.cxx32
-rw-r--r--src/playlist/PlaylistRegistry.hxx14
-rw-r--r--src/playlist/PlaylistStream.cxx93
-rw-r--r--src/playlist/PlaylistStream.hxx45
7 files changed, 145 insertions, 86 deletions
diff --git a/Makefile.am b/Makefile.am
index 19e4b255d..cb7dafa1b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -153,6 +153,7 @@ src_mpd_SOURCES = \
src/PlaylistTag.cxx \
src/PlaylistPrint.cxx src/PlaylistPrint.hxx \
src/PlaylistSave.cxx src/PlaylistSave.hxx \
+ src/playlist/PlaylistStream.cxx src/playlist/PlaylistStream.hxx \
src/playlist/PlaylistMapper.cxx src/playlist/PlaylistMapper.hxx \
src/playlist/PlaylistAny.cxx src/playlist/PlaylistAny.hxx \
src/playlist/PlaylistSong.cxx src/playlist/PlaylistSong.hxx \
diff --git a/src/playlist/PlaylistAny.cxx b/src/playlist/PlaylistAny.cxx
index 671802e7d..457de18b3 100644
--- a/src/playlist/PlaylistAny.cxx
+++ b/src/playlist/PlaylistAny.cxx
@@ -19,42 +19,9 @@
#include "config.h"
#include "PlaylistAny.hxx"
+#include "PlaylistStream.hxx"
#include "PlaylistMapper.hxx"
-#include "PlaylistRegistry.hxx"
-#include "CloseSongEnumerator.hxx"
#include "util/UriUtil.hxx"
-#include "util/Error.hxx"
-#include "input/InputStream.hxx"
-#include "Log.hxx"
-
-#include <assert.h>
-
-static SongEnumerator *
-playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond)
-{
- assert(uri_has_scheme(uri));
-
- SongEnumerator *playlist = playlist_list_open_uri(uri, mutex, cond);
- if (playlist != nullptr)
- return playlist;
-
- Error error;
- InputStream *is = InputStream::OpenReady(uri, mutex, cond, error);
- if (is == nullptr) {
- if (error.IsDefined())
- FormatError(error, "Failed to open %s", uri);
-
- return nullptr;
- }
-
- playlist = playlist_list_open_stream(*is, uri);
- if (playlist == nullptr) {
- is->Close();
- return nullptr;
- }
-
- return new CloseSongEnumerator(playlist, is);
-}
SongEnumerator *
playlist_open_any(const char *uri, Mutex &mutex, Cond &cond)
diff --git a/src/playlist/PlaylistMapper.cxx b/src/playlist/PlaylistMapper.cxx
index 1211e892c..141e0563f 100644
--- a/src/playlist/PlaylistMapper.cxx
+++ b/src/playlist/PlaylistMapper.cxx
@@ -20,6 +20,7 @@
#include "config.h"
#include "PlaylistMapper.hxx"
#include "PlaylistFile.hxx"
+#include "PlaylistStream.hxx"
#include "PlaylistRegistry.hxx"
#include "Mapper.hxx"
#include "fs/AllocatedPath.hxx"
@@ -27,16 +28,6 @@
#include <assert.h>
-static SongEnumerator *
-playlist_open_path(const char *path_fs, Mutex &mutex, Cond &cond)
-{
- auto playlist = playlist_list_open_uri(path_fs, mutex, cond);
- if (playlist == nullptr)
- playlist = playlist_list_open_path(path_fs, mutex, cond);
-
- return playlist;
-}
-
/**
* Load a playlist from the configured playlist directory.
*/
diff --git a/src/playlist/PlaylistRegistry.cxx b/src/playlist/PlaylistRegistry.cxx
index 6b594e3c5..9439039ef 100644
--- a/src/playlist/PlaylistRegistry.cxx
+++ b/src/playlist/PlaylistRegistry.cxx
@@ -20,7 +20,6 @@
#include "config.h"
#include "PlaylistRegistry.hxx"
#include "PlaylistPlugin.hxx"
-#include "CloseSongEnumerator.hxx"
#include "plugins/ExtM3uPlaylistPlugin.hxx"
#include "plugins/M3uPlaylistPlugin.hxx"
#include "plugins/XspfPlaylistPlugin.hxx"
@@ -221,7 +220,7 @@ playlist_list_open_stream_mime(InputStream &is, const char *full_mime)
return playlist_list_open_stream_mime2(is, mime.c_str());
}
-static SongEnumerator *
+SongEnumerator *
playlist_list_open_stream_suffix(InputStream &is, const char *suffix)
{
assert(suffix != nullptr);
@@ -278,32 +277,3 @@ playlist_suffix_supported(const char *suffix)
return false;
}
-
-SongEnumerator *
-playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond)
-{
- const char *suffix;
-
- assert(path_fs != nullptr);
-
- suffix = uri_get_suffix(path_fs);
- if (suffix == nullptr || !playlist_suffix_supported(suffix))
- return nullptr;
-
- Error error;
- InputStream *is = InputStream::OpenReady(path_fs, mutex, cond, error);
- if (is == nullptr) {
- if (error.IsDefined())
- LogError(error);
-
- return nullptr;
- }
-
- auto playlist = playlist_list_open_stream_suffix(*is, suffix);
- if (playlist != nullptr)
- playlist = new CloseSongEnumerator(playlist, is);
- else
- is->Close();
-
- return playlist;
-}
diff --git a/src/playlist/PlaylistRegistry.hxx b/src/playlist/PlaylistRegistry.hxx
index d8a24f4af..f1833b925 100644
--- a/src/playlist/PlaylistRegistry.hxx
+++ b/src/playlist/PlaylistRegistry.hxx
@@ -51,6 +51,9 @@ playlist_list_global_finish(void);
SongEnumerator *
playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond);
+SongEnumerator *
+playlist_list_open_stream_suffix(InputStream &is, const char *suffix);
+
/**
* Opens a playlist from an input stream.
*
@@ -68,15 +71,4 @@ playlist_list_open_stream(InputStream &is, const char *uri);
bool
playlist_suffix_supported(const char *suffix);
-/**
- * Opens a playlist from a local file.
- *
- * @param path_fs the path of the playlist file
- * @param is_r on success, an input_stream object is returned here,
- * which must be closed after the playlist_provider object is freed
- * @return a playlist, or nullptr on error
- */
-SongEnumerator *
-playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond);
-
#endif
diff --git a/src/playlist/PlaylistStream.cxx b/src/playlist/PlaylistStream.cxx
new file mode 100644
index 000000000..6222a768d
--- /dev/null
+++ b/src/playlist/PlaylistStream.cxx
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+#include "PlaylistStream.hxx"
+#include "PlaylistRegistry.hxx"
+#include "CloseSongEnumerator.hxx"
+#include "util/UriUtil.hxx"
+#include "util/Error.hxx"
+#include "input/InputStream.hxx"
+#include "Log.hxx"
+
+#include <assert.h>
+
+static SongEnumerator *
+playlist_open_path_suffix(const char *path_fs, Mutex &mutex, Cond &cond)
+{
+ assert(path_fs != nullptr);
+
+ const char *suffix = uri_get_suffix(path_fs);
+ if (suffix == nullptr || !playlist_suffix_supported(suffix))
+ return nullptr;
+
+ Error error;
+ InputStream *is = InputStream::OpenReady(path_fs, mutex, cond, error);
+ if (is == nullptr) {
+ if (error.IsDefined())
+ LogError(error);
+
+ return nullptr;
+ }
+
+ auto playlist = playlist_list_open_stream_suffix(*is, suffix);
+ if (playlist != nullptr)
+ playlist = new CloseSongEnumerator(playlist, is);
+ else
+ is->Close();
+
+ return playlist;
+}
+
+SongEnumerator *
+playlist_open_path(const char *path_fs, Mutex &mutex, Cond &cond)
+{
+ auto playlist = playlist_list_open_uri(path_fs, mutex, cond);
+ if (playlist == nullptr)
+ playlist = playlist_open_path_suffix(path_fs, mutex, cond);
+
+ return playlist;
+}
+
+SongEnumerator *
+playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond)
+{
+ assert(uri_has_scheme(uri));
+
+ SongEnumerator *playlist = playlist_list_open_uri(uri, mutex, cond);
+ if (playlist != nullptr)
+ return playlist;
+
+ Error error;
+ InputStream *is = InputStream::OpenReady(uri, mutex, cond, error);
+ if (is == nullptr) {
+ if (error.IsDefined())
+ FormatError(error, "Failed to open %s", uri);
+
+ return nullptr;
+ }
+
+ playlist = playlist_list_open_stream(*is, uri);
+ if (playlist == nullptr) {
+ is->Close();
+ return nullptr;
+ }
+
+ return new CloseSongEnumerator(playlist, is);
+}
diff --git a/src/playlist/PlaylistStream.hxx b/src/playlist/PlaylistStream.hxx
new file mode 100644
index 000000000..02f5485ef
--- /dev/null
+++ b/src/playlist/PlaylistStream.hxx
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPD_PLAYLIST_STREAM_HXX
+#define MPD_PLAYLIST_STREAM_HXX
+
+#include "Compiler.h"
+
+class Mutex;
+class Cond;
+class SongEnumerator;
+
+/**
+ * Opens a playlist from a local file.
+ *
+ * @param path_fs the path of the playlist file
+ * @param is_r on success, an input_stream object is returned here,
+ * which must be closed after the playlist_provider object is freed
+ * @return a playlist, or nullptr on error
+ */
+gcc_nonnull_all
+SongEnumerator *
+playlist_open_path(const char *path_fs, Mutex &mutex, Cond &cond);
+
+gcc_nonnull_all
+SongEnumerator *
+playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond);
+
+#endif