117 lines
2.3 KiB
C++
117 lines
2.3 KiB
C++
|
|
#include "./stacked.hpp"
|
|
|
|
#include <algorithm>
|
|
#include "../detect.hpp"
|
|
|
|
namespace mijin
|
|
{
|
|
|
|
//
|
|
// internal defines
|
|
//
|
|
|
|
//
|
|
// internal constants
|
|
//
|
|
|
|
//
|
|
// internal types
|
|
//
|
|
|
|
//
|
|
// internal variables
|
|
//
|
|
|
|
//
|
|
// internal functions
|
|
//
|
|
|
|
//
|
|
// public functions
|
|
//
|
|
|
|
std::vector<FolderEntry> StackedFileSystemAdapter::listFiles(PathView folder)
|
|
{
|
|
std::vector<FolderEntry> files;
|
|
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
for (const FolderEntry& entry : adapter->listFiles(folder))
|
|
{
|
|
auto it = std::ranges::find_if(files, [&](const FolderEntry& existing)
|
|
{
|
|
return existing.path == entry.path;
|
|
});
|
|
if (it == files.end()) {
|
|
files.push_back(entry);
|
|
}
|
|
}
|
|
}
|
|
|
|
return files;
|
|
}
|
|
|
|
FileInfo StackedFileSystemAdapter::getFileInfo(PathView file)
|
|
{
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
FileInfo fileInfo = adapter->getFileInfo(file);
|
|
if (fileInfo.exists) {
|
|
return fileInfo;
|
|
}
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
Optional<NativePath> StackedFileSystemAdapter::getNativePath(PathView file)
|
|
{
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
Optional<NativePath> result = adapter->getNativePath(file);
|
|
if (!result.empty())
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
return NULL_OPTIONAL;
|
|
}
|
|
|
|
StreamError StackedFileSystemAdapter::open(PathView path, FileOpenMode mode, std::unique_ptr<Stream>& outStream)
|
|
{
|
|
// try to open existing files first
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
const FileInfo fileInfo = adapter->getFileInfo(path);
|
|
if (fileInfo.exists)
|
|
{
|
|
return adapter->open(path, mode, outStream);
|
|
}
|
|
}
|
|
|
|
// if that doesn't work we attempt to write, try creating it
|
|
if (mode == FileOpenMode::WRITE || mode == FileOpenMode::READ_WRITE)
|
|
{
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
const StreamError error = adapter->open(path, mode, outStream);
|
|
if (error == StreamError::SUCCESS)
|
|
{
|
|
return StreamError::SUCCESS;
|
|
}
|
|
}
|
|
}
|
|
return StreamError::IO_ERROR;
|
|
}
|
|
|
|
void StackedFileSystemAdapter::getAllPaths(PathView path, std::vector<PathReference>& outPaths)
|
|
{
|
|
for (auto& adapter : adapters_)
|
|
{
|
|
adapter->getAllPaths(path, outPaths);
|
|
}
|
|
}
|
|
|
|
} // namespace mijin
|