diff --git a/src/signal_negotiation.cpp b/src/signal_negotiation.cpp index 5fe1eb2..65c4225 100644 --- a/src/signal_negotiation.cpp +++ b/src/signal_negotiation.cpp @@ -168,6 +168,63 @@ bool SignalNegotiation::query_user_id_list(websocketpp::connection_hdl hdl, return true; } +bool SignalNegotiation::join_transmission(websocketpp::connection_hdl hdl, + const json& j) { + std::string transmission_id_pwd = j["transmission_id"].get(); + std::string transmission_id; + std::string password; + + if (transmission_id_pwd.find("@") != std::string::npos) { + transmission_id = + transmission_id_pwd.substr(0, transmission_id_pwd.find("@")); + password = transmission_id_pwd.substr(transmission_id_pwd.find("@") + 1); + } else { + transmission_id = transmission_id_pwd; + password = ""; + } + + std::string user_id = j["user_id"].get(); + LOG_INFO("[{}] joins transmission [{}]", user_id.c_str(), + transmission_id.c_str()); + + int ret = device_db_manager_->VerifyDevice(transmission_id, password); + + if (0 == ret) { + transmission_manager_->BindGuestToTransmission(user_id, transmission_id); + + json message = {{"type", "user_join_transmission"}, + {"transmission_id", transmission_id}, + {"user_id", user_id}, + {"status", "success"}}; + + std::string host_id = + transmission_manager_->GetHostIdOfTransmission(transmission_id); + + if (!host_id.empty()) { + send_msg_(transmission_manager_->GetWsHandle(host_id), message); + } + } else if (-1 == ret) { + LOG_ERROR("Password incorrect for transmission id [{}]", + transmission_id.c_str()); + json message = {{"type", "user_join_transmission"}, + {"transmission_id", transmission_id}, + {"status", "failed"}, + {"reason", "Incorrect password"}}; + + send_msg_(hdl, message); + } else if (-2 == ret) { + LOG_ERROR("No such transmission id [{}]", transmission_id.c_str()); + json message = {{"type", "user_join_transmission"}, + {"transmission_id", transmission_id}, + {"status", "failed"}, + {"reason", "No such transmission id"}}; + + send_msg_(hdl, message); + } + + return true; +} + bool SignalNegotiation::offer(websocketpp::connection_hdl hdl, const json& j) { std::string transmission_id = j["transmission_id"].get(); std::string remote_user_id = j["remote_user_id"].get(); diff --git a/src/signal_negotiation.h b/src/signal_negotiation.h index 7f4099d..3cd44ec 100644 --- a/src/signal_negotiation.h +++ b/src/signal_negotiation.h @@ -28,6 +28,8 @@ class SignalNegotiation { bool login_user(websocketpp::connection_hdl hdl, const json& j); bool leave_transmission(websocketpp::connection_hdl hdl, const json& j); bool query_user_id_list(websocketpp::connection_hdl hdl, const json& j); + bool join_transmission(websocketpp::connection_hdl hdl, + const json& j); bool offer(websocketpp::connection_hdl hdl, const json& j); bool answer(websocketpp::connection_hdl hdl, const json& j); bool new_candidate(websocketpp::connection_hdl hdl, const json& j); diff --git a/src/signal_server.cpp b/src/signal_server.cpp index 5dad4ef..e46fcf8 100644 --- a/src/signal_server.cpp +++ b/src/signal_server.cpp @@ -182,6 +182,9 @@ void SignalServer::OnMessage(websocketpp::connection_hdl hdl, case "query_user_id_list"_H: signal_negotiation_->query_user_id_list(hdl, j); break; + case "join_transmission"_H: + signal_negotiation_->join_transmission(hdl, j); + break; case "offer"_H: signal_negotiation_->offer(hdl, j); break; diff --git a/src/transmission_manager.cpp b/src/transmission_manager.cpp index aa1ad24..86df0d5 100644 --- a/src/transmission_manager.cpp +++ b/src/transmission_manager.cpp @@ -71,6 +71,16 @@ std::vector TransmissionManager::GetAllUserIdOfTransmission( return result; } +std::string TransmissionManager::GetHostIdOfTransmission( + const std::string& transmission_id) { + std::lock_guard lock(ws_hdl_alive_checker_mutex_); + if (transmission_host_id_list_.count(transmission_id)) { + return transmission_host_id_list_[transmission_id]; + } + + return ""; +} + bool TransmissionManager::BindHostToTransmission( const std::string& host_id, const std::string& transmission_id) { std::lock_guard lock(ws_hdl_alive_checker_mutex_); diff --git a/src/transmission_manager.h b/src/transmission_manager.h index fde9645..11795b9 100644 --- a/src/transmission_manager.h +++ b/src/transmission_manager.h @@ -30,6 +30,8 @@ class TransmissionManager { std::vector GetAllUserIdOfTransmission( const std::string& transmission_id); + std::string GetHostIdOfTransmission(const std::string& transmission_id); + bool BindHostToTransmission(const std::string& host_id, const std::string& transmission_id); bool BindGuestToTransmission(const std::string& guest_id,