/* * Copyright (c) 2021, sin-ack * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Kernel { class ISO9660DirectoryIterator { public: ISO9660DirectoryIterator(ISO9660FS& fs, ISO::DirectoryRecordHeader const& header); ISO::DirectoryRecordHeader const* operator*() { return m_current_header; } // Recurses into subdirectories. May fail. ErrorOr next(); // Skips to the directory in the list, returns whether there was a next one. // No allocation here, cannot fail. bool skip(); bool go_up(); bool done() const; private: ErrorOr read_directory_contents(); void get_header(); ISO9660FS& m_fs; ISO9660FSDirectoryState m_current_directory; ISO::DirectoryRecordHeader const* m_current_header { nullptr }; Vector m_directory_stack; }; }