2018-07-28 00:14:03 +02:00
|
|
|
// Copyright 2018 yuzu emulator team
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include <algorithm>
|
2018-08-02 17:36:01 +02:00
|
|
|
#include <utility>
|
2018-07-28 00:14:03 +02:00
|
|
|
#include "core/file_sys/vfs_vector.h"
|
|
|
|
|
|
|
|
namespace FileSys {
|
2018-09-20 03:58:33 +02:00
|
|
|
VectorVfsFile::VectorVfsFile(std::vector<u8> initial_data, std::string name, VirtualDir parent)
|
2018-09-26 01:56:46 +02:00
|
|
|
: data(std::move(initial_data)), parent(std::move(parent)), name(std::move(name)) {}
|
2018-09-20 03:58:33 +02:00
|
|
|
|
2018-09-24 03:50:16 +02:00
|
|
|
VectorVfsFile::~VectorVfsFile() = default;
|
|
|
|
|
2018-09-20 03:58:33 +02:00
|
|
|
std::string VectorVfsFile::GetName() const {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t VectorVfsFile::GetSize() const {
|
|
|
|
return data.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsFile::Resize(size_t new_size) {
|
|
|
|
data.resize(new_size);
|
2018-09-24 03:50:16 +02:00
|
|
|
return true;
|
2018-09-20 03:58:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<VfsDirectory> VectorVfsFile::GetContainingDirectory() const {
|
|
|
|
return parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsFile::IsWritable() const {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsFile::IsReadable() const {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-09-25 23:56:14 +02:00
|
|
|
std::size_t VectorVfsFile::Read(u8* data_, std::size_t length, std::size_t offset) const {
|
2018-09-20 03:58:33 +02:00
|
|
|
const auto read = std::min(length, data.size() - offset);
|
|
|
|
std::memcpy(data_, data.data() + offset, read);
|
|
|
|
return read;
|
|
|
|
}
|
|
|
|
|
2018-09-25 23:56:14 +02:00
|
|
|
std::size_t VectorVfsFile::Write(const u8* data_, std::size_t length, std::size_t offset) {
|
2018-09-20 03:58:33 +02:00
|
|
|
if (offset + length > data.size())
|
|
|
|
data.resize(offset + length);
|
|
|
|
const auto write = std::min(length, data.size() - offset);
|
2019-02-25 00:27:49 +01:00
|
|
|
std::memcpy(data.data() + offset, data_, write);
|
2018-09-20 03:58:33 +02:00
|
|
|
return write;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsFile::Rename(std::string_view name_) {
|
|
|
|
name = name_;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VectorVfsFile::Assign(std::vector<u8> new_data) {
|
2018-09-24 03:50:16 +02:00
|
|
|
data = std::move(new_data);
|
2018-09-20 03:58:33 +02:00
|
|
|
}
|
|
|
|
|
2018-07-28 00:14:03 +02:00
|
|
|
VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_,
|
2018-08-12 04:44:50 +02:00
|
|
|
std::vector<VirtualDir> dirs_, std::string name_,
|
|
|
|
VirtualDir parent_)
|
2018-07-28 00:14:03 +02:00
|
|
|
: files(std::move(files_)), dirs(std::move(dirs_)), parent(std::move(parent_)),
|
|
|
|
name(std::move(name_)) {}
|
|
|
|
|
2018-09-20 01:19:05 +02:00
|
|
|
VectorVfsDirectory::~VectorVfsDirectory() = default;
|
|
|
|
|
2018-07-28 00:14:03 +02:00
|
|
|
std::vector<std::shared_ptr<VfsFile>> VectorVfsDirectory::GetFiles() const {
|
|
|
|
return files;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<std::shared_ptr<VfsDirectory>> VectorVfsDirectory::GetSubdirectories() const {
|
|
|
|
return dirs;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsDirectory::IsWritable() const {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsDirectory::IsReadable() const {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VectorVfsDirectory::GetName() const {
|
|
|
|
return name;
|
|
|
|
}
|
2018-08-02 17:36:01 +02:00
|
|
|
|
2018-07-28 00:14:03 +02:00
|
|
|
std::shared_ptr<VfsDirectory> VectorVfsDirectory::GetParentDirectory() const {
|
|
|
|
return parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
static bool FindAndRemoveVectorElement(std::vector<T>& vec, std::string_view name) {
|
2018-08-02 17:40:20 +02:00
|
|
|
const auto iter =
|
2018-08-02 17:36:01 +02:00
|
|
|
std::find_if(vec.begin(), vec.end(), [name](const T& e) { return e->GetName() == name; });
|
2018-07-28 00:14:03 +02:00
|
|
|
if (iter == vec.end())
|
|
|
|
return false;
|
2018-08-02 17:40:20 +02:00
|
|
|
|
2018-07-28 00:14:03 +02:00
|
|
|
vec.erase(iter);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsDirectory::DeleteSubdirectory(std::string_view name) {
|
|
|
|
return FindAndRemoveVectorElement(dirs, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsDirectory::DeleteFile(std::string_view name) {
|
|
|
|
return FindAndRemoveVectorElement(files, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VectorVfsDirectory::Rename(std::string_view name_) {
|
|
|
|
name = name_;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<VfsDirectory> VectorVfsDirectory::CreateSubdirectory(std::string_view name) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<VfsFile> VectorVfsDirectory::CreateFile(std::string_view name) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VectorVfsDirectory::AddFile(VirtualFile file) {
|
|
|
|
files.push_back(std::move(file));
|
|
|
|
}
|
|
|
|
|
|
|
|
void VectorVfsDirectory::AddDirectory(VirtualDir dir) {
|
|
|
|
dirs.push_back(std::move(dir));
|
|
|
|
}
|
|
|
|
} // namespace FileSys
|