mirror of
https://github.com/fergalmoran/ladybird.git
synced 2025-12-27 11:48:32 +00:00
Caching the cluster list allows us to fill the two fields in the InodeMetadata. While at it, don't cache the metadata as when we have write support having to keep both InodeMetadata and FATEntry correct is going to get very annoying.
82 lines
3.2 KiB
C++
82 lines
3.2 KiB
C++
/*
|
|
* Copyright (c) 2022-2024, Undefine <undefine@undefine.pl>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/OwnPtr.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <Kernel/FileSystem/FATFS/Definitions.h>
|
|
#include <Kernel/FileSystem/FATFS/FileSystem.h>
|
|
#include <Kernel/FileSystem/Inode.h>
|
|
#include <Kernel/Library/KBuffer.h>
|
|
#include <Kernel/Library/KString.h>
|
|
|
|
namespace Kernel {
|
|
|
|
struct FATEntryLocation {
|
|
BlockBasedFileSystem::BlockIndex block;
|
|
u32 entry;
|
|
};
|
|
|
|
class FATInode final : public Inode {
|
|
friend FATFS;
|
|
|
|
public:
|
|
virtual ~FATInode() override = default;
|
|
|
|
static ErrorOr<NonnullRefPtr<FATInode>> create(FATFS&, FATEntry, FATEntryLocation inode_metadata_location, Vector<FATLongFileNameEntry> const& = {});
|
|
|
|
FATFS& fs() { return static_cast<FATFS&>(Inode::fs()); }
|
|
FATFS const& fs() const { return static_cast<FATFS const&>(Inode::fs()); }
|
|
|
|
private:
|
|
FATInode(FATFS&, FATEntry, FATEntryLocation inode_metadata_location, NonnullOwnPtr<KString> filename);
|
|
|
|
static constexpr u8 end_entry_byte = 0x00;
|
|
static constexpr u8 unused_entry_byte = 0xE5;
|
|
|
|
static constexpr u8 lfn_entry_character_termination = 0x00;
|
|
static constexpr u8 lfn_entry_unused_byte = 0xFF;
|
|
|
|
static constexpr u8 normal_filename_length = 8;
|
|
static constexpr u8 normal_extension_length = 3;
|
|
|
|
static ErrorOr<NonnullOwnPtr<KString>> compute_filename(FATEntry&, Vector<FATLongFileNameEntry> const& = {});
|
|
static StringView byte_terminated_string(StringView, u8);
|
|
|
|
ErrorOr<Vector<u32>> compute_cluster_list(FATFS&, u32 first_cluster);
|
|
ErrorOr<Vector<BlockBasedFileSystem::BlockIndex>> get_block_list();
|
|
ErrorOr<NonnullOwnPtr<KBuffer>> read_block_list();
|
|
ErrorOr<RefPtr<FATInode>> traverse(Function<ErrorOr<bool>(RefPtr<FATInode>)> callback);
|
|
u32 first_cluster() const;
|
|
// This overload of `first_cluster` does not rely on the base Inode
|
|
// already being created to determine the FAT version. It is used
|
|
// during FATInode creation (create()).
|
|
u32 first_cluster(FATVersion const version) const;
|
|
|
|
// ^Inode
|
|
virtual ErrorOr<size_t> write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override;
|
|
virtual ErrorOr<size_t> read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
|
|
|
virtual InodeMetadata metadata() const override;
|
|
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
|
|
virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
|
virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
|
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
|
|
virtual ErrorOr<void> remove_child(StringView name) override;
|
|
virtual ErrorOr<void> replace_child(StringView name, Inode& child) override;
|
|
virtual ErrorOr<void> chmod(mode_t) override;
|
|
virtual ErrorOr<void> chown(UserID, GroupID) override;
|
|
virtual ErrorOr<void> flush_metadata() override;
|
|
|
|
Vector<u32> m_cluster_list;
|
|
FATEntry m_entry;
|
|
FATEntryLocation m_inode_metadata_location;
|
|
NonnullOwnPtr<KString> m_filename;
|
|
};
|
|
|
|
}
|