diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp b/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp index 27382a8a48..8785c9736d 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp +++ b/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp @@ -909,6 +909,22 @@ GCMemcardImportFileRetVal GCMemcard::ImportFile(const DEntry& direntry, return GCMemcardImportFileRetVal::SUCCESS; } +std::optional GCMemcard::ExportFile(u8 index) const +{ + if (!m_valid || index >= DIRLEN) + return std::nullopt; + + Savefile savefile; + savefile.dir_entry = GetActiveDirectory().m_dir_entries[index]; + if (savefile.dir_entry.m_gamecode == DEntry::UNINITIALIZED_GAMECODE) + return std::nullopt; + + if (GetSaveData(index, savefile.blocks) != GCMemcardGetSaveDataRetVal::SUCCESS) + return std::nullopt; + + return savefile; +} + GCMemcardRemoveFileRetVal GCMemcard::RemoveFile(u8 index) // index in the directory array { if (!m_valid) diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcard.h b/Source/Core/Core/HW/GCMemcard/GCMemcard.h index ffa3697119..5c2d431123 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcard.h +++ b/Source/Core/Core/HW/GCMemcard/GCMemcard.h @@ -505,6 +505,9 @@ public: // adds the file to the directory and copies its contents GCMemcardImportFileRetVal ImportFile(const DEntry& direntry, std::vector& saveBlocks); + // Fetches the savefile at the given directory index, if any. + std::optional ExportFile(u8 index) const; + // delete a file from the directory GCMemcardRemoveFileRetVal RemoveFile(u8 index);