#pragma once #include "FileSystem.h" #include "UnixTypes.h" #include class SynthFSInode; class SyntheticFileSystem : public FileSystem { public: virtual ~SyntheticFileSystem() override; static RetainPtr create(); virtual bool initialize() override; virtual const char* class_name() const override; virtual InodeIdentifier rootInode() const override; virtual bool writeInode(InodeIdentifier, const ByteBuffer&) override; virtual bool enumerateDirectoryInode(InodeIdentifier, Function) const override; virtual InodeMetadata inodeMetadata(InodeIdentifier) const override; virtual bool set_mtime(InodeIdentifier, dword timestamp) override; virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size) override; virtual Unix::ssize_t read_inode_bytes(InodeIdentifier, Unix::off_t offset, Unix::size_t count, byte* buffer, FileDescriptor*) const override; virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t) override; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override; virtual RetainPtr get_inode(InodeIdentifier) const override; protected: typedef unsigned InodeIndex; InodeIndex generateInodeIndex(); static constexpr InodeIndex RootInodeIndex = 1; SyntheticFileSystem(); RetainPtr create_directory(String&& name); RetainPtr create_text_file(String&& name, ByteBuffer&&, Unix::mode_t = 0010644); RetainPtr create_generated_file(String&& name, Function&&, Unix::mode_t = 0100644); InodeIdentifier addFile(RetainPtr&&, InodeIndex parent = RootInodeIndex); bool removeFile(InodeIndex); private: InodeIndex m_nextInodeIndex { 2 }; HashMap> m_inodes; }; class SynthFSInode final : public CoreInode { friend class SyntheticFileSystem; public: virtual ~SynthFSInode() override; private: // ^CoreInode virtual Unix::ssize_t read_bytes(Unix::off_t, Unix::size_t, byte* buffer, FileDescriptor*) override; virtual void populate_metadata() const override; virtual bool traverse_as_directory(Function) override; virtual InodeIdentifier lookup(const String& name) override; SyntheticFileSystem& fs(); const SyntheticFileSystem& fs() const; SynthFSInode(SyntheticFileSystem&, unsigned index); String m_name; InodeIdentifier m_parent; ByteBuffer m_data; Function m_generator; Vector m_children; };