From 34692ab826abc8f8faa61bdb2280b742424528f1 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 7 Dec 2013 15:14:29 -0500 Subject: Remove unnecessary Src/ folders --- Source/Core/DiscIO/FileSystemGCWii.cpp | 338 +++++++++++++++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 Source/Core/DiscIO/FileSystemGCWii.cpp (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp new file mode 100644 index 0000000000..cc09138f3e --- /dev/null +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -0,0 +1,338 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "Common.h" +#include "FileUtil.h" + +#include +#include +#include +#include + +#include "FileSystemGCWii.h" +#include "StringUtil.h" + +namespace DiscIO +{ +CFileSystemGCWii::CFileSystemGCWii(const IVolume *_rVolume) + : IFileSystem(_rVolume) + , m_Initialized(false) + , m_Valid(false) + , m_OffsetShift(0) +{ + m_Valid = DetectFileSystem(); +} + +CFileSystemGCWii::~CFileSystemGCWii() +{ + m_FileInfoVector.clear(); +} + +u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) +{ + if (!m_Initialized) + InitFileSystem(); + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo != NULL && !pFileInfo->IsDirectory()) + return pFileInfo->m_FileSize; + + return 0; +} + +const char* CFileSystemGCWii::GetFileName(u64 _Address) +{ + if (!m_Initialized) + InitFileSystem(); + + for (auto& fileInfo : m_FileInfoVector) + { + if ((fileInfo.m_Offset <= _Address) && + ((fileInfo.m_Offset + fileInfo.m_FileSize) > _Address)) + { + return fileInfo.m_FullPath; + } + } + + return 0; +} + +u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) +{ + if (!m_Initialized) + InitFileSystem(); + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + if (pFileInfo == NULL) + return 0; + + if (pFileInfo->m_FileSize > _MaxBufferSize) + return 0; + + DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath, + pFileInfo->m_Offset, pFileInfo->m_FileSize); + + m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer); + return pFileInfo->m_FileSize; +} + +bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) +{ + if (!m_Initialized) + InitFileSystem(); + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (!pFileInfo) + return false; + + u64 remainingSize = pFileInfo->m_FileSize; + u64 fileOffset = pFileInfo->m_Offset; + + File::IOFile f(_rExportFilename, "wb"); + if (!f) + return false; + + bool result = true; + + while (remainingSize) + { + // Limit read size to 128 MB + size_t readSize = (size_t)min(remainingSize, (u64)0x08000000); + + std::vector buffer(readSize); + + result = m_rVolume->Read(fileOffset, readSize, &buffer[0]); + + if (!result) + break; + + f.WriteBytes(&buffer[0], readSize); + + remainingSize -= readSize; + fileOffset += readSize; + } + + return result; +} + +bool CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const +{ + u32 AppSize = Read32(0x2440 + 0x14);// apploader size + AppSize += Read32(0x2440 + 0x18); // + trailer size + AppSize += 0x20; // + header size + DEBUG_LOG(DISCIO,"AppSize -> %x", AppSize); + + std::vector buffer(AppSize); + if (m_rVolume->Read(0x2440, AppSize, &buffer[0])) + { + std::string exportName(_rExportFolder); + exportName += "/apploader.img"; + + File::IOFile AppFile(exportName, "wb"); + if (AppFile) + { + AppFile.WriteBytes(&buffer[0], AppSize); + return true; + } + } + + return false; +} + +u32 CFileSystemGCWii::GetBootDOLSize() const +{ + u32 DolOffset = Read32(0x420) << m_OffsetShift; + u32 DolSize = 0, offset = 0, size = 0; + + // Iterate through the 7 code segments + for (u8 i = 0; i < 7; i++) + { + offset = Read32(DolOffset + 0x00 + i * 4); + size = Read32(DolOffset + 0x90 + i * 4); + if (offset + size > DolSize) + DolSize = offset + size; + } + + // Iterate through the 11 data segments + for (u8 i = 0; i < 11; i++) + { + offset = Read32(DolOffset + 0x1c + i * 4); + size = Read32(DolOffset + 0xac + i * 4); + if (offset + size > DolSize) + DolSize = offset + size; + } + return DolSize; +} + +bool CFileSystemGCWii::GetBootDOL(u8* &buffer, u32 DolSize) const +{ + u32 DolOffset = Read32(0x420) << m_OffsetShift; + return m_rVolume->Read(DolOffset, DolSize, buffer); +} + +bool CFileSystemGCWii::ExportDOL(const char* _rExportFolder) const +{ + u32 DolOffset = Read32(0x420) << m_OffsetShift; + u32 DolSize = GetBootDOLSize(); + + std::vector buffer(DolSize); + if (m_rVolume->Read(DolOffset, DolSize, &buffer[0])) + { + std::string exportName(_rExportFolder); + exportName += "/boot.dol"; + + File::IOFile DolFile(exportName, "wb"); + if (DolFile) + { + DolFile.WriteBytes(&buffer[0], DolSize); + return true; + } + } + + return false; +} + +u32 CFileSystemGCWii::Read32(u64 _Offset) const +{ + u32 Temp = 0; + m_rVolume->Read(_Offset, 4, (u8*)&Temp); + return Common::swap32(Temp); +} + +std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const +{ + std::string data; + data.resize(255); + m_rVolume->Read(_Offset, data.size(), (u8*)&data[0]); + data.erase(std::find(data.begin(), data.end(), 0x00), data.end()); + + // TODO: Should we really always use SHIFT-JIS? + // It makes some filenames in Pikmin (NTSC-U) sane, but is it correct? + return SHIFTJISToUTF8(data); +} + +size_t CFileSystemGCWii::GetFileList(std::vector &_rFilenames) +{ + if (!m_Initialized) + InitFileSystem(); + + if (_rFilenames.size()) + PanicAlert("GetFileList : input list has contents?"); + _rFilenames.clear(); + _rFilenames.reserve(m_FileInfoVector.size()); + for (auto& fileInfo : m_FileInfoVector) + _rFilenames.push_back(&fileInfo); + return m_FileInfoVector.size(); +} + +const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) +{ + if (!m_Initialized) + InitFileSystem(); + + for (auto& fileInfo : m_FileInfoVector) + { + if (!strcasecmp(fileInfo.m_FullPath, _rFullPath)) + return &fileInfo; + } + + return NULL; +} + +bool CFileSystemGCWii::DetectFileSystem() +{ + if (Read32(0x18) == 0x5D1C9EA3) + { + m_OffsetShift = 2; // Wii file system + return true; + } + else if (Read32(0x1c) == 0xC2339F3D) + { + m_OffsetShift = 0; // GC file system + return true; + } + + return false; +} + +void CFileSystemGCWii::InitFileSystem() +{ + m_Initialized = true; + + // read the whole FST + u64 FSTOffset = (u64)Read32(0x424) << m_OffsetShift; + // u32 FSTSize = Read32(0x428); + // u32 FSTMaxSize = Read32(0x42C); + + + // read all fileinfos + SFileInfo Root; + Root.m_NameOffset = Read32(FSTOffset + 0x0); + Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << m_OffsetShift; + Root.m_FileSize = Read32(FSTOffset + 0x8); + + if (Root.IsDirectory()) + { + if (m_FileInfoVector.size()) + PanicAlert("Wtf?"); + u64 NameTableOffset = FSTOffset; + + m_FileInfoVector.reserve((unsigned int)Root.m_FileSize); + for (u32 i = 0; i < Root.m_FileSize; i++) + { + SFileInfo sfi; + u64 Offset = FSTOffset + (i * 0xC); + sfi.m_NameOffset = Read32(Offset + 0x0); + sfi.m_Offset = (u64)Read32(Offset + 0x4) << m_OffsetShift; + sfi.m_FileSize = Read32(Offset + 0x8); + + m_FileInfoVector.push_back(sfi); + NameTableOffset += 0xC; + } + + BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset); + } +} + +// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but +// std::string is SLOW in debug mode. +size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset) +{ + size_t CurrentIndex = _FirstIndex; + + while (CurrentIndex < _LastIndex) + { + SFileInfo *rFileInfo = &m_FileInfoVector[CurrentIndex]; + u64 uOffset = _NameTableOffset + (rFileInfo->m_NameOffset & 0xFFFFFF); + std::string filename = GetStringFromOffset(uOffset); + + // check next index + if (rFileInfo->IsDirectory()) + { + // this is a directory, build up the new szDirectory + if (_szDirectory != NULL) + CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s/", _szDirectory, filename.c_str()); + else + CharArrayFromFormat(rFileInfo->m_FullPath, "%s/", filename.c_str()); + + CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo->m_FileSize, rFileInfo->m_FullPath, _NameTableOffset); + } + else + { + // this is a filename + if (_szDirectory != NULL) + CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s", _szDirectory, filename.c_str()); + else + CharArrayFromFormat(rFileInfo->m_FullPath, "%s", filename.c_str()); + + CurrentIndex++; + } + } + + return CurrentIndex; +} + +} // namespace -- cgit v1.2.3 From 6c4ee1753aa2b9e620138801b479365b0569317c Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 16 Feb 2014 15:30:18 -0500 Subject: Fix some vertical alignments ie. uses spaces for alignment. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index cc09138f3e..c8d5c2b198 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -121,8 +121,8 @@ bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFi bool CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const { u32 AppSize = Read32(0x2440 + 0x14);// apploader size - AppSize += Read32(0x2440 + 0x18); // + trailer size - AppSize += 0x20; // + header size + AppSize += Read32(0x2440 + 0x18); // + trailer size + AppSize += 0x20; // + header size DEBUG_LOG(DISCIO,"AppSize -> %x", AppSize); std::vector buffer(AppSize); @@ -150,8 +150,8 @@ u32 CFileSystemGCWii::GetBootDOLSize() const // Iterate through the 7 code segments for (u8 i = 0; i < 7; i++) { - offset = Read32(DolOffset + 0x00 + i * 4); - size = Read32(DolOffset + 0x90 + i * 4); + offset = Read32(DolOffset + 0x00 + i * 4); + size = Read32(DolOffset + 0x90 + i * 4); if (offset + size > DolSize) DolSize = offset + size; } @@ -159,8 +159,8 @@ u32 CFileSystemGCWii::GetBootDOLSize() const // Iterate through the 11 data segments for (u8 i = 0; i < 11; i++) { - offset = Read32(DolOffset + 0x1c + i * 4); - size = Read32(DolOffset + 0xac + i * 4); + offset = Read32(DolOffset + 0x1c + i * 4); + size = Read32(DolOffset + 0xac + i * 4); if (offset + size > DolSize) DolSize = offset + size; } -- cgit v1.2.3 From 2afe2152712981e21d6bda6f029292ed2b1cf91e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 17 Feb 2014 05:18:15 -0500 Subject: Convert all includes to relative paths. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index c8d5c2b198..078fb554cc 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -2,16 +2,16 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" -#include "FileUtil.h" - -#include -#include #include #include +#include +#include + +#include "Common/Common.h" +#include "Common/FileUtil.h" +#include "Common/StringUtil.h" -#include "FileSystemGCWii.h" -#include "StringUtil.h" +#include "DiscIO/FileSystemGCWii.h" namespace DiscIO { -- cgit v1.2.3 From c698c07755fb95990f7b74ac525a65b2c725bfbf Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Fri, 21 Feb 2014 01:47:53 +0100 Subject: Make DiscIO/ mostly IWYU clean (and fix errors in rest of the project detected by this change). --- Source/Core/DiscIO/FileSystemGCWii.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 078fb554cc..6b15454256 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -4,6 +4,8 @@ #include #include +#include +#include #include #include @@ -11,7 +13,9 @@ #include "Common/FileUtil.h" #include "Common/StringUtil.h" +#include "DiscIO/Filesystem.h" #include "DiscIO/FileSystemGCWii.h" +#include "DiscIO/Volume.h" namespace DiscIO { -- cgit v1.2.3 From d802d392811be44d34ae9cd23f616db93e54c50f Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 9 Mar 2014 21:14:26 +0100 Subject: clang-modernize -use-nullptr and s/\bNULL\b/nullptr/g for *.cpp/h/mm files not compiled on my machine --- Source/Core/DiscIO/FileSystemGCWii.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 6b15454256..5b7f53af2b 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -40,7 +40,7 @@ u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); - if (pFileInfo != NULL && !pFileInfo->IsDirectory()) + if (pFileInfo != nullptr && !pFileInfo->IsDirectory()) return pFileInfo->m_FileSize; return 0; @@ -60,7 +60,7 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) } } - return 0; + return nullptr; } u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) @@ -69,7 +69,7 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max InitFileSystem(); const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); - if (pFileInfo == NULL) + if (pFileInfo == nullptr) return 0; if (pFileInfo->m_FileSize > _MaxBufferSize) @@ -243,7 +243,7 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) return &fileInfo; } - return NULL; + return nullptr; } bool CFileSystemGCWii::DetectFileSystem() @@ -297,7 +297,7 @@ void CFileSystemGCWii::InitFileSystem() NameTableOffset += 0xC; } - BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset); + BuildFilenames(1, m_FileInfoVector.size(), nullptr, NameTableOffset); } } @@ -317,7 +317,7 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ if (rFileInfo->IsDirectory()) { // this is a directory, build up the new szDirectory - if (_szDirectory != NULL) + if (_szDirectory != nullptr) CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s/", _szDirectory, filename.c_str()); else CharArrayFromFormat(rFileInfo->m_FullPath, "%s/", filename.c_str()); @@ -327,7 +327,7 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ else { // this is a filename - if (_szDirectory != NULL) + if (_szDirectory != nullptr) CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s", _szDirectory, filename.c_str()); else CharArrayFromFormat(rFileInfo->m_FullPath, "%s", filename.c_str()); -- cgit v1.2.3 From a82675b7d581421fa80d5d5c53253cf1d5c1a26d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 12 Mar 2014 15:33:41 -0400 Subject: Kill off some usages of c_str. Also changes some function params, but this is ok. Some simplifications were also able to be made (ie. killing off strcmps with ==, etc). --- Source/Core/DiscIO/FileSystemGCWii.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 5b7f53af2b..1ecf71d4b5 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -33,7 +33,7 @@ CFileSystemGCWii::~CFileSystemGCWii() m_FileInfoVector.clear(); } -u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) +u64 CFileSystemGCWii::GetFileSize(const std::string& _rFullPath) { if (!m_Initialized) InitFileSystem(); @@ -63,7 +63,7 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) return nullptr; } -u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) +u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) { if (!m_Initialized) InitFileSystem(); @@ -75,14 +75,14 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max if (pFileInfo->m_FileSize > _MaxBufferSize) return 0; - DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath, + DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath.c_str(), pFileInfo->m_Offset, pFileInfo->m_FileSize); m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer); return pFileInfo->m_FileSize; } -bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) +bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::string& _rExportFilename) { if (!m_Initialized) InitFileSystem(); @@ -122,7 +122,7 @@ bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFi return result; } -bool CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const +bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const { u32 AppSize = Read32(0x2440 + 0x14);// apploader size AppSize += Read32(0x2440 + 0x18); // + trailer size @@ -177,7 +177,7 @@ bool CFileSystemGCWii::GetBootDOL(u8* &buffer, u32 DolSize) const return m_rVolume->Read(DolOffset, DolSize, buffer); } -bool CFileSystemGCWii::ExportDOL(const char* _rExportFolder) const +bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const { u32 DolOffset = Read32(0x420) << m_OffsetShift; u32 DolSize = GetBootDOLSize(); @@ -232,14 +232,14 @@ size_t CFileSystemGCWii::GetFileList(std::vector &_rFilenames return m_FileInfoVector.size(); } -const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) +const SFileInfo* CFileSystemGCWii::FindFileInfo(const std::string& _rFullPath) { if (!m_Initialized) InitFileSystem(); for (auto& fileInfo : m_FileInfoVector) { - if (!strcasecmp(fileInfo.m_FullPath, _rFullPath)) + if (!strcasecmp(fileInfo.m_FullPath, _rFullPath.c_str())) return &fileInfo; } -- cgit v1.2.3 From bd1ce18f9092f2929929513729e8abee8f60e4a5 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 14 Mar 2014 23:38:14 -0400 Subject: Simplify file tree building for the filesystem view. Technically this also simplifies on disc filename building in general. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 1ecf71d4b5..f9f88e8d02 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -46,7 +46,7 @@ u64 CFileSystemGCWii::GetFileSize(const std::string& _rFullPath) return 0; } -const char* CFileSystemGCWii::GetFileName(u64 _Address) +const std::string CFileSystemGCWii::GetFileName(u64 _Address) { if (!m_Initialized) InitFileSystem(); @@ -239,7 +239,7 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const std::string& _rFullPath) for (auto& fileInfo : m_FileInfoVector) { - if (!strcasecmp(fileInfo.m_FullPath, _rFullPath.c_str())) + if (!strcasecmp(fileInfo.m_FullPath.c_str(), _rFullPath.c_str())) return &fileInfo; } @@ -297,13 +297,11 @@ void CFileSystemGCWii::InitFileSystem() NameTableOffset += 0xC; } - BuildFilenames(1, m_FileInfoVector.size(), nullptr, NameTableOffset); + BuildFilenames(1, m_FileInfoVector.size(), "", NameTableOffset); } } -// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but -// std::string is SLOW in debug mode. -size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset) +size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset) { size_t CurrentIndex = _FirstIndex; @@ -316,21 +314,19 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ // check next index if (rFileInfo->IsDirectory()) { - // this is a directory, build up the new szDirectory - if (_szDirectory != nullptr) - CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s/", _szDirectory, filename.c_str()); + if (_szDirectory.empty()) + rFileInfo->m_FullPath += StringFromFormat("%s/", filename.c_str()); else - CharArrayFromFormat(rFileInfo->m_FullPath, "%s/", filename.c_str()); + rFileInfo->m_FullPath += StringFromFormat("%s%s/", _szDirectory.c_str(), filename.c_str()); CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo->m_FileSize, rFileInfo->m_FullPath, _NameTableOffset); } - else + else // This is a filename { - // this is a filename - if (_szDirectory != nullptr) - CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s", _szDirectory, filename.c_str()); + if (_szDirectory.empty()) + rFileInfo->m_FullPath += filename; else - CharArrayFromFormat(rFileInfo->m_FullPath, "%s", filename.c_str()); + rFileInfo->m_FullPath += StringFromFormat("%s%s", _szDirectory.c_str(), filename.c_str()); CurrentIndex++; } -- cgit v1.2.3 From 5310d6d2ea0233f745aa6fc9884930f7d30d4fee Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 23 Mar 2014 22:29:30 -0500 Subject: Fix a crash that got recently introduced. When CFileSystemGCWii::GetFileName can't find a valid filename it would return nullptr. nullptr as a std::string throws an assert within the std lib. So return an empty string and check if it is empty or not --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index f9f88e8d02..cdd830c6f6 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -60,7 +60,7 @@ const std::string CFileSystemGCWii::GetFileName(u64 _Address) } } - return nullptr; + return ""; } u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) -- cgit v1.2.3 From 49b0eef393f4d321928fb0b6093d58a7637cf1da Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 2 May 2014 22:47:04 -0400 Subject: Remove the min/max functions in CommonFuncs. The algorithm header has the same functions. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index cdd830c6f6..a264eb0ffb 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -104,7 +104,7 @@ bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::stri while (remainingSize) { // Limit read size to 128 MB - size_t readSize = (size_t)min(remainingSize, (u64)0x08000000); + size_t readSize = std::min(remainingSize, (u64)0x08000000); std::vector buffer(readSize); -- cgit v1.2.3 From 3805c4967f00ccfc15ed2b5f84d3142786e3da32 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 29 Jun 2014 14:22:06 -0500 Subject: Fix ISO Directory extraction. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index a264eb0ffb..ff32a4015f 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -307,28 +307,20 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ while (CurrentIndex < _LastIndex) { - SFileInfo *rFileInfo = &m_FileInfoVector[CurrentIndex]; - u64 uOffset = _NameTableOffset + (rFileInfo->m_NameOffset & 0xFFFFFF); - std::string filename = GetStringFromOffset(uOffset); + SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex]; + u64 const uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF); + + rFileInfo.m_FullPath = _szDirectory + GetStringFromOffset(uOffset); // check next index - if (rFileInfo->IsDirectory()) + if (rFileInfo.IsDirectory()) { - if (_szDirectory.empty()) - rFileInfo->m_FullPath += StringFromFormat("%s/", filename.c_str()); - else - rFileInfo->m_FullPath += StringFromFormat("%s%s/", _szDirectory.c_str(), filename.c_str()); - - CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo->m_FileSize, rFileInfo->m_FullPath, _NameTableOffset); + rFileInfo.m_FullPath += '/'; + CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); } - else // This is a filename + else { - if (_szDirectory.empty()) - rFileInfo->m_FullPath += filename; - else - rFileInfo->m_FullPath += StringFromFormat("%s%s", _szDirectory.c_str(), filename.c_str()); - - CurrentIndex++; + ++CurrentIndex; } } -- cgit v1.2.3 From d4a2afe345e40a4af30f8fb903ffff6413680d21 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Tue, 15 Jul 2014 01:38:05 +1200 Subject: Fix another protential issue with casting. Another issue from #334 with the casting moved from the output of min to it's inputs. This is a non-issue on 64 bit machines, but if dolphin is compiled on an OS with size_t == u32 (say ARM) then remainingSize could be truncated. Restored the casting to the original order before #334. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index ff32a4015f..afc9b12201 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -104,7 +104,7 @@ bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::stri while (remainingSize) { // Limit read size to 128 MB - size_t readSize = std::min(remainingSize, (u64)0x08000000); + size_t readSize = (size_t)std::min(remainingSize, (u64)0x08000000); std::vector buffer(readSize); -- cgit v1.2.3 From fbc64984ca7de7db10b1a8a4f49002f260c93569 Mon Sep 17 00:00:00 2001 From: Rohit Nirmal Date: Sun, 7 Sep 2014 20:06:58 -0500 Subject: Include CommonTypes.h instead of Common.h. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index afc9b12201..727440500e 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -9,7 +9,7 @@ #include #include -#include "Common/Common.h" +#include "Common/CommonTypes.h" #include "Common/FileUtil.h" #include "Common/StringUtil.h" -- cgit v1.2.3 From d1d70c1a7d506519318920e8736be6a1b4febb41 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 28 Oct 2014 13:41:34 -0400 Subject: FileSystemGCWii: Shorten some string concatenations Just does it all on one line instead. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 727440500e..d39d803e11 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -132,8 +132,7 @@ bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const std::vector buffer(AppSize); if (m_rVolume->Read(0x2440, AppSize, &buffer[0])) { - std::string exportName(_rExportFolder); - exportName += "/apploader.img"; + std::string exportName(_rExportFolder + "/apploader.img"); File::IOFile AppFile(exportName, "wb"); if (AppFile) @@ -185,8 +184,7 @@ bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const std::vector buffer(DolSize); if (m_rVolume->Read(DolOffset, DolSize, &buffer[0])) { - std::string exportName(_rExportFolder); - exportName += "/boot.dol"; + std::string exportName(_rExportFolder + "/boot.dol"); File::IOFile DolFile(exportName, "wb"); if (DolFile) -- cgit v1.2.3 From bb93336ecf9f74c59cab21a582704cba189e813f Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 28 Dec 2014 10:35:48 +0100 Subject: DiscIO: Replace "raw" functions with "decrypt" parameters This is intended to make decryption look less implicit in the code. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 37 +++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index d39d803e11..f9b1fa10e3 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -23,7 +23,7 @@ CFileSystemGCWii::CFileSystemGCWii(const IVolume *_rVolume) : IFileSystem(_rVolume) , m_Initialized(false) , m_Valid(false) - , m_OffsetShift(0) + , m_Wii(false) { m_Valid = DetectFileSystem(); } @@ -78,7 +78,7 @@ u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath.c_str(), pFileInfo->m_Offset, pFileInfo->m_FileSize); - m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer); + m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer, m_Wii); return pFileInfo->m_FileSize; } @@ -108,7 +108,7 @@ bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::stri std::vector buffer(readSize); - result = m_rVolume->Read(fileOffset, readSize, &buffer[0]); + result = m_rVolume->Read(fileOffset, readSize, &buffer[0], m_Wii); if (!result) break; @@ -130,7 +130,7 @@ bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const DEBUG_LOG(DISCIO,"AppSize -> %x", AppSize); std::vector buffer(AppSize); - if (m_rVolume->Read(0x2440, AppSize, &buffer[0])) + if (m_rVolume->Read(0x2440, AppSize, &buffer[0], m_Wii)) { std::string exportName(_rExportFolder + "/apploader.img"); @@ -147,7 +147,7 @@ bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const u32 CFileSystemGCWii::GetBootDOLSize() const { - u32 DolOffset = Read32(0x420) << m_OffsetShift; + u32 DolOffset = Read32(0x420) << GetOffsetShift(); u32 DolSize = 0, offset = 0, size = 0; // Iterate through the 7 code segments @@ -172,17 +172,17 @@ u32 CFileSystemGCWii::GetBootDOLSize() const bool CFileSystemGCWii::GetBootDOL(u8* &buffer, u32 DolSize) const { - u32 DolOffset = Read32(0x420) << m_OffsetShift; - return m_rVolume->Read(DolOffset, DolSize, buffer); + u32 DolOffset = Read32(0x420) << GetOffsetShift(); + return m_rVolume->Read(DolOffset, DolSize, buffer, m_Wii); } bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const { - u32 DolOffset = Read32(0x420) << m_OffsetShift; + u32 DolOffset = Read32(0x420) << GetOffsetShift(); u32 DolSize = GetBootDOLSize(); std::vector buffer(DolSize); - if (m_rVolume->Read(DolOffset, DolSize, &buffer[0])) + if (m_rVolume->Read(DolOffset, DolSize, &buffer[0], m_Wii)) { std::string exportName(_rExportFolder + "/boot.dol"); @@ -200,7 +200,7 @@ bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const u32 CFileSystemGCWii::Read32(u64 _Offset) const { u32 Temp = 0; - m_rVolume->Read(_Offset, 4, (u8*)&Temp); + m_rVolume->Read(_Offset, 4, (u8*)&Temp, m_Wii); return Common::swap32(Temp); } @@ -208,7 +208,7 @@ std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const { std::string data; data.resize(255); - m_rVolume->Read(_Offset, data.size(), (u8*)&data[0]); + m_rVolume->Read(_Offset, data.size(), (u8*)&data[0], m_Wii); data.erase(std::find(data.begin(), data.end(), 0x00), data.end()); // TODO: Should we really always use SHIFT-JIS? @@ -248,12 +248,12 @@ bool CFileSystemGCWii::DetectFileSystem() { if (Read32(0x18) == 0x5D1C9EA3) { - m_OffsetShift = 2; // Wii file system + m_Wii = true; return true; } else if (Read32(0x1c) == 0xC2339F3D) { - m_OffsetShift = 0; // GC file system + m_Wii = false; return true; } @@ -265,7 +265,7 @@ void CFileSystemGCWii::InitFileSystem() m_Initialized = true; // read the whole FST - u64 FSTOffset = (u64)Read32(0x424) << m_OffsetShift; + u64 FSTOffset = (u64)Read32(0x424) << GetOffsetShift(); // u32 FSTSize = Read32(0x428); // u32 FSTMaxSize = Read32(0x42C); @@ -273,7 +273,7 @@ void CFileSystemGCWii::InitFileSystem() // read all fileinfos SFileInfo Root; Root.m_NameOffset = Read32(FSTOffset + 0x0); - Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << m_OffsetShift; + Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << GetOffsetShift(); Root.m_FileSize = Read32(FSTOffset + 0x8); if (Root.IsDirectory()) @@ -288,7 +288,7 @@ void CFileSystemGCWii::InitFileSystem() SFileInfo sfi; u64 Offset = FSTOffset + (i * 0xC); sfi.m_NameOffset = Read32(Offset + 0x0); - sfi.m_Offset = (u64)Read32(Offset + 0x4) << m_OffsetShift; + sfi.m_Offset = (u64)Read32(Offset + 0x4) << GetOffsetShift(); sfi.m_FileSize = Read32(Offset + 0x8); m_FileInfoVector.push_back(sfi); @@ -325,4 +325,9 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ return CurrentIndex; } +u32 CFileSystemGCWii::GetOffsetShift() const +{ + return m_Wii ? 2 : 0; +} + } // namespace -- cgit v1.2.3 From 9e541f6d2deb24c31c644b7556123279599beb1b Mon Sep 17 00:00:00 2001 From: Tres Walsh Date: Sun, 11 Jan 2015 12:46:22 -0800 Subject: Reduce number of allocations in CFileSystemGCWii::BuildFilenames Modify SFileInfo to use a default move constructor, and no copy constructor. Modify SFileInfo to use member initializers. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 68 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 33 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index f9b1fa10e3..c94dffe6c2 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -206,8 +206,7 @@ u32 CFileSystemGCWii::Read32(u64 _Offset) const std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const { - std::string data; - data.resize(255); + std::string data(255, 0x00); m_rVolume->Read(_Offset, data.size(), (u8*)&data[0], m_Wii); data.erase(std::find(data.begin(), data.end(), 0x00), data.end()); @@ -263,40 +262,40 @@ bool CFileSystemGCWii::DetectFileSystem() void CFileSystemGCWii::InitFileSystem() { m_Initialized = true; + u32 const shift = GetOffsetShift(); // read the whole FST - u64 FSTOffset = (u64)Read32(0x424) << GetOffsetShift(); + u64 FSTOffset = static_cast(Read32(0x424)) << shift; // u32 FSTSize = Read32(0x428); // u32 FSTMaxSize = Read32(0x42C); // read all fileinfos - SFileInfo Root; - Root.m_NameOffset = Read32(FSTOffset + 0x0); - Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << GetOffsetShift(); - Root.m_FileSize = Read32(FSTOffset + 0x8); - - if (Root.IsDirectory()) + SFileInfo Root { - if (m_FileInfoVector.size()) - PanicAlert("Wtf?"); - u64 NameTableOffset = FSTOffset; + Read32(FSTOffset + 0x0), + static_cast(FSTOffset + 0x4) << shift, + Read32(FSTOffset + 0x8) + }; - m_FileInfoVector.reserve((unsigned int)Root.m_FileSize); - for (u32 i = 0; i < Root.m_FileSize; i++) - { - SFileInfo sfi; - u64 Offset = FSTOffset + (i * 0xC); - sfi.m_NameOffset = Read32(Offset + 0x0); - sfi.m_Offset = (u64)Read32(Offset + 0x4) << GetOffsetShift(); - sfi.m_FileSize = Read32(Offset + 0x8); - - m_FileInfoVector.push_back(sfi); - NameTableOffset += 0xC; - } + if (!Root.IsDirectory()) { return; } - BuildFilenames(1, m_FileInfoVector.size(), "", NameTableOffset); + if (m_FileInfoVector.size()) + PanicAlert("Wtf?"); + u64 NameTableOffset = FSTOffset; + + m_FileInfoVector.reserve((size_t)Root.m_FileSize); + for (u32 i = 0; i < Root.m_FileSize; i++) + { + u64 const Offset = FSTOffset + (i * 0xC); + u64 const name_offset = Read32(Offset + 0x0); + u64 const offset = static_cast(Read32(Offset + 0x4)) << shift; + u64 const size = Read32(Offset + 0x8); + m_FileInfoVector.emplace_back(name_offset, offset, size); + NameTableOffset += 0xC; } + + BuildFilenames(1, m_FileInfoVector.size(), "", NameTableOffset); } size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset) @@ -307,19 +306,22 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ { SFileInfo& 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(); + rFileInfo.m_FullPath.reserve(_szDirectory.size() + offset_str.size()); - rFileInfo.m_FullPath = _szDirectory + GetStringFromOffset(uOffset); + rFileInfo.m_FullPath.append(_szDirectory.data(), _szDirectory.size()) + .append(offset_str.data(), offset_str.size()) + .append("/", size_t(is_dir)); - // check next index - if (rFileInfo.IsDirectory()) - { - rFileInfo.m_FullPath += '/'; - CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); - } - else + if (!is_dir) { ++CurrentIndex; + continue; } + + // check next index + CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); } return CurrentIndex; -- cgit v1.2.3 From 8ee601d32b3115c53648d0bc7872f209e4e5df4f Mon Sep 17 00:00:00 2001 From: Tres Walsh Date: Sun, 11 Jan 2015 13:49:26 -0800 Subject: Fix variable name ambiguity --- Source/Core/DiscIO/FileSystemGCWii.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index c94dffe6c2..381d1bdbd4 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -278,7 +278,8 @@ void CFileSystemGCWii::InitFileSystem() Read32(FSTOffset + 0x8) }; - if (!Root.IsDirectory()) { return; } + if (!Root.IsDirectory()) + return; if (m_FileInfoVector.size()) PanicAlert("Wtf?"); @@ -287,10 +288,10 @@ void CFileSystemGCWii::InitFileSystem() m_FileInfoVector.reserve((size_t)Root.m_FileSize); for (u32 i = 0; i < Root.m_FileSize; i++) { - u64 const Offset = FSTOffset + (i * 0xC); - u64 const name_offset = Read32(Offset + 0x0); - u64 const offset = static_cast(Read32(Offset + 0x4)) << shift; - u64 const size = Read32(Offset + 0x8); + u64 const read_offset = FSTOffset + (i * 0xC); + u64 const name_offset = Read32(read_offset + 0x0); + u64 const offset = static_cast(Read32(read_offset + 0x4)) << shift; + u64 const size = Read32(read_offset + 0x8); m_FileInfoVector.emplace_back(name_offset, offset, size); NameTableOffset += 0xC; } -- cgit v1.2.3 From d43a920924b11a825d474f75cba3996b676bb731 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 28 Apr 2015 12:48:05 +0200 Subject: Filesystem: Return file list reference instead of modifying argument --- Source/Core/DiscIO/FileSystemGCWii.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 381d1bdbd4..4d4cf0b549 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -215,18 +215,12 @@ std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const return SHIFTJISToUTF8(data); } -size_t CFileSystemGCWii::GetFileList(std::vector &_rFilenames) +const std::vector& CFileSystemGCWii::GetFileList() { if (!m_Initialized) InitFileSystem(); - if (_rFilenames.size()) - PanicAlert("GetFileList : input list has contents?"); - _rFilenames.clear(); - _rFilenames.reserve(m_FileInfoVector.size()); - for (auto& fileInfo : m_FileInfoVector) - _rFilenames.push_back(&fileInfo); - return m_FileInfoVector.size(); + return m_FileInfoVector; } const SFileInfo* CFileSystemGCWii::FindFileInfo(const std::string& _rFullPath) -- cgit v1.2.3 From 0d9ca081bb0114a54ed561e4a884eddbbe9c8647 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 3 May 2015 11:39:20 +0200 Subject: Remove CFileSystemGCWii::Read32 A function that does the same thing was added to IVolume in 4cd00e3. --- Source/Core/DiscIO/FileSystemGCWii.cpp | 43 ++++++++++++++-------------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 381d1bdbd4..3fa3633e67 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -124,9 +124,9 @@ bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::stri bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const { - u32 AppSize = Read32(0x2440 + 0x14);// apploader size - AppSize += Read32(0x2440 + 0x18); // + trailer size - AppSize += 0x20; // + header size + u32 AppSize = m_rVolume->Read32(0x2440 + 0x14, m_Wii); // apploader size + AppSize += m_rVolume->Read32(0x2440 + 0x18, m_Wii); // + trailer size + AppSize += 0x20; // + header size DEBUG_LOG(DISCIO,"AppSize -> %x", AppSize); std::vector buffer(AppSize); @@ -147,14 +147,14 @@ bool CFileSystemGCWii::ExportApploader(const std::string& _rExportFolder) const u32 CFileSystemGCWii::GetBootDOLSize() const { - u32 DolOffset = Read32(0x420) << GetOffsetShift(); + u32 DolOffset = m_rVolume->Read32(0x420, m_Wii) << GetOffsetShift(); u32 DolSize = 0, offset = 0, size = 0; // Iterate through the 7 code segments for (u8 i = 0; i < 7; i++) { - offset = Read32(DolOffset + 0x00 + i * 4); - size = Read32(DolOffset + 0x90 + i * 4); + offset = m_rVolume->Read32(DolOffset + 0x00 + i * 4, m_Wii); + size = m_rVolume->Read32(DolOffset + 0x90 + i * 4, m_Wii); if (offset + size > DolSize) DolSize = offset + size; } @@ -162,8 +162,8 @@ u32 CFileSystemGCWii::GetBootDOLSize() const // Iterate through the 11 data segments for (u8 i = 0; i < 11; i++) { - offset = Read32(DolOffset + 0x1c + i * 4); - size = Read32(DolOffset + 0xac + i * 4); + offset = m_rVolume->Read32(DolOffset + 0x1c + i * 4, m_Wii); + size = m_rVolume->Read32(DolOffset + 0xac + i * 4, m_Wii); if (offset + size > DolSize) DolSize = offset + size; } @@ -172,13 +172,13 @@ u32 CFileSystemGCWii::GetBootDOLSize() const bool CFileSystemGCWii::GetBootDOL(u8* &buffer, u32 DolSize) const { - u32 DolOffset = Read32(0x420) << GetOffsetShift(); + u32 DolOffset = m_rVolume->Read32(0x420, m_Wii) << GetOffsetShift(); return m_rVolume->Read(DolOffset, DolSize, buffer, m_Wii); } bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const { - u32 DolOffset = Read32(0x420) << GetOffsetShift(); + u32 DolOffset = m_rVolume->Read32(0x420, m_Wii) << GetOffsetShift(); u32 DolSize = GetBootDOLSize(); std::vector buffer(DolSize); @@ -197,13 +197,6 @@ bool CFileSystemGCWii::ExportDOL(const std::string& _rExportFolder) const return false; } -u32 CFileSystemGCWii::Read32(u64 _Offset) const -{ - u32 Temp = 0; - m_rVolume->Read(_Offset, 4, (u8*)&Temp, m_Wii); - return Common::swap32(Temp); -} - std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const { std::string data(255, 0x00); @@ -245,12 +238,12 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const std::string& _rFullPath) bool CFileSystemGCWii::DetectFileSystem() { - if (Read32(0x18) == 0x5D1C9EA3) + if (m_rVolume->Read32(0x18, false) == 0x5D1C9EA3) { m_Wii = true; return true; } - else if (Read32(0x1c) == 0xC2339F3D) + else if (m_rVolume->Read32(0x1c, false) == 0xC2339F3D) { m_Wii = false; return true; @@ -265,7 +258,7 @@ void CFileSystemGCWii::InitFileSystem() u32 const shift = GetOffsetShift(); // read the whole FST - u64 FSTOffset = static_cast(Read32(0x424)) << shift; + u64 FSTOffset = static_cast(m_rVolume->Read32(0x424, m_Wii)) << shift; // u32 FSTSize = Read32(0x428); // u32 FSTMaxSize = Read32(0x42C); @@ -273,9 +266,9 @@ void CFileSystemGCWii::InitFileSystem() // read all fileinfos SFileInfo Root { - Read32(FSTOffset + 0x0), + m_rVolume->Read32(FSTOffset + 0x0, m_Wii), static_cast(FSTOffset + 0x4) << shift, - Read32(FSTOffset + 0x8) + m_rVolume->Read32(FSTOffset + 0x8, m_Wii) }; if (!Root.IsDirectory()) @@ -289,9 +282,9 @@ void CFileSystemGCWii::InitFileSystem() for (u32 i = 0; i < Root.m_FileSize; i++) { u64 const read_offset = FSTOffset + (i * 0xC); - u64 const name_offset = Read32(read_offset + 0x0); - u64 const offset = static_cast(Read32(read_offset + 0x4)) << shift; - u64 const size = Read32(read_offset + 0x8); + u64 const name_offset = m_rVolume->Read32(read_offset + 0x0, m_Wii); + u64 const offset = static_cast(m_rVolume->Read32(read_offset + 0x4, m_Wii)) << shift; + u64 const size = m_rVolume->Read32(read_offset + 0x8, m_Wii); m_FileInfoVector.emplace_back(name_offset, offset, size); NameTableOffset += 0xC; } -- cgit v1.2.3 From 272f9d3cbc35c65bc98d89bcd36da3adabf648f9 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 28 Apr 2015 16:47:03 +0200 Subject: FileSystemGCWii: Allow reading files partially --- Source/Core/DiscIO/FileSystemGCWii.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 381d1bdbd4..e23a8cb177 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -63,7 +63,7 @@ const std::string CFileSystemGCWii::GetFileName(u64 _Address) return ""; } -u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) +u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, u64 _MaxBufferSize, u64 _OffsetInFile) { if (!m_Initialized) InitFileSystem(); @@ -72,14 +72,16 @@ u64 CFileSystemGCWii::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size if (pFileInfo == nullptr) return 0; - if (pFileInfo->m_FileSize > _MaxBufferSize) + if (_OffsetInFile >= pFileInfo->m_FileSize) return 0; - DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath.c_str(), - pFileInfo->m_Offset, pFileInfo->m_FileSize); + u64 read_length = std::min(_MaxBufferSize, pFileInfo->m_FileSize - _OffsetInFile); - m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer, m_Wii); - return pFileInfo->m_FileSize; + 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); + + m_rVolume->Read(pFileInfo->m_Offset + _OffsetInFile, read_length, _pBuffer, m_Wii); + return read_length; } bool CFileSystemGCWii::ExportFile(const std::string& _rFullPath, const std::string& _rExportFilename) -- cgit v1.2.3 From cefcb0ace9d363b3679b4e93bcc9ec05f1e5f4f8 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Mon, 18 May 2015 01:08:10 +0200 Subject: Update license headers to GPLv2+ --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index e23a8cb177..16c8bde43b 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -1,5 +1,5 @@ // Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 +// Licensed under GPLv2+ // Refer to the license.txt file included. #include -- cgit v1.2.3 From 30ebb2459eb97ba544547183854775df8460b475 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 24 May 2015 06:55:12 +0200 Subject: Set copyright year to when a file was created --- Source/Core/DiscIO/FileSystemGCWii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp') diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index 16c8bde43b..25843b7555 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -1,4 +1,4 @@ -// Copyright 2013 Dolphin Emulator Project +// Copyright 2008 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. -- cgit v1.2.3