SongUpdate: add UpdateFileInArchive(ArchiveFile&)

This commit is contained in:
Max Kellermann 2016-02-26 14:53:37 +01:00
parent ae37e25452
commit 35567e6507
2 changed files with 47 additions and 0 deletions

View File

@ -106,6 +106,47 @@ Song::UpdateFile(Storage &storage)
#ifdef ENABLE_ARCHIVE
Song *
Song::LoadFromArchive(ArchiveFile &archive, const char *name_utf8,
Directory &parent)
{
assert(!uri_has_scheme(name_utf8));
assert(strchr(name_utf8, '\n') == nullptr);
Song *song = NewFile(name_utf8, parent);
if (!song->UpdateFileInArchive(archive)) {
song->Free();
return nullptr;
}
return song;
}
bool
Song::UpdateFileInArchive(ArchiveFile &archive)
{
assert(parent != nullptr);
assert(parent->device == DEVICE_INARCHIVE);
std::string path_utf8(uri);
for (const Directory *directory = parent;
directory->parent != nullptr &&
directory->parent->device == DEVICE_INARCHIVE;
directory = directory->parent) {
path_utf8.insert(path_utf8.begin(), '/');
path_utf8.insert(0, directory->GetName());
}
TagBuilder tag_builder;
if (!tag_archive_scan(archive, path_utf8.c_str(), tag_builder))
return false;
tag_builder.Commit(tag);
return true;
}
bool
Song::UpdateFileInArchive(const Storage &storage)
{

View File

@ -36,6 +36,7 @@ struct LightSong;
struct Directory;
class DetachedSong;
class Storage;
class ArchiveFile;
/**
* A song file inside the configured music directory. Internal
@ -112,6 +113,11 @@ struct Song {
bool UpdateFile(Storage &storage);
#ifdef ENABLE_ARCHIVE
static Song *LoadFromArchive(ArchiveFile &archive,
const char *name_utf8,
Directory &parent);
bool UpdateFileInArchive(ArchiveFile &archive);
bool UpdateFileInArchive(const Storage &storage);
#endif