diff --git a/src/playlist/PlaylistAny.cxx b/src/playlist/PlaylistAny.cxx index 232351f5d..6c1c6367d 100644 --- a/src/playlist/PlaylistAny.cxx +++ b/src/playlist/PlaylistAny.cxx @@ -21,9 +21,10 @@ #include "PlaylistAny.hxx" #include "PlaylistStream.hxx" #include "PlaylistMapper.hxx" +#include "SongEnumerator.hxx" #include "util/UriUtil.hxx" -SongEnumerator * +std::unique_ptr playlist_open_any(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, diff --git a/src/playlist/PlaylistAny.hxx b/src/playlist/PlaylistAny.hxx index fbcc99860..f2f3fb4a0 100644 --- a/src/playlist/PlaylistAny.hxx +++ b/src/playlist/PlaylistAny.hxx @@ -20,6 +20,8 @@ #ifndef MPD_PLAYLIST_ANY_HXX #define MPD_PLAYLIST_ANY_HXX +#include + class Mutex; class Cond; class SongEnumerator; @@ -30,7 +32,7 @@ class Storage; * absolute remote URI (with a scheme) or a relative path to the * music or playlist directory. */ -SongEnumerator * +std::unique_ptr playlist_open_any(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, diff --git a/src/playlist/PlaylistMapper.cxx b/src/playlist/PlaylistMapper.cxx index 096db226c..aa79febc9 100644 --- a/src/playlist/PlaylistMapper.cxx +++ b/src/playlist/PlaylistMapper.cxx @@ -21,6 +21,7 @@ #include "PlaylistMapper.hxx" #include "PlaylistFile.hxx" #include "PlaylistStream.hxx" +#include "SongEnumerator.hxx" #include "Mapper.hxx" #include "fs/AllocatedPath.hxx" #include "storage/StorageInterface.hxx" @@ -31,7 +32,7 @@ /** * Load a playlist from the configured playlist directory. */ -static SongEnumerator * +static std::unique_ptr playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond) { assert(spl_valid_name(uri)); @@ -48,7 +49,7 @@ playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond) /** * Load a playlist from the configured music directory. */ -static SongEnumerator * +static std::unique_ptr playlist_open_in_storage(const char *uri, const Storage *storage, Mutex &mutex, Cond &cond) { @@ -69,7 +70,7 @@ playlist_open_in_storage(const char *uri, const Storage *storage, #endif -SongEnumerator * +std::unique_ptr playlist_mapper_open(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, diff --git a/src/playlist/PlaylistMapper.hxx b/src/playlist/PlaylistMapper.hxx index d0b48f11c..116faa46e 100644 --- a/src/playlist/PlaylistMapper.hxx +++ b/src/playlist/PlaylistMapper.hxx @@ -22,6 +22,8 @@ #include "check.h" +#include + class Mutex; class Cond; class SongEnumerator; @@ -31,7 +33,7 @@ class Storage; * Opens a playlist from an URI relative to the playlist or music * directory. */ -SongEnumerator * +std::unique_ptr playlist_mapper_open(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, diff --git a/src/playlist/PlaylistPlugin.hxx b/src/playlist/PlaylistPlugin.hxx index d3f9d5281..93b1ccc2a 100644 --- a/src/playlist/PlaylistPlugin.hxx +++ b/src/playlist/PlaylistPlugin.hxx @@ -51,8 +51,8 @@ struct playlist_plugin { * Opens the playlist on the specified URI. This URI has * either matched one of the schemes or one of the suffixes. */ - SongEnumerator *(*open_uri)(const char *uri, - Mutex &mutex, Cond &cond); + std::unique_ptr (*open_uri)(const char *uri, + Mutex &mutex, Cond &cond); /** * Opens the playlist in the specified input stream. It has @@ -62,7 +62,7 @@ struct playlist_plugin { * @parm is the input stream; the pointer will not be * invalidated when the function returns nullptr */ - SongEnumerator *(*open_stream)(InputStreamPtr &&is); + std::unique_ptr (*open_stream)(InputStreamPtr &&is); const char *const*schemes; const char *const*suffixes; diff --git a/src/playlist/PlaylistRegistry.cxx b/src/playlist/PlaylistRegistry.cxx index d489f3734..b152e07bc 100644 --- a/src/playlist/PlaylistRegistry.cxx +++ b/src/playlist/PlaylistRegistry.cxx @@ -20,6 +20,7 @@ #include "config.h" #include "PlaylistRegistry.hxx" #include "PlaylistPlugin.hxx" +#include "SongEnumerator.hxx" #include "plugins/ExtM3uPlaylistPlugin.hxx" #include "plugins/M3uPlaylistPlugin.hxx" #include "plugins/XspfPlaylistPlugin.hxx" @@ -101,12 +102,10 @@ playlist_list_global_finish(void) playlist_plugin_finish(plugin); } -static SongEnumerator * +static std::unique_ptr playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond, bool *tried) { - SongEnumerator *playlist = nullptr; - assert(uri != nullptr); const auto scheme = uri_get_scheme(uri); @@ -121,23 +120,21 @@ playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond, if (playlist_plugins_enabled[i] && plugin->open_uri != nullptr && plugin->schemes != nullptr && StringArrayContainsCase(plugin->schemes, scheme.c_str())) { - playlist = plugin->open_uri(uri, mutex, cond); - if (playlist != nullptr) - break; + auto playlist = plugin->open_uri(uri, mutex, cond); + if (playlist) + return playlist; tried[i] = true; } } - return playlist; + return nullptr; } -static SongEnumerator * +static std::unique_ptr playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond, const bool *tried) { - SongEnumerator *playlist = nullptr; - assert(uri != nullptr); UriSuffixBuffer suffix_buffer; @@ -151,16 +148,16 @@ playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond, if (playlist_plugins_enabled[i] && !tried[i] && plugin->open_uri != nullptr && plugin->suffixes != nullptr && StringArrayContainsCase(plugin->suffixes, suffix)) { - playlist = plugin->open_uri(uri, mutex, cond); + auto playlist = plugin->open_uri(uri, mutex, cond); if (playlist != nullptr) - break; + return playlist; } } - return playlist; + return nullptr; } -SongEnumerator * +std::unique_ptr playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond) { /** this array tracks which plugins have already been tried by @@ -179,7 +176,7 @@ playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond) return playlist; } -static SongEnumerator * +static std::unique_ptr playlist_list_open_stream_mime2(InputStreamPtr &&is, const char *mime) { assert(mime != nullptr); @@ -204,7 +201,7 @@ playlist_list_open_stream_mime2(InputStreamPtr &&is, const char *mime) return nullptr; } -static SongEnumerator * +static std::unique_ptr playlist_list_open_stream_mime(InputStreamPtr &&is, const char *full_mime) { assert(full_mime != nullptr); @@ -222,7 +219,7 @@ playlist_list_open_stream_mime(InputStreamPtr &&is, const char *full_mime) return playlist_list_open_stream_mime2(std::move(is), mime.c_str()); } -SongEnumerator * +std::unique_ptr playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix) { assert(suffix != nullptr); @@ -247,7 +244,7 @@ playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix) return nullptr; } -SongEnumerator * +std::unique_ptr playlist_list_open_stream(InputStreamPtr &&is, const char *uri) { assert(is->IsReady()); diff --git a/src/playlist/PlaylistRegistry.hxx b/src/playlist/PlaylistRegistry.hxx index 97594a2fe..dd11e2ace 100644 --- a/src/playlist/PlaylistRegistry.hxx +++ b/src/playlist/PlaylistRegistry.hxx @@ -49,10 +49,10 @@ playlist_list_global_finish(); /** * Opens a playlist by its URI. */ -SongEnumerator * +std::unique_ptr playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond); -SongEnumerator * +std::unique_ptr playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix); /** @@ -62,7 +62,7 @@ playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix); * @param uri optional URI which was used to open the stream; may be * used to select the appropriate playlist plugin */ -SongEnumerator * +std::unique_ptr playlist_list_open_stream(InputStreamPtr &&is, const char *uri); /** diff --git a/src/playlist/PlaylistStream.cxx b/src/playlist/PlaylistStream.cxx index 34fdc86d6..e16162680 100644 --- a/src/playlist/PlaylistStream.cxx +++ b/src/playlist/PlaylistStream.cxx @@ -20,6 +20,7 @@ #include "config.h" #include "PlaylistStream.hxx" #include "PlaylistRegistry.hxx" +#include "SongEnumerator.hxx" #include "util/UriUtil.hxx" #include "input/InputStream.hxx" #include "input/LocalOpen.hxx" @@ -30,7 +31,7 @@ #include -static SongEnumerator * +static std::unique_ptr playlist_open_path_suffix(Path path, Mutex &mutex, Cond &cond) try { assert(!path.IsNull()); @@ -51,7 +52,7 @@ try { return nullptr; } -SongEnumerator * +std::unique_ptr playlist_open_path(Path path, Mutex &mutex, Cond &cond) try { assert(!path.IsNull()); @@ -69,12 +70,12 @@ try { return nullptr; } -SongEnumerator * +std::unique_ptr playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond) try { assert(uri_has_scheme(uri)); - SongEnumerator *playlist = playlist_list_open_uri(uri, mutex, cond); + auto playlist = playlist_list_open_uri(uri, mutex, cond); if (playlist != nullptr) return playlist; diff --git a/src/playlist/PlaylistStream.hxx b/src/playlist/PlaylistStream.hxx index 8a728cdb7..c53b9f8b0 100644 --- a/src/playlist/PlaylistStream.hxx +++ b/src/playlist/PlaylistStream.hxx @@ -22,6 +22,8 @@ #include "Compiler.h" +#include + class Mutex; class Cond; class SongEnumerator; @@ -34,11 +36,11 @@ class Path; * @return a playlist, or nullptr on error */ gcc_nonnull_all -SongEnumerator * +std::unique_ptr playlist_open_path(Path path, Mutex &mutex, Cond &cond); gcc_nonnull_all -SongEnumerator * +std::unique_ptr playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond); #endif diff --git a/src/playlist/Print.cxx b/src/playlist/Print.cxx index 6dd0509df..5c860b235 100644 --- a/src/playlist/Print.cxx +++ b/src/playlist/Print.cxx @@ -65,15 +65,14 @@ playlist_file_print(Response &r, Partition &partition, (void)partition; #endif - SongEnumerator *playlist = playlist_open_any(uri, + auto playlist = playlist_open_any(uri, #ifdef ENABLE_DATABASE - partition.instance.storage, + partition.instance.storage, #endif - mutex, cond); + mutex, cond); if (playlist == nullptr) return false; playlist_provider_print(r, loader, uri, *playlist, detail); - delete playlist; return true; } diff --git a/src/playlist/plugins/AsxPlaylistPlugin.cxx b/src/playlist/plugins/AsxPlaylistPlugin.cxx index 9398f6a2e..811d00a11 100644 --- a/src/playlist/plugins/AsxPlaylistPlugin.cxx +++ b/src/playlist/plugins/AsxPlaylistPlugin.cxx @@ -142,7 +142,7 @@ asx_char_data(void *user_data, const XML_Char *s, int len) * */ -static SongEnumerator * +static std::unique_ptr asx_open_stream(InputStreamPtr &&is) { AsxParser parser; @@ -155,7 +155,7 @@ asx_open_stream(InputStreamPtr &&is) } parser.songs.reverse(); - return new MemorySongEnumerator(std::move(parser.songs)); + return std::make_unique(std::move(parser.songs)); } static const char *const asx_suffixes[] = { diff --git a/src/playlist/plugins/CuePlaylistPlugin.cxx b/src/playlist/plugins/CuePlaylistPlugin.cxx index aaaa10ae7..c19b72ac8 100644 --- a/src/playlist/plugins/CuePlaylistPlugin.cxx +++ b/src/playlist/plugins/CuePlaylistPlugin.cxx @@ -36,10 +36,10 @@ class CuePlaylist final : public SongEnumerator { virtual std::unique_ptr NextSong() override; }; -static SongEnumerator * +static std::unique_ptr cue_playlist_open_stream(InputStreamPtr &&is) { - return new CuePlaylist(std::move(is)); + return std::make_unique(std::move(is)); } std::unique_ptr diff --git a/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx b/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx index 3be9c0652..ef99428bd 100644 --- a/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx +++ b/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx @@ -87,7 +87,7 @@ static constexpr TagHandler embcue_tag_handler = { embcue_tag_pair, }; -static SongEnumerator * +static std::unique_ptr embcue_playlist_open_uri(const char *uri, gcc_unused Mutex &mutex, gcc_unused Cond &cond) @@ -98,17 +98,15 @@ embcue_playlist_open_uri(const char *uri, const auto path_fs = AllocatedPath::FromUTF8Throw(uri); - const auto playlist = new EmbeddedCuePlaylist(); + auto playlist = std::make_unique(); - tag_file_scan(path_fs, embcue_tag_handler, playlist); + tag_file_scan(path_fs, embcue_tag_handler, playlist.get()); if (playlist->cuesheet.empty()) - ScanGenericTags(path_fs, embcue_tag_handler, playlist); + ScanGenericTags(path_fs, embcue_tag_handler, playlist.get()); - if (playlist->cuesheet.empty()) { + if (playlist->cuesheet.empty()) /* no "CUESHEET" tag found */ - delete playlist; return nullptr; - } playlist->filename = PathTraitsUTF8::GetBase(uri); diff --git a/src/playlist/plugins/ExtM3uPlaylistPlugin.cxx b/src/playlist/plugins/ExtM3uPlaylistPlugin.cxx index 454e3ea51..912aed529 100644 --- a/src/playlist/plugins/ExtM3uPlaylistPlugin.cxx +++ b/src/playlist/plugins/ExtM3uPlaylistPlugin.cxx @@ -59,18 +59,16 @@ public: virtual std::unique_ptr NextSong() override; }; -static SongEnumerator * +static std::unique_ptr extm3u_open_stream(InputStreamPtr &&is) { - ExtM3uPlaylist *playlist = new ExtM3uPlaylist(std::move(is)); + auto playlist = std::make_unique(std::move(is)); is = playlist->CheckFirstLine(); - if (is) { + if (is) /* no EXTM3U header: fall back to the plain m3u plugin */ - delete playlist; - return nullptr; - } + playlist.reset(); return playlist; } diff --git a/src/playlist/plugins/FlacPlaylistPlugin.cxx b/src/playlist/plugins/FlacPlaylistPlugin.cxx index bbd887284..58e5c9641 100644 --- a/src/playlist/plugins/FlacPlaylistPlugin.cxx +++ b/src/playlist/plugins/FlacPlaylistPlugin.cxx @@ -86,7 +86,7 @@ FlacPlaylist::NextSong() return song; } -static SongEnumerator * +static std::unique_ptr flac_playlist_open_uri(const char *uri, gcc_unused Mutex &mutex, gcc_unused Cond &cond) { @@ -109,7 +109,7 @@ flac_playlist_open_uri(const char *uri, return nullptr; } - return new FlacPlaylist(uri, cuesheet, streaminfo); + return std::make_unique(uri, cuesheet, streaminfo); } static const char *const flac_playlist_suffixes[] = { diff --git a/src/playlist/plugins/M3uPlaylistPlugin.cxx b/src/playlist/plugins/M3uPlaylistPlugin.cxx index 3402418d8..b4ca8926f 100644 --- a/src/playlist/plugins/M3uPlaylistPlugin.cxx +++ b/src/playlist/plugins/M3uPlaylistPlugin.cxx @@ -36,10 +36,10 @@ public: virtual std::unique_ptr NextSong() override; }; -static SongEnumerator * +static std::unique_ptr m3u_open_stream(InputStreamPtr &&is) { - return new M3uPlaylist(std::move(is)); + return std::make_unique(std::move(is)); } std::unique_ptr diff --git a/src/playlist/plugins/PlsPlaylistPlugin.cxx b/src/playlist/plugins/PlsPlaylistPlugin.cxx index e8cc443cd..3f114f361 100644 --- a/src/playlist/plugins/PlsPlaylistPlugin.cxx +++ b/src/playlist/plugins/PlsPlaylistPlugin.cxx @@ -153,14 +153,14 @@ ParsePls(InputStreamPtr &&is, std::forward_list &songs) return true; } -static SongEnumerator * +static std::unique_ptr pls_open_stream(InputStreamPtr &&is) { std::forward_list songs; if (!ParsePls(std::move(is), songs)) return nullptr; - return new MemorySongEnumerator(std::move(songs)); + return std::make_unique(std::move(songs)); } static const char *const pls_suffixes[] = { diff --git a/src/playlist/plugins/RssPlaylistPlugin.cxx b/src/playlist/plugins/RssPlaylistPlugin.cxx index 39f34b3a9..5644f4863 100644 --- a/src/playlist/plugins/RssPlaylistPlugin.cxx +++ b/src/playlist/plugins/RssPlaylistPlugin.cxx @@ -140,7 +140,7 @@ rss_char_data(void *user_data, const XML_Char *s, int len) * */ -static SongEnumerator * +static std::unique_ptr rss_open_stream(InputStreamPtr &&is) { RssParser parser; @@ -153,7 +153,7 @@ rss_open_stream(InputStreamPtr &&is) } parser.songs.reverse(); - return new MemorySongEnumerator(std::move(parser.songs)); + return std::make_unique(std::move(parser.songs)); } static const char *const rss_suffixes[] = { diff --git a/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx b/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx index 2ecaff20d..fdaffb6c9 100644 --- a/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx +++ b/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx @@ -234,7 +234,7 @@ soundcloud_parse_json(const char *url, Yajl::Handle &handle, * soundcloud://playlist/ * soundcloud://url/ */ -static SongEnumerator * +static std::unique_ptr soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond) { assert(strncmp(uri, "soundcloud://", 13) == 0); @@ -280,7 +280,7 @@ soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond) soundcloud_parse_json(u, handle, mutex, cond); data.songs.reverse(); - return new MemorySongEnumerator(std::move(data.songs)); + return std::make_unique(std::move(data.songs)); } static const char *const soundcloud_schemes[] = { diff --git a/src/playlist/plugins/XspfPlaylistPlugin.cxx b/src/playlist/plugins/XspfPlaylistPlugin.cxx index 5ddf901f3..479f8edf0 100644 --- a/src/playlist/plugins/XspfPlaylistPlugin.cxx +++ b/src/playlist/plugins/XspfPlaylistPlugin.cxx @@ -187,7 +187,7 @@ xspf_char_data(void *user_data, const XML_Char *s, int len) * */ -static SongEnumerator * +static std::unique_ptr xspf_open_stream(InputStreamPtr &&is) { XspfParser parser; @@ -200,7 +200,7 @@ xspf_open_stream(InputStreamPtr &&is) } parser.songs.reverse(); - return new MemorySongEnumerator(std::move(parser.songs)); + return std::make_unique(std::move(parser.songs)); } static const char *const xspf_suffixes[] = { diff --git a/test/dump_playlist.cxx b/test/dump_playlist.cxx index 3cb75a5c9..1eb84b8f8 100644 --- a/test/dump_playlist.cxx +++ b/test/dump_playlist.cxx @@ -117,7 +117,7 @@ try { /* deinitialize everything */ - delete playlist; + playlist.reset(); is.reset(); decoder_plugin_deinit_all();