You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.1 KiB
C++

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright The Music Player Daemon Project
#include "ArchiveInputPlugin.hxx"
#include "archive/ArchiveList.hxx"
#include "archive/ArchivePlugin.hxx"
#include "archive/ArchiveFile.hxx"
#include "../InputStream.hxx"
#include "fs/LookupFile.hxx"
#include "fs/Path.hxx"
#include "lib/fmt/ExceptionFormatter.hxx"
#include "lib/fmt/PathFormatter.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
static constexpr Domain input_domain("input");
InputStreamPtr
OpenArchiveInputStream(Path path, Mutex &mutex)
{
const ArchivePlugin *arplug;
ArchiveLookupResult l;
try {
l = LookupFile(path);
if (l.archive.IsNull()) {
return nullptr;
}
} catch (...) {
FmtDebug(input_domain,
"not an archive, lookup {:?} failed: {}",
path, std::current_exception());
return nullptr;
}
const char *suffix = l.archive.GetExtension();
if (suffix == nullptr)
return nullptr;
//check which archive plugin to use (by ext)
arplug = archive_plugin_from_suffix(suffix);
if (!arplug) {
return nullptr;
}
return archive_file_open(arplug, l.archive)
->OpenStream(l.inside.c_str(), mutex);
}