diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-01-23 05:13:17 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-01-23 05:14:00 +0100 |
commit | 754037874c692769c703f86bfa7af641e1346139 (patch) | |
tree | d88a26977532a288eed2f61ef61526931713fa4f /Kernel/SyntheticFileSystem.h | |
parent | 19104570cc286b608f6f8c22002ed4a8965b4648 (diff) | |
download | serenity-754037874c692769c703f86bfa7af641e1346139.zip |
Move VFS sources into Kernel/.
Diffstat (limited to 'Kernel/SyntheticFileSystem.h')
-rw-r--r-- | Kernel/SyntheticFileSystem.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Kernel/SyntheticFileSystem.h b/Kernel/SyntheticFileSystem.h new file mode 100644 index 0000000000..a0ad26e87b --- /dev/null +++ b/Kernel/SyntheticFileSystem.h @@ -0,0 +1,90 @@ +#pragma once + +#include "FileSystem.h" +#include "UnixTypes.h" +#include <AK/HashMap.h> + +class SynthFSInode; + +class SynthFS : public FS { +public: + virtual ~SynthFS() override; + static RetainPtr<SynthFS> create(); + + virtual bool initialize() override; + virtual const char* class_name() const override; + virtual InodeIdentifier root_inode() const override; + virtual RetainPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; + virtual RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; + virtual RetainPtr<Inode> get_inode(InodeIdentifier) const override; + +protected: + typedef unsigned InodeIndex; + + InodeIndex generate_inode_index(); + static constexpr InodeIndex RootInodeIndex = 1; + + SynthFS(); + + RetainPtr<SynthFSInode> create_directory(String&& name); + RetainPtr<SynthFSInode> create_text_file(String&& name, ByteBuffer&&, Unix::mode_t = 0010644); + RetainPtr<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, Unix::mode_t = 0100644); + RetainPtr<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, Function<ssize_t(SynthFSInode&, const ByteBuffer&)>&&, Unix::mode_t = 0100644); + + InodeIdentifier add_file(RetainPtr<SynthFSInode>&&, InodeIndex parent = RootInodeIndex); + bool remove_file(InodeIndex); + +private: + InodeIndex m_next_inode_index { 2 }; + HashMap<InodeIndex, RetainPtr<SynthFSInode>> m_inodes; +}; + +struct SynthFSInodeCustomData { + virtual ~SynthFSInodeCustomData(); +}; + +class SynthFSInode final : public Inode { + friend class SynthFS; +public: + virtual ~SynthFSInode() override; + + void set_custom_data(OwnPtr<SynthFSInodeCustomData>&& custom_data) { m_custom_data = move(custom_data); } + SynthFSInodeCustomData* custom_data() { return m_custom_data.ptr(); } + const SynthFSInodeCustomData* custom_data() const { return m_custom_data.ptr(); } + +private: + // ^Inode + virtual ssize_t read_bytes(Unix::off_t, size_t, byte* buffer, FileDescriptor*) override; + virtual InodeMetadata metadata() const override; + virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) override; + virtual InodeIdentifier lookup(const String& name) override; + virtual String reverse_lookup(InodeIdentifier) override; + virtual void flush_metadata() override; + virtual ssize_t write_bytes(Unix::off_t, size_t, const byte* buffer, FileDescriptor*) override; + virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) override; + virtual bool remove_child(const String& name, int& error) override; + virtual RetainPtr<Inode> parent() const override; + + SynthFS& fs(); + const SynthFS& fs() const; + SynthFSInode(SynthFS&, unsigned index); + + String m_name; + InodeIdentifier m_parent; + ByteBuffer m_data; + Function<ByteBuffer(SynthFSInode&)> m_generator; + Function<ssize_t(SynthFSInode&, const ByteBuffer&)> m_write_callback; + Vector<SynthFSInode*> m_children; + InodeMetadata m_metadata; + OwnPtr<SynthFSInodeCustomData> m_custom_data; +}; + +inline SynthFS& SynthFSInode::fs() +{ + return static_cast<SynthFS&>(Inode::fs()); +} + +inline const SynthFS& SynthFSInode::fs() const +{ + return static_cast<const SynthFS&>(Inode::fs()); +} |