From 6350c93ae15ebead036cbadbea5fae5c67b846f4 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Sat, 20 Nov 2021 21:03:34 +0100 Subject: [PATCH] NetPlay: Pass Wii FS sync data directly to game boot logic instead of indirectly through globals. --- Source/Core/Core/NetPlayClient.cpp | 49 ++++++------------- Source/Core/Core/NetPlayClient.h | 12 +++++ Source/Core/Core/NetPlayProto.h | 4 -- Source/Core/Core/NetPlayServer.cpp | 2 +- .../Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 8 +++ Source/Core/DolphinQt/NetPlay/NetPlayDialog.h | 3 ++ 6 files changed, 40 insertions(+), 38 deletions(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 30f9f6871b..66fc47e253 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -76,8 +76,6 @@ using namespace WiimoteCommon; static std::mutex crit_netplay_client; static NetPlayClient* netplay_client = nullptr; -static std::unique_ptr s_wii_sync_fs; -static std::vector s_wii_sync_titles; static bool s_si_poll_batching = false; // called from ---GUI--- thread @@ -1192,7 +1190,7 @@ void NetPlayClient::OnSyncSaveDataWii(sf::Packet& packet) } } - SetWiiSyncData(std::move(temp_fs), titles); + SetWiiSyncData(std::move(temp_fs), std::move(titles)); SyncSaveDataResponse(true); } @@ -1722,7 +1720,14 @@ bool NetPlayClient::StartGame(const std::string& path) } // boot game - m_dialog->BootGame(path, nullptr); + auto boot_session_data = std::make_unique(); + boot_session_data->SetWiiSyncData(std::move(m_wii_sync_fs), std::move(m_wii_sync_titles), [] { + // on emulation end clean up the Wii save sync directory -- see OnSyncSaveDataWii() + const std::string path = File::GetUserPath(D_USER_IDX) + "Wii" GC_MEMCARD_NETPLAY DIR_SEP; + if (File::Exists(path)) + File::DeleteDirRecursively(path); + }); + m_dialog->BootGame(path, std::move(boot_session_data)); UpdateDevices(); @@ -2252,8 +2257,6 @@ bool NetPlayClient::StopGame() // stop game m_dialog->StopGame(); - ClearWiiSyncData(); - return true; } @@ -2497,6 +2500,13 @@ void NetPlayClient::AdjustPadBufferSize(const unsigned int size) m_dialog->OnPadBufferChanged(size); } +void NetPlayClient::SetWiiSyncData(std::unique_ptr fs, + std::vector titles) +{ + m_wii_sync_fs = std::move(fs); + m_wii_sync_titles = std::move(titles); +} + SyncIdentifier NetPlayClient::GetSDCardIdentifier() { return SyncIdentifier{{}, "sd", {}, {}, {}, {}}; @@ -2539,33 +2549,6 @@ const NetSettings& GetNetSettings() return netplay_client->GetNetSettings(); } -IOS::HLE::FS::FileSystem* GetWiiSyncFS() -{ - return s_wii_sync_fs.get(); -} - -const std::vector& GetWiiSyncTitles() -{ - return s_wii_sync_titles; -} - -void SetWiiSyncData(std::unique_ptr fs, const std::vector& titles) -{ - s_wii_sync_fs = std::move(fs); - s_wii_sync_titles.insert(s_wii_sync_titles.end(), titles.begin(), titles.end()); -} - -void ClearWiiSyncData() -{ - // We're just assuming it will always be here because it is - const std::string path = File::GetUserPath(D_USER_IDX) + "Wii" GC_MEMCARD_NETPLAY DIR_SEP; - if (File::Exists(path)) - File::DeleteDirRecursively(path); - - s_wii_sync_fs.reset(); - s_wii_sync_titles.clear(); -} - void SetSIPollBatching(bool state) { s_si_poll_batching = state; diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 4487358523..24cf494634 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -25,6 +25,11 @@ class BootSessionData; +namespace IOS::HLE::FS +{ +class FileSystem; +} + namespace UICommon { class GameFile; @@ -80,6 +85,8 @@ public: const std::vector& players) = 0; virtual void HideChunkedProgressDialog() = 0; virtual void SetChunkedProgress(int pid, u64 progress) = 0; + + virtual void SetHostWiiSyncTitles(std::vector titles) = 0; }; class Player @@ -150,6 +157,8 @@ public: void AdjustPadBufferSize(unsigned int size); + void SetWiiSyncData(std::unique_ptr fs, std::vector titles); + static SyncIdentifier GetSDCardIdentifier(); protected: @@ -316,6 +325,9 @@ private: u64 m_initial_rtc = 0; u32 m_timebase_frame = 0; + + std::unique_ptr m_wii_sync_fs; + std::vector m_wii_sync_titles; }; void NetPlay_Enable(NetPlayClient* const np); diff --git a/Source/Core/Core/NetPlayProto.h b/Source/Core/Core/NetPlayProto.h index 87af1fe26c..5c5db0da6b 100644 --- a/Source/Core/Core/NetPlayProto.h +++ b/Source/Core/Core/NetPlayProto.h @@ -257,10 +257,6 @@ bool IsNetPlayRunning(); // Precondition: A netplay client instance must be present. In other words, // IsNetPlayRunning() must be true before calling this. const NetSettings& GetNetSettings(); -IOS::HLE::FS::FileSystem* GetWiiSyncFS(); -const std::vector& GetWiiSyncTitles(); -void SetWiiSyncData(std::unique_ptr fs, const std::vector& titles); -void ClearWiiSyncData(); void SetSIPollBatching(bool state); void SendPowerButtonEvent(); bool IsSyncingAllWiiSaves(); diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index fc4f1da4d2..c0548a3384 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -1819,7 +1819,7 @@ bool NetPlayServer::SyncSaveData() } // Set titles for host-side loading in WiiRoot - SetWiiSyncData(nullptr, titles); + m_dialog->SetHostWiiSyncTitles(std::move(titles)); SendChunkedToClients(std::move(pac), 1, "Wii Save Synchronization"); } diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index 7e05a51add..bcf5704a29 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -40,6 +40,7 @@ #ifdef HAS_LIBMGBA #include "Core/HW/GBACore.h" #endif +#include "Core/IOS/FS/FileSystem.h" #include "Core/NetPlayServer.h" #include "Core/SyncIdentifier.h" @@ -1177,3 +1178,10 @@ void NetPlayDialog::SetChunkedProgress(const int pid, const u64 progress) m_chunked_progress_dialog->SetProgress(pid, progress); }); } + +void NetPlayDialog::SetHostWiiSyncTitles(std::vector titles) +{ + auto client = Settings::Instance().GetNetPlayClient(); + if (client) + client->SetWiiSyncData(nullptr, std::move(titles)); +} diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h index 5844c25cb4..fd14cea4e7 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h @@ -94,6 +94,9 @@ public: const std::vector& players) override; void HideChunkedProgressDialog() override; void SetChunkedProgress(int pid, u64 progress) override; + + void SetHostWiiSyncTitles(std::vector titles) override; + signals: void Stop();