summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/FileSystemGCWii.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2015-07-30 15:06:23 +0200
committerJosJuice <josjuice@gmail.com>2017-06-13 22:40:57 +0200
commit7c45afecb2a157088591a94f8c008d74419243d1 (patch)
tree316f66a222d175f687d5c75696c9a98c3b53053e /Source/Core/DiscIO/FileSystemGCWii.cpp
parent3d5ef948d0d3984e4ef7c26fe56acf469868e0f3 (diff)
Filesystem: Use file info in arguments instead of path
Some callers already have the file info, making the relatively slow FindFileInfo calls unnecessary. Callers that didn't have the file info will now need to call FindFileInfo on their own.
Diffstat (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp')
-rw-r--r--Source/Core/DiscIO/FileSystemGCWii.cpp45
1 files changed, 23 insertions, 22 deletions
diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp
index f8ddab28fe..d799caf435 100644
--- a/Source/Core/DiscIO/FileSystemGCWii.cpp
+++ b/Source/Core/DiscIO/FileSystemGCWii.cpp
@@ -50,31 +50,35 @@ const std::vector<FileInfoGCWii>& FileSystemGCWii::GetFileList()
return m_FileInfoVector;
}
-const FileInfo* FileSystemGCWii::FindFileInfo(const std::string& _rFullPath)
+const FileInfo* FileSystemGCWii::FindFileInfo(const std::string& path)
{
if (!m_Initialized)
InitFileSystem();
for (size_t i = 0; i < m_FileInfoVector.size(); ++i)
{
- if (!strcasecmp(GetPathFromFSTOffset(i).c_str(), _rFullPath.c_str()))
+ if (!strcasecmp(GetPathFromFSTOffset(i).c_str(), path.c_str()))
return &m_FileInfoVector[i];
}
return nullptr;
}
-u64 FileSystemGCWii::GetFileSize(const std::string& _rFullPath)
+const FileInfo* FileSystemGCWii::FindFileInfo(u64 disc_offset)
{
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
-
- if (pFileInfo != nullptr && !pFileInfo->IsDirectory())
- return pFileInfo->GetSize();
+ for (auto& file_info : m_FileInfoVector)
+ {
+ if ((file_info.GetOffset() <= disc_offset) &&
+ ((file_info.GetOffset() + file_info.GetSize()) > disc_offset))
+ {
+ return &file_info;
+ }
+ }
- return 0;
+ return nullptr;
}
std::string FileSystemGCWii::GetPath(u64 _Address)
@@ -135,42 +139,39 @@ std::string FileSystemGCWii::GetPathFromFSTOffset(size_t file_info_offset)
}
}
-u64 FileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, u64 _MaxBufferSize,
+u64 FileSystemGCWii::ReadFile(const FileInfo* file_info, u8* _pBuffer, u64 _MaxBufferSize,
u64 _OffsetInFile)
{
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
- if (pFileInfo == nullptr)
+ if (!file_info || file_info->IsDirectory())
return 0;
- if (_OffsetInFile >= pFileInfo->GetSize())
+ if (_OffsetInFile >= file_info->GetSize())
return 0;
- u64 read_length = std::min(_MaxBufferSize, pFileInfo->GetSize() - _OffsetInFile);
+ u64 read_length = std::min(_MaxBufferSize, file_info->GetSize() - _OffsetInFile);
DEBUG_LOG(DISCIO, "Reading %" PRIx64 " bytes at %" PRIx64 " from file %s. Offset: %" PRIx64
" Size: %" PRIx64,
- read_length, _OffsetInFile, _rFullPath.c_str(), pFileInfo->GetOffset(),
- pFileInfo->GetSize());
+ read_length, _OffsetInFile, GetPath(file_info->GetOffset()).c_str(),
+ file_info->GetOffset(), file_info->GetSize());
- m_rVolume->Read(pFileInfo->GetOffset() + _OffsetInFile, read_length, _pBuffer, m_partition);
+ m_rVolume->Read(file_info->GetOffset() + _OffsetInFile, read_length, _pBuffer, m_partition);
return read_length;
}
-bool FileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::string& _rExportFilename)
+bool FileSystemGCWii::ExportFile(const FileInfo* file_info, const std::string& _rExportFilename)
{
if (!m_Initialized)
InitFileSystem();
- const FileInfo* pFileInfo = FindFileInfo(_rFullPath);
-
- if (!pFileInfo)
+ if (!file_info || file_info->IsDirectory())
return false;
- u64 remainingSize = pFileInfo->GetSize();
- u64 fileOffset = pFileInfo->GetOffset();
+ u64 remainingSize = file_info->GetSize();
+ u64 fileOffset = file_info->GetOffset();
File::IOFile f(_rExportFilename, "wb");
if (!f)