DetachedSong: move code from Update() to LoadFile()

Avoid duplicate AllocatedPath::FromUTF8() invocations in two callers.
This commit is contained in:
Max Kellermann 2015-10-20 12:10:42 +02:00
parent 76f85e6f7b
commit fc2154ee92
5 changed files with 36 additions and 26 deletions

View File

@ -32,6 +32,7 @@
struct LightSong;
class Storage;
class Path;
class DetachedSong {
friend DetachedSong DatabaseDetachSong(const Storage &db,
@ -220,6 +221,11 @@ public:
* @return true on success
*/
bool Update();
/**
* Load #tag and #mtime from a local file.
*/
bool LoadFile(Path path);
};
#endif

View File

@ -54,17 +54,15 @@ SongLoader::LoadFile(const char *path_utf8, Error &error) const
}
#endif
if (client != nullptr) {
const auto path_fs = AllocatedPath::FromUTF8(path_utf8, error);
if (path_fs.IsNull())
return nullptr;
const auto path_fs = AllocatedPath::FromUTF8(path_utf8, error);
if (path_fs.IsNull())
return nullptr;
if (!client->AllowFile(path_fs, error))
return nullptr;
}
if (client != nullptr && !client->AllowFile(path_fs, error))
return nullptr;
DetachedSong *song = new DetachedSong(path_utf8);
if (!song->Update()) {
if (!song->LoadFile(path_fs)) {
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_SONG),
"No such file");
delete song;

View File

@ -153,6 +153,26 @@ Song::UpdateFileInArchive(const Storage &storage)
#endif
bool
DetachedSong::LoadFile(Path path)
{
FileInfo fi;
if (!GetFileInfo(path, fi) || !fi.IsRegular())
return false;
TagBuilder tag_builder;
if (!tag_file_scan(path, full_tag_handler, &tag_builder))
return false;
if (tag_builder.IsEmpty())
tag_scan_fallback(path, &full_tag_handler,
&tag_builder);
mtime = fi.GetModificationTime();
tag_builder.Commit(tag);
return true;
}
bool
DetachedSong::Update()
{
@ -160,21 +180,7 @@ DetachedSong::Update()
const AllocatedPath path_fs =
AllocatedPath::FromUTF8(GetRealURI());
FileInfo fi;
if (!GetFileInfo(path_fs, fi) || !fi.IsRegular())
return false;
TagBuilder tag_builder;
if (!tag_file_scan(path_fs, full_tag_handler, &tag_builder))
return false;
if (tag_builder.IsEmpty())
tag_scan_fallback(path_fs, &full_tag_handler,
&tag_builder);
mtime = fi.GetModificationTime();
tag_builder.Commit(tag);
return true;
return LoadFile(path_fs);
} else if (IsRemote()) {
TagBuilder tag_builder;
if (!tag_stream_scan(uri.c_str(), full_tag_handler,

View File

@ -176,7 +176,7 @@ handle_lsinfo(Client &client, Request args, Response &r)
return print_error(r, error);
DetachedSong song(path_utf8);
if (!song.Update()) {
if (!song.LoadFile(path_fs)) {
r.Error(ACK_ERROR_NO_EXIST, "No such file");
return CommandResult::ERROR;
}

View File

@ -121,9 +121,9 @@ DatabaseDetachSong(gcc_unused const Database &db,
}
bool
DetachedSong::Update()
DetachedSong::LoadFile(Path path)
{
if (strcmp(GetURI(), uri1) == 0) {
if (path.ToUTF8() == uri1) {
SetTag(MakeTag1a());
return true;
}