diff --git a/src/db/update/Container.cxx b/src/db/update/Container.cxx index 8f11ae5f0..01f2edfa0 100644 --- a/src/db/update/Container.cxx +++ b/src/db/update/Container.cxx @@ -31,6 +31,7 @@ #include "tag/TagHandler.hxx" #include "tag/TagBuilder.hxx" #include "Log.hxx" +#include "util/AllocatedString.hxx" Directory * UpdateWalk::MakeDirectoryIfModified(Directory &parent, const char *name, @@ -95,16 +96,16 @@ UpdateWalk::UpdateContainerFile(Directory &directory, return false; } - char *vtrack; + AllocatedString<> vtrack = nullptr; unsigned int tnum = 0; TagBuilder tag_builder; while ((vtrack = plugin.container_scan(pathname, ++tnum)) != nullptr) { - Song *song = Song::NewFile(vtrack, *contdir); + Song *song = Song::NewFile(vtrack.c_str(), *contdir); // shouldn't be necessary but it's there.. song->mtime = info.mtime; - const auto vtrack_fs = AllocatedPath::FromUTF8(vtrack); + const auto vtrack_fs = AllocatedPath::FromUTF8(vtrack.c_str()); // TODO: check vtrack_fs.IsNull() const auto child_path_fs = AllocatedPath::Build(pathname, @@ -122,8 +123,7 @@ UpdateWalk::UpdateContainerFile(Directory &directory, modified = true; FormatDefault(update_domain, "added %s/%s", - directory.GetPath(), vtrack); - delete[] vtrack; + directory.GetPath(), vtrack.c_str()); } if (tnum == 1) { diff --git a/src/decoder/DecoderPlugin.hxx b/src/decoder/DecoderPlugin.hxx index 4bb57e14f..1c3042a18 100644 --- a/src/decoder/DecoderPlugin.hxx +++ b/src/decoder/DecoderPlugin.hxx @@ -26,6 +26,7 @@ struct ConfigBlock; class InputStream; struct TagHandler; class Path; +template class AllocatedString; /** * Opaque handle which the decoder plugin passes to the functions in @@ -95,10 +96,8 @@ struct DecoderPlugin { * @return nullptr if there are no multiple files * a filename for every single track according to tnum (param 2) * do not include full pathname here, just the "virtual" file - * - * Free the return value with delete[]. */ - char* (*container_scan)(Path path_fs, const unsigned int tnum); + AllocatedString (*container_scan)(Path path_fs, unsigned tnum); /* last element in these arrays must always be a nullptr: */ const char *const*suffixes; diff --git a/src/decoder/plugins/GmeDecoderPlugin.cxx b/src/decoder/plugins/GmeDecoderPlugin.cxx index 0791f39e0..e853450e6 100644 --- a/src/decoder/plugins/GmeDecoderPlugin.cxx +++ b/src/decoder/plugins/GmeDecoderPlugin.cxx @@ -103,7 +103,7 @@ ParseContainerPath(Path path_fs) return { path_fs.GetDirectoryName(), track - 1 }; } -static char * +static AllocatedString<> gme_container_scan(Path path_fs, const unsigned int tnum) { Music_Emu *emu; @@ -123,7 +123,7 @@ gme_container_scan(Path path_fs, const unsigned int tnum) const char *subtune_suffix = uri_get_suffix(path_fs.c_str()); if (tnum <= num_songs){ return FormatString(SUBTUNE_PREFIX "%03u.%s", - tnum, subtune_suffix).Steal(); + tnum, subtune_suffix); } else return nullptr; } diff --git a/src/decoder/plugins/SidplayDecoderPlugin.cxx b/src/decoder/plugins/SidplayDecoderPlugin.cxx index 50c6ec4c6..3226d3794 100644 --- a/src/decoder/plugins/SidplayDecoderPlugin.cxx +++ b/src/decoder/plugins/SidplayDecoderPlugin.cxx @@ -336,7 +336,7 @@ sidplay_scan_file(Path path_fs, return true; } -static char * +static AllocatedString<> sidplay_container_scan(Path path_fs, const unsigned int tnum) { SidTune tune(path_fs.c_str(), nullptr, true); @@ -353,7 +353,7 @@ sidplay_container_scan(Path path_fs, const unsigned int tnum) /* Construct container/tune path names, eg. Delta.sid/tune_001.sid */ if(tnum<=info.songs) { - return FormatString(SUBTUNE_PREFIX "%03u.sid", tnum).Steal(); + return FormatString(SUBTUNE_PREFIX "%03u.sid", tnum); } else return nullptr; }