From 5021b4a567fad9a258f2b0fc397912f499e4cb1d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 28 Jul 2015 16:56:25 +0200 Subject: 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. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 53 ++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 21 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') 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& FileSystemGCWii::GetFileList() +const std::vector& FileSystemGCWii::GetFileList() { if (!m_Initialized) InitFileSystem(); @@ -233,7 +243,7 @@ const std::vector& 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 root_size = m_rVolume->ReadSwapped(FSTOffset + 0x8, m_partition); if (!root_name_offset || !root_offset || !root_size) return; - FileInfo root = {*root_name_offset, static_cast(*root_offset) << m_offset_shift, *root_size}; + FileInfoGCWii root(*root_name_offset, static_cast(*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 name_offset = m_rVolume->ReadSwapped(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); } -- cgit v1.2.3