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

View File

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

View File

@ -153,6 +153,26 @@ Song::UpdateFileInArchive(const Storage &storage)
#endif #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 bool
DetachedSong::Update() DetachedSong::Update()
{ {
@ -160,21 +180,7 @@ DetachedSong::Update()
const AllocatedPath path_fs = const AllocatedPath path_fs =
AllocatedPath::FromUTF8(GetRealURI()); AllocatedPath::FromUTF8(GetRealURI());
FileInfo fi; return LoadFile(path_fs);
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;
} else if (IsRemote()) { } else if (IsRemote()) {
TagBuilder tag_builder; TagBuilder tag_builder;
if (!tag_stream_scan(uri.c_str(), full_tag_handler, 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); return print_error(r, error);
DetachedSong song(path_utf8); DetachedSong song(path_utf8);
if (!song.Update()) { if (!song.LoadFile(path_fs)) {
r.Error(ACK_ERROR_NO_EXIST, "No such file"); r.Error(ACK_ERROR_NO_EXIST, "No such file");
return CommandResult::ERROR; return CommandResult::ERROR;
} }

View File

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