Serenity Operating System
at master 68 lines 2.2 kB view raw
1/* 2 * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/EnumBits.h> 10#include <AK/Error.h> 11#include <AK/HashMap.h> 12#include <AK/RecursionDecision.h> 13#include <AK/StringView.h> 14#include <AK/Types.h> 15#include <Kernel/FileSystem/BlockBasedFileSystem.h> 16#include <Kernel/FileSystem/ISO9660FS/Definitions.h> 17#include <Kernel/FileSystem/ISO9660FS/DirectoryEntry.h> 18#include <Kernel/FileSystem/Inode.h> 19#include <Kernel/KBuffer.h> 20#include <Kernel/Library/NonnullLockRefPtr.h> 21 22namespace Kernel { 23 24class ISO9660Inode; 25class ISO9660DirectoryIterator; 26 27class ISO9660FS final : public BlockBasedFileSystem { 28 friend ISO9660Inode; 29 friend ISO9660DirectoryIterator; 30 31public: 32 static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create(OpenFileDescription&); 33 34 virtual ~ISO9660FS() override; 35 virtual StringView class_name() const override { return "ISO9660FS"sv; } 36 virtual Inode& root_inode() override; 37 38 virtual unsigned total_block_count() const override; 39 virtual unsigned total_inode_count() const override; 40 41 virtual u8 internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const override; 42 43 ErrorOr<NonnullLockRefPtr<ISO9660FSDirectoryEntry>> directory_entry_for_record(Badge<ISO9660DirectoryIterator>, ISO::DirectoryRecordHeader const* record); 44 45private: 46 ISO9660FS(OpenFileDescription&); 47 48 virtual ErrorOr<void> prepare_to_clear_last_mount() override; 49 50 virtual bool is_initialized_while_locked() override; 51 virtual ErrorOr<void> initialize_while_locked() override; 52 53 ErrorOr<void> parse_volume_set(); 54 ErrorOr<void> create_root_inode(); 55 ErrorOr<void> calculate_inode_count() const; 56 57 u32 calculate_directory_entry_cache_key(ISO::DirectoryRecordHeader const&); 58 59 ErrorOr<void> visit_directory_record(ISO::DirectoryRecordHeader const& record, Function<ErrorOr<RecursionDecision>(ISO::DirectoryRecordHeader const*)> const& visitor) const; 60 61 OwnPtr<ISO::PrimaryVolumeDescriptor> m_primary_volume; 62 RefPtr<ISO9660Inode> m_root_inode; 63 64 mutable u32 m_cached_inode_count { 0 }; 65 HashMap<u32, NonnullLockRefPtr<ISO9660FSDirectoryEntry>> m_directory_entry_cache; 66}; 67 68}