summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/Src/FileSystemGCWii.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DiscIO/Src/FileSystemGCWii.cpp')
-rw-r--r--Source/Core/DiscIO/Src/FileSystemGCWii.cpp46
1 files changed, 28 insertions, 18 deletions
diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp
index eeaae84099..1d03e00b5c 100644
--- a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp
+++ b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp
@@ -29,26 +29,21 @@ namespace DiscIO
CFileSystemGCWii::CFileSystemGCWii(const IVolume *_rVolume)
: IFileSystem(_rVolume),
m_Initialized(false),
+ m_Valid(false),
m_OffsetShift(0)
{
- m_Initialized = InitFileSystem();
+ m_Valid = DetectFileSystem();
}
-
CFileSystemGCWii::~CFileSystemGCWii()
{
m_FileInfoVector.clear();
}
-bool CFileSystemGCWii::IsInitialized() const
-{
- return m_Initialized;
-}
-
-u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const
+u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath)
{
if (!m_Initialized)
- return 0;
+ InitFileSystem();
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
@@ -58,8 +53,11 @@ u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const
return 0;
}
-const char* CFileSystemGCWii::GetFileName(u64 _Address) const
+const char* CFileSystemGCWii::GetFileName(u64 _Address)
{
+ if (!m_Initialized)
+ InitFileSystem();
+
for (size_t i = 0; i < m_FileInfoVector.size(); i++)
{
if ((m_FileInfoVector[i].m_Offset <= _Address) &&
@@ -72,10 +70,10 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) const
return 0;
}
-u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const
+u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize)
{
if (!m_Initialized)
- return 0;
+ InitFileSystem();
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
if (pFileInfo == NULL)
@@ -90,8 +88,11 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max
return pFileInfo->m_FileSize;
}
-bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) const
+bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename)
{
+ if (!m_Initialized)
+ InitFileSystem();
+
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
if (!pFileInfo || pFileInfo->m_FileSize == 0)
@@ -214,8 +215,11 @@ void CFileSystemGCWii::GetStringFromOffset(u64 _Offset, char* Filename) const
m_rVolume->Read(_Offset, 255, (u8*)Filename);
}
-size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames) const
+size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames)
{
+ if (!m_Initialized)
+ InitFileSystem();
+
if (_rFilenames.size())
PanicAlert("GetFileList : input list has contents?");
_rFilenames.clear();
@@ -225,8 +229,11 @@ size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames
return m_FileInfoVector.size();
}
-const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const
+const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath)
{
+ if (!m_Initialized)
+ InitFileSystem();
+
for (size_t i = 0; i < m_FileInfoVector.size(); i++)
{
if (!strcasecmp(m_FileInfoVector[i].m_FullPath, _rFullPath))
@@ -236,7 +243,7 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const
return NULL;
}
-bool CFileSystemGCWii::InitFileSystem()
+bool CFileSystemGCWii::DetectFileSystem()
{
if (Read32(0x18) == 0x5D1C9EA3)
{
@@ -250,6 +257,11 @@ bool CFileSystemGCWii::InitFileSystem()
{
return false;
}
+}
+
+void CFileSystemGCWii::InitFileSystem()
+{
+ m_Initialized = true;
// read the whole FST
u64 FSTOffset = (u64)Read32(0x424) << m_OffsetShift;
@@ -284,8 +296,6 @@ bool CFileSystemGCWii::InitFileSystem()
BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset);
}
-
- return true;
}
// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but