DetachedSong: add method Update()

Don't create an intermediate Song instance when all we want is a
DetachedSong.
This commit is contained in:
Max Kellermann
2014-01-15 12:05:44 +01:00
parent df80deb070
commit 9fb82f9687
5 changed files with 55 additions and 15 deletions

View File

@@ -19,6 +19,7 @@
#include "config.h" /* must be first for large file support */
#include "Song.hxx"
#include "DetachedSong.hxx"
#include "util/UriUtil.hxx"
#include "Directory.hxx"
#include "Mapper.hxx"
@@ -126,3 +127,39 @@ Song::UpdateFileInArchive()
tag = tag_builder.CommitNew();
return true;
}
bool
DetachedSong::Update()
{
if (IsAbsoluteFile()) {
const AllocatedPath path_fs =
AllocatedPath::FromUTF8(uri.c_str());
struct stat st;
if (!StatFile(path_fs, st) || !S_ISREG(st.st_mode))
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 = st.st_mtime;
tag_builder.Commit(tag);
return true;
} else if (IsRemote()) {
TagBuilder tag_builder;
if (!tag_stream_scan(uri.c_str(), full_tag_handler,
&tag_builder))
return false;
mtime = 0;
tag_builder.Commit(tag);
return true;
} else
// TODO: implement
return false;
}