mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-31 00:32:53 +00:00
d6ee7ec32c
Instead of using lots of small scattered reads to read the FST, only one big read is used, which is more efficient. This also means that the FST only allocates memory once and stores all strings close to each other - good for the CPU cache. The file info objects use pointers to this FST memory of containing data themselves. Keeping around the big m_FileInfoVector containing objects with only pointers is a bit unnecessary, but that will be fixed soon.
64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "DiscIO/Volume.h"
|
|
|
|
namespace DiscIO
|
|
{
|
|
// TODO: eww
|
|
class FileInfoGCWii;
|
|
|
|
// file info of an FST entry
|
|
class FileInfo
|
|
{
|
|
public:
|
|
virtual ~FileInfo();
|
|
|
|
// Not guaranteed to return a meaningful value for directories
|
|
virtual u64 GetOffset() const = 0;
|
|
// Not guaranteed to return a meaningful value for directories
|
|
virtual u32 GetSize() const = 0;
|
|
virtual bool IsDirectory() const = 0;
|
|
virtual std::string GetName() const = 0;
|
|
};
|
|
|
|
class FileSystem
|
|
{
|
|
public:
|
|
FileSystem(const Volume* _rVolume, const Partition& partition);
|
|
|
|
virtual ~FileSystem();
|
|
virtual bool IsValid() const = 0;
|
|
// TODO: Should only return FileInfo, not FileInfoGCWii
|
|
virtual const std::vector<FileInfoGCWii>& GetFileList() = 0;
|
|
virtual const FileInfo* FindFileInfo(const std::string& path) = 0;
|
|
virtual const FileInfo* FindFileInfo(u64 disc_offset) = 0;
|
|
virtual u64 ReadFile(const FileInfo* file_info, u8* _pBuffer, u64 _MaxBufferSize,
|
|
u64 _OffsetInFile = 0) = 0;
|
|
virtual bool ExportFile(const FileInfo* file_info, const std::string& _rExportFilename) = 0;
|
|
virtual bool ExportApploader(const std::string& _rExportFolder) const = 0;
|
|
virtual bool ExportDOL(const std::string& _rExportFolder) const = 0;
|
|
virtual std::string GetPath(u64 _Address) = 0;
|
|
virtual std::string GetPathFromFSTOffset(size_t file_info_offset) = 0;
|
|
virtual std::optional<u64> GetBootDOLOffset() const = 0;
|
|
virtual std::optional<u32> GetBootDOLSize(u64 dol_offset) const = 0;
|
|
|
|
virtual const Partition GetPartition() const { return m_partition; }
|
|
protected:
|
|
const Volume* const m_rVolume;
|
|
const Partition m_partition;
|
|
};
|
|
|
|
std::unique_ptr<FileSystem> CreateFileSystem(const Volume* volume, const Partition& partition);
|
|
|
|
} // namespace
|