From 4a9ea65e496f1c592682411fef377d70dd2050af Mon Sep 17 00:00:00 2001 From: zhupengfei Date: Sat, 20 Apr 2019 10:42:20 +0800 Subject: [PATCH] core, citra_qt: Allow credentials update in multiplayer announce session Allows updating the credentials of the announce session, thus allowing credentials changes to be reflected before citra restart. To avoid race conditions and web errors (you can only update the room that you created, i.e. changing credentials halfway will make it break), now you can only use the Citra Web Services settings when not hosting a public room. --- src/citra_qt/configuration/configure_dialog.cpp | 3 ++- src/citra_qt/configuration/configure_dialog.h | 3 ++- src/citra_qt/configuration/configure_web.cpp | 5 +++++ src/citra_qt/configuration/configure_web.h | 1 + src/citra_qt/configuration/configure_web.ui | 10 ++++++++++ src/citra_qt/main.cpp | 5 ++++- src/citra_qt/multiplayer/state.cpp | 8 ++++++++ src/citra_qt/multiplayer/state.h | 8 ++++++++ src/core/announce_multiplayer_session.cpp | 14 ++++++++++++++ src/core/announce_multiplayer_session.h | 11 +++++++++++ 10 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp index e1fc5abac..653f2a387 100644 --- a/src/citra_qt/configuration/configure_dialog.cpp +++ b/src/citra_qt/configuration/configure_dialog.cpp @@ -10,10 +10,11 @@ #include "core/settings.h" #include "ui_configure.h" -ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry) +ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, bool enable_web_config) : QDialog(parent), registry(registry), ui(new Ui::ConfigureDialog) { ui->setupUi(this); ui->hotkeysTab->Populate(registry); + ui->webTab->SetWebServiceConfigEnabled(enable_web_config); this->PopulateSelectionList(); connect(ui->uiTab, &ConfigureUi::languageChanged, this, &ConfigureDialog::onLanguageChanged); diff --git a/src/citra_qt/configuration/configure_dialog.h b/src/citra_qt/configuration/configure_dialog.h index 91234ca0b..6fab7cff1 100644 --- a/src/citra_qt/configuration/configure_dialog.h +++ b/src/citra_qt/configuration/configure_dialog.h @@ -17,7 +17,8 @@ class ConfigureDialog : public QDialog { Q_OBJECT public: - explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry); + explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, + bool enable_web_config = true); ~ConfigureDialog() override; void applyConfiguration(); diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp index 56f876524..e8a0cc21f 100644 --- a/src/citra_qt/configuration/configure_web.cpp +++ b/src/citra_qt/configuration/configure_web.cpp @@ -118,3 +118,8 @@ void ConfigureWeb::OnLoginVerified() { void ConfigureWeb::retranslateUi() { ui->retranslateUi(this); } + +void ConfigureWeb::SetWebServiceConfigEnabled(bool enabled) { + ui->label_disable_info->setVisible(!enabled); + ui->groupBoxWebConfig->setEnabled(enabled); +} diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h index d52bab7a0..2e0ab2e9b 100644 --- a/src/citra_qt/configuration/configure_web.h +++ b/src/citra_qt/configuration/configure_web.h @@ -22,6 +22,7 @@ public: void applyConfiguration(); void retranslateUi(); void setConfiguration(); + void SetWebServiceConfigEnabled(bool enabled); private: void RefreshTelemetryID(); diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui index a8aeda9ad..ab3559157 100644 --- a/src/citra_qt/configuration/configure_web.ui +++ b/src/citra_qt/configuration/configure_web.ui @@ -118,6 +118,16 @@ + + + + Web Service configuration can only be changed when a public room isn't being hosted. + + + true + + + diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index bcff0b9fc..3c2a9f5f5 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -1335,7 +1335,8 @@ void GMainWindow::OnCheats() { } void GMainWindow::OnConfigure() { - ConfigureDialog configureDialog(this, hotkey_registry); + ConfigureDialog configureDialog(this, hotkey_registry, + !multiplayer_state->IsHostingPublicRoom()); connect(&configureDialog, &ConfigureDialog::languageChanged, this, &GMainWindow::OnLanguageChanged); auto old_theme = UISettings::values.theme; @@ -1350,6 +1351,8 @@ void GMainWindow::OnConfigure() { UpdateUITheme(); if (UISettings::values.enable_discord_presence != old_discord_presence) SetDiscordEnabled(UISettings::values.enable_discord_presence); + if (!multiplayer_state->IsHostingPublicRoom()) + multiplayer_state->UpdateCredentials(); emit UpdateThemedIcons(); SyncMenuUISettings(); game_list->RefreshGameDirectory(); diff --git a/src/citra_qt/multiplayer/state.cpp b/src/citra_qt/multiplayer/state.cpp index 809bcddca..c122a5c83 100644 --- a/src/citra_qt/multiplayer/state.cpp +++ b/src/citra_qt/multiplayer/state.cpp @@ -278,3 +278,11 @@ void MultiplayerState::OnDirectConnectToRoom() { } BringWidgetToFront(direct_connect); } + +bool MultiplayerState::IsHostingPublicRoom() const { + return announce_multiplayer_session->IsRunning(); +} + +void MultiplayerState::UpdateCredentials() { + announce_multiplayer_session->UpdateCredentials(); +} diff --git a/src/citra_qt/multiplayer/state.h b/src/citra_qt/multiplayer/state.h index 8061d18cf..78a5530dd 100644 --- a/src/citra_qt/multiplayer/state.h +++ b/src/citra_qt/multiplayer/state.h @@ -38,6 +38,14 @@ public: void retranslateUi(); + /** + * Whether a public room is being hosted or not. + * When this is true, Web Services configuration should be disabled. + */ + bool IsHostingPublicRoom() const; + + void UpdateCredentials(); + public slots: void OnNetworkStateChanged(const Network::RoomMember::State& state); void OnNetworkError(const Network::RoomMember::Error& error); diff --git a/src/core/announce_multiplayer_session.cpp b/src/core/announce_multiplayer_session.cpp index 90293ec92..d46c8db56 100644 --- a/src/core/announce_multiplayer_session.cpp +++ b/src/core/announce_multiplayer_session.cpp @@ -146,4 +146,18 @@ AnnounceMultiplayerRoom::RoomList AnnounceMultiplayerSession::GetRoomList() { return backend->GetRoomList(); } +bool AnnounceMultiplayerSession::IsRunning() const { + return announce_multiplayer_thread != nullptr; +} + +void AnnounceMultiplayerSession::UpdateCredentials() { + ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); + +#ifdef ENABLE_WEB_SERVICE + backend = std::make_unique(Settings::values.web_api_url, + Settings::values.citra_username, + Settings::values.citra_token); +#endif +} + } // namespace Core diff --git a/src/core/announce_multiplayer_session.h b/src/core/announce_multiplayer_session.h index 07e09a448..5647972d0 100644 --- a/src/core/announce_multiplayer_session.h +++ b/src/core/announce_multiplayer_session.h @@ -67,6 +67,17 @@ public: */ AnnounceMultiplayerRoom::RoomList GetRoomList(); + /** + * Whether the announce session is still running + */ + bool IsRunning() const; + + /** + * Recreates the backend, updating the credentials. + * This can only be used when the announce session is not running. + */ + void UpdateCredentials(); + private: Common::Event shutdown_event; std::mutex callback_mutex;