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++
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);
|
|
}
|