From 9ddef558966c5d524e821aaac83bb46801a9c004 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Fri, 7 Jun 2024 15:22:53 +0800 Subject: [PATCH] Use the one who creates the transmission as host --- src/signal_server.cpp | 20 ++++++++++++------- src/transmission_manager.cpp | 38 ++++++++++++++++++++++++++++++++++++ src/transmission_manager.h | 7 +++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/signal_server.cpp b/src/signal_server.cpp index 444b395..6cd0391 100644 --- a/src/signal_server.cpp +++ b/src/signal_server.cpp @@ -73,9 +73,10 @@ bool SignalServer::on_close(websocketpp::connection_hdl hdl) { transmission_id); } - if (std::string::npos != user_id.find("H-")) { + if (transmission_manager_.IsHostOfTransmission(user_id, transmission_id)) { transmission_list_.erase(transmission_id); transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); + transmission_manager_.ReleaseHostIdFromTransmission(transmission_id); LOG_INFO("Release transmission [{}] due to host leaves", transmission_id); } @@ -126,9 +127,9 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, case "create_transmission"_H: { std::string transmission_id = j["transmission_id"].get(); std::string password = j["password"].get(); - std::string user_id = j["user_id"].get(); - LOG_INFO("Receive user id [{}] create transmission request with id [{}]", - user_id, transmission_id); + std::string host_id = j["user_id"].get(); + LOG_INFO("Receive host id [{}] create transmission request with id [{}]", + host_id, transmission_id); if (transmission_list_.find(transmission_id) == transmission_list_.end()) { if (transmission_id.empty()) { @@ -144,9 +145,11 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, } transmission_list_.insert(transmission_id); - transmission_manager_.BindUserIdToTransmission(user_id, + transmission_manager_.BindHostIdToTransmission(host_id, transmission_id); - transmission_manager_.BindUserIdToWsHandle(user_id, hdl); + transmission_manager_.BindUserIdToTransmission(host_id, + transmission_id); + transmission_manager_.BindUserIdToWsHandle(host_id, hdl); transmission_manager_.BindPasswordToTransmission(password, transmission_id); @@ -184,9 +187,12 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, } transmission_manager_.ReleaseUserIdFromTransmission(hdl); - if (std::string::npos != user_id.find("H-")) { + + if (transmission_manager_.IsHostOfTransmission(user_id, + transmission_id)) { transmission_list_.erase(transmission_id); transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); + transmission_manager_.ReleaseHostIdFromTransmission(transmission_id); LOG_INFO("Release transmission [{}] due to host leaves", transmission_id); } diff --git a/src/transmission_manager.cpp b/src/transmission_manager.cpp index 2bf7329..eb14235 100644 --- a/src/transmission_manager.cpp +++ b/src/transmission_manager.cpp @@ -40,6 +40,22 @@ bool TransmissionManager::BindUserIdToTransmission( return true; } +bool TransmissionManager::BindHostIdToTransmission( + const std::string& host_id, const std::string& transmission_id) { + if (transmission_host_id_list_.find(transmission_id) == + transmission_host_id_list_.end()) { + transmission_host_id_list_[transmission_id] = host_id; + LOG_INFO("Bind host id [{}] to transmission [{}]", host_id, + transmission_id); + return true; + } else { + LOG_WARN("Host id [{}] already bind to transmission [{}]", host_id, + transmission_id); + return false; + } + return true; +} + bool TransmissionManager::BindPasswordToTransmission( const std::string& password, const std::string& transmission_id) { if (transmission_password_list_.find(transmission_id) == @@ -71,6 +87,15 @@ bool TransmissionManager::BindUserIdToWsHandle( return true; } +bool TransmissionManager::IsHostOfTransmission( + const std::string& user_id, const std::string& transmission_id) { + if (transmission_host_id_list_.find(transmission_id) == + transmission_host_id_list_.end()) { + return false; + } + return transmission_host_id_list_[transmission_id] == user_id; +} + std::string TransmissionManager::ReleaseUserIdFromTransmission( websocketpp::connection_hdl hdl) { for (auto it = user_id_ws_hdl_list_.begin(); it != user_id_ws_hdl_list_.end(); @@ -126,6 +151,19 @@ bool TransmissionManager::ReleasePasswordFromTransmission( return true; } +bool TransmissionManager::ReleaseHostIdFromTransmission( + const std::string& transmission_id) { + if (transmission_host_id_list_.find(transmission_id) == + transmission_host_id_list_.end()) { + LOG_ERROR("No transmission with id [{}]", transmission_id); + return false; + } + + transmission_host_id_list_.erase(transmission_id); + + return true; +} + websocketpp::connection_hdl TransmissionManager::GetWsHandle( const std::string& user_id) { if (user_id_ws_hdl_list_.find(user_id) != user_id_ws_hdl_list_.end()) { diff --git a/src/transmission_manager.h b/src/transmission_manager.h index edff5bb..4c196da 100644 --- a/src/transmission_manager.h +++ b/src/transmission_manager.h @@ -17,14 +17,20 @@ class TransmissionManager { public: bool BindUserIdToTransmission(const std::string& user_id, const std::string& transmission_id); + bool BindHostIdToTransmission(const std::string& host_id, + const std::string& transmission_id); bool BindPasswordToTransmission(const std::string& password, const std::string& transmission_id); bool BindUserIdToWsHandle(const std::string& user_id, websocketpp::connection_hdl hdl); + bool IsHostOfTransmission(const std::string& user_id, + const std::string& transmission_id); + std::string ReleaseUserIdFromTransmission(websocketpp::connection_hdl hdl); bool ReleaseAllUserIdFromTransmission(const std::string& transmission_id); bool ReleasePasswordFromTransmission(const std::string& transmission_id); + bool ReleaseHostIdFromTransmission(const std::string& transmission_id); websocketpp::connection_hdl GetWsHandle(const std::string& user_id); std::string GetUserId(websocketpp::connection_hdl hdl); @@ -34,6 +40,7 @@ class TransmissionManager { private: std::map> transmission_user_id_list_; + std::map transmission_host_id_list_; std::map transmission_password_list_; std::map user_id_ws_hdl_list_; };