summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/FileSystemGCWii.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2015-07-28 16:56:25 +0200
committerJosJuice <josjuice@gmail.com>2017-06-13 22:37:43 +0200
commit5021b4a567fad9a258f2b0fc397912f499e4cb1d (patch)
treeaa06f212fde2bb9bfdcdd6fb8f771da8709ac324 /Source/Core/DiscIO/FileSystemGCWii.cpp
parent95bc57cff3f81f98b172d20a20b503a332fa2603 (diff)
Filesystem: Replace FileInfo struct with interface
GC/Wii filesystem internals shouldn't be exposed to other classes. This change isn't especially useful by itself, but it opens up the way for some neat stuff in the following commits.
Diffstat (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp')
-rw-r--r--Source/Core/DiscIO/FileSystemGCWii.cpp53
1 files changed, 32 insertions, 21 deletions
diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp
index b809047679..32f93f5eb6 100644
--- a/Source/Core/DiscIO/FileSystemGCWii.cpp
+++ b/Source/Core/DiscIO/FileSystemGCWii.cpp
@@ -22,8 +22,17 @@
namespace DiscIO
{
+FileInfoGCWii::FileInfoGCWii(u64 name_offset, u64 offset, u64 file_size)
+ : m_NameOffset(name_offset), m_Offset(offset), m_FileSize(file_size)
+{
+}
+
+FileInfoGCWii::~FileInfoGCWii()
+{
+}
+
FileSystemGCWii::FileSystemGCWii(const Volume* _rVolume, const Partition& partition)
- : FileSystem(_rVolume, partition), m_Initialized(false), m_Valid(false), m_offset_shift(0)
+ : FileSystem(_rVolume, partition), m_Initialized(false), m_Valid(false), m_offset_shift(0)
{
m_Valid = DetectFileSystem();
}
@@ -38,10 +47,10 @@ u64 FileSystemGCWii::GetFileSize(const std::string& _rFullPath)
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
+ const FileInfoGCWii* pFileInfo = FindFileInfo(_rFullPath);
if (pFileInfo != nullptr && !pFileInfo->IsDirectory())
- return pFileInfo->m_FileSize;
+ return pFileInfo->GetSize();
return 0;
}
@@ -53,7 +62,8 @@ std::string FileSystemGCWii::GetFileName(u64 _Address)
for (auto& fileInfo : m_FileInfoVector)
{
- if ((fileInfo.m_Offset <= _Address) && ((fileInfo.m_Offset + fileInfo.m_FileSize) > _Address))
+ if ((fileInfo.GetOffset() <= _Address) &&
+ ((fileInfo.GetOffset() + fileInfo.GetSize()) > _Address))
{
return fileInfo.m_FullPath;
}
@@ -68,21 +78,21 @@ u64 FileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, u64 _
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
+ const FileInfoGCWii* pFileInfo = FindFileInfo(_rFullPath);
if (pFileInfo == nullptr)
return 0;
- if (_OffsetInFile >= pFileInfo->m_FileSize)
+ if (_OffsetInFile >= pFileInfo->GetSize())
return 0;
- u64 read_length = std::min(_MaxBufferSize, pFileInfo->m_FileSize - _OffsetInFile);
+ u64 read_length = std::min(_MaxBufferSize, pFileInfo->GetSize() - _OffsetInFile);
DEBUG_LOG(DISCIO, "Reading %" PRIx64 " bytes at %" PRIx64 " from file %s. Offset: %" PRIx64
" Size: %" PRIx64,
- read_length, _OffsetInFile, _rFullPath.c_str(), pFileInfo->m_Offset,
- pFileInfo->m_FileSize);
+ read_length, _OffsetInFile, _rFullPath.c_str(), pFileInfo->GetOffset(),
+ pFileInfo->GetSize());
- m_rVolume->Read(pFileInfo->m_Offset + _OffsetInFile, read_length, _pBuffer, m_partition);
+ m_rVolume->Read(pFileInfo->GetOffset() + _OffsetInFile, read_length, _pBuffer, m_partition);
return read_length;
}
@@ -91,13 +101,13 @@ bool FileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::strin
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
+ const FileInfoGCWii* pFileInfo = FindFileInfo(_rFullPath);
if (!pFileInfo)
return false;
- u64 remainingSize = pFileInfo->m_FileSize;
- u64 fileOffset = pFileInfo->m_Offset;
+ u64 remainingSize = pFileInfo->GetSize();
+ u64 fileOffset = pFileInfo->GetOffset();
File::IOFile f(_rExportFilename, "wb");
if (!f)
@@ -225,7 +235,7 @@ std::string FileSystemGCWii::GetStringFromOffset(u64 _Offset) const
return SHIFTJISToUTF8(data);
}
-const std::vector<FileInfo>& FileSystemGCWii::GetFileList()
+const std::vector<FileInfoGCWii>& FileSystemGCWii::GetFileList()
{
if (!m_Initialized)
InitFileSystem();
@@ -233,7 +243,7 @@ const std::vector<FileInfo>& FileSystemGCWii::GetFileList()
return m_FileInfoVector;
}
-const FileInfo* FileSystemGCWii::FindFileInfo(const std::string& _rFullPath)
+const FileInfoGCWii* FileSystemGCWii::FindFileInfo(const std::string& _rFullPath)
{
if (!m_Initialized)
InitFileSystem();
@@ -279,7 +289,8 @@ void FileSystemGCWii::InitFileSystem()
const std::optional<u32> root_size = m_rVolume->ReadSwapped<u32>(FSTOffset + 0x8, m_partition);
if (!root_name_offset || !root_offset || !root_size)
return;
- FileInfo root = {*root_name_offset, static_cast<u64>(*root_offset) << m_offset_shift, *root_size};
+ FileInfoGCWii root(*root_name_offset, static_cast<u64>(*root_offset) << m_offset_shift,
+ *root_size);
if (!root.IsDirectory())
return;
@@ -287,7 +298,7 @@ void FileSystemGCWii::InitFileSystem()
// 12 bytes (the size of a file entry) times 10 * 1024 * 1024 is 120 MiB,
// more than total RAM in a Wii. No file system should use anywhere near that much.
static const u32 ARBITRARY_FILE_SYSTEM_SIZE_LIMIT = 10 * 1024 * 1024;
- if (root.m_FileSize > ARBITRARY_FILE_SYSTEM_SIZE_LIMIT)
+ if (root.GetSize() > ARBITRARY_FILE_SYSTEM_SIZE_LIMIT)
{
// Without this check, Dolphin can crash by trying to allocate too much
// memory when loading the file systems of certain malformed disc images.
@@ -300,8 +311,8 @@ void FileSystemGCWii::InitFileSystem()
PanicAlert("Wtf?");
u64 NameTableOffset = FSTOffset;
- m_FileInfoVector.reserve((size_t)root.m_FileSize);
- for (u32 i = 0; i < root.m_FileSize; i++)
+ m_FileInfoVector.reserve((size_t)root.GetSize());
+ for (u32 i = 0; i < root.GetSize(); i++)
{
const u64 read_offset = FSTOffset + (i * 0xC);
const std::optional<u32> name_offset = m_rVolume->ReadSwapped<u32>(read_offset, m_partition);
@@ -323,7 +334,7 @@ size_t FileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _L
while (CurrentIndex < _LastIndex)
{
- FileInfo& rFileInfo = m_FileInfoVector[CurrentIndex];
+ FileInfoGCWii& rFileInfo = m_FileInfoVector[CurrentIndex];
u64 const uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF);
std::string const offset_str{GetStringFromOffset(uOffset)};
bool const is_dir = rFileInfo.IsDirectory();
@@ -340,7 +351,7 @@ size_t FileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _L
}
// check next index
- CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t)rFileInfo.m_FileSize,
+ CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t)rFileInfo.GetSize(),
rFileInfo.m_FullPath, _NameTableOffset);
}