/* * Copyright (c) 2021, sin-ack * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace Kernel { class ISO9660Inode; class ISO9660DirectoryIterator; class ISO9660FS final : public BlockBasedFileSystem { friend ISO9660Inode; friend ISO9660DirectoryIterator; public: static ErrorOr> try_create(OpenFileDescription&); virtual ~ISO9660FS() override; virtual StringView class_name() const override { return "ISO9660FS"sv; } virtual Inode& root_inode() override; virtual unsigned total_block_count() const override; virtual unsigned total_inode_count() const override; virtual u8 internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const override; ErrorOr> directory_entry_for_record(Badge, ISO::DirectoryRecordHeader const* record); private: ISO9660FS(OpenFileDescription&); virtual ErrorOr prepare_to_clear_last_mount() override; virtual bool is_initialized_while_locked() override; virtual ErrorOr initialize_while_locked() override; ErrorOr parse_volume_set(); ErrorOr create_root_inode(); ErrorOr calculate_inode_count() const; u32 calculate_directory_entry_cache_key(ISO::DirectoryRecordHeader const&); ErrorOr visit_directory_record(ISO::DirectoryRecordHeader const& record, Function(ISO::DirectoryRecordHeader const*)> const& visitor) const; OwnPtr m_primary_volume; RefPtr m_root_inode; mutable u32 m_cached_inode_count { 0 }; HashMap> m_directory_entry_cache; }; }