// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include "core/file_sys/vfs.h" namespace FileSys { // An implementation of VfsFile that is backed by a statically-sized array template class ArrayVfsFile : public VfsFile { public: explicit ArrayVfsFile(const std::array& data_, std::string name_ = "", VirtualDir parent_ = nullptr) : data(data_), name(std::move(name_)), parent(std::move(parent_)) {} std::string GetName() const override { return name; } std::size_t GetSize() const override { return size; } bool Resize(std::size_t new_size) override { return false; } VirtualDir GetContainingDirectory() const override { return parent; } bool IsWritable() const override { return false; } bool IsReadable() const override { return true; } std::size_t Read(u8* data_, std::size_t length, std::size_t offset) const override { const auto read = std::min(length, size - offset); std::memcpy(data_, data.data() + offset, read); return read; } std::size_t Write(const u8* data_, std::size_t length, std::size_t offset) override { return 0; } bool Rename(std::string_view new_name) override { name = new_name; return true; } private: std::array data; std::string name; VirtualDir parent; }; template std::shared_ptr> MakeArrayFile(const std::array& data, Args&&... args) { return std::make_shared>(data, std::forward(args)...); } // An implementation of VfsFile that is backed by a vector optionally supplied upon construction class VectorVfsFile : public VfsFile { public: explicit VectorVfsFile(std::vector initial_data = {}, std::string name_ = "", VirtualDir parent_ = nullptr); ~VectorVfsFile() override; std::string GetName() const override; std::size_t GetSize() const override; bool Resize(std::size_t new_size) override; VirtualDir GetContainingDirectory() const override; bool IsWritable() const override; bool IsReadable() const override; std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override; bool Rename(std::string_view name) override; virtual void Assign(std::vector new_data); private: std::vector data; VirtualDir parent; std::string name; }; // An implementation of VfsDirectory that maintains two vectors for subdirectories and files. // Vector data is supplied upon construction. class VectorVfsDirectory : public VfsDirectory { public: explicit VectorVfsDirectory(std::vector files = {}, std::vector dirs = {}, std::string name = "", VirtualDir parent = nullptr); ~VectorVfsDirectory() override; std::vector GetFiles() const override; std::vector GetSubdirectories() const override; bool IsWritable() const override; bool IsReadable() const override; std::string GetName() const override; VirtualDir GetParentDirectory() const override; bool DeleteSubdirectory(std::string_view subdir_name) override; bool DeleteFile(std::string_view file_name) override; bool Rename(std::string_view name) override; VirtualDir CreateSubdirectory(std::string_view subdir_name) override; VirtualFile CreateFile(std::string_view file_name) override; virtual void AddFile(VirtualFile file); virtual void AddDirectory(VirtualDir dir); private: std::vector files; std::vector dirs; VirtualDir parent; std::string name; }; } // namespace FileSys