diff options
author | Jordan Bayles <jophba@chromium.org> | 2020-09-30 10:29:25 -0700 |
---|---|---|
committer | Jordan Bayles <jophba@chromium.org> | 2020-09-30 18:36:41 +0000 |
commit | 8b462fcdef400fe15823ec8c89b7037720aeeb37 (patch) | |
tree | 89fdb1ead7d589c612f0d84f94b4b1c0bdeb0660 /cast | |
parent | a528cef8c93efde2f2f62ec461b835bc8e8434b8 (diff) | |
download | openscreen-8b462fcdef400fe15823ec8c89b7037720aeeb37.tar.gz |
Properly use message router for cast message port
This patch updates the CastSocketMessagePort to properly use the
VirtualConnectionRouter::Send method instead of directly calling on the
socket. This also includes a change to register new connections on the
VirtualConnectionManager.
Change-Id: I7dab0f2d2595f7c5a5a78bfa8444e22e7f083dd1
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/2432093
Commit-Queue: Jordan Bayles <jophba@chromium.org>
Reviewed-by: Yuri Wiitala <miu@chromium.org>
Diffstat (limited to 'cast')
-rw-r--r-- | cast/common/channel/cast_socket_message_port.cc | 47 | ||||
-rw-r--r-- | cast/common/channel/virtual_connection_router.h | 2 |
2 files changed, 34 insertions, 15 deletions
diff --git a/cast/common/channel/cast_socket_message_port.cc b/cast/common/channel/cast_socket_message_port.cc index 2b596830..c3ca0df0 100644 --- a/cast/common/channel/cast_socket_message_port.cc +++ b/cast/common/channel/cast_socket_message_port.cc @@ -9,6 +9,7 @@ #include "cast/common/channel/message_util.h" #include "cast/common/channel/proto/cast_channel.pb.h" #include "cast/common/channel/virtual_connection.h" +#include "cast/common/channel/virtual_connection_manager.h" namespace openscreen { namespace cast { @@ -16,7 +17,9 @@ namespace cast { CastSocketMessagePort::CastSocketMessagePort(VirtualConnectionRouter* router) : router_(router) {} -CastSocketMessagePort::~CastSocketMessagePort() = default; +CastSocketMessagePort::~CastSocketMessagePort() { + ResetClient(); +} // NOTE: we assume here that this message port is already the client for // the passed in socket, so leave the socket's client unchanged. However, @@ -34,14 +37,22 @@ int CastSocketMessagePort::GetSocketId() { void CastSocketMessagePort::SetClient(MessagePort::Client* client, std::string client_sender_id) { + ResetClient(); + client_ = client; client_sender_id_ = std::move(client_sender_id); router_->AddHandlerForLocalId(client_sender_id_, this); } void CastSocketMessagePort::ResetClient() { + if (!client_) { + return; + } + client_ = nullptr; router_->RemoveHandlerForLocalId(client_sender_id_); + router_->manager()->RemoveConnectionsByLocalId( + client_sender_id_, VirtualConnection::CloseReason::kClosedBySelf); client_sender_id_.clear(); } @@ -49,26 +60,27 @@ void CastSocketMessagePort::PostMessage( const std::string& destination_sender_id, const std::string& message_namespace, const std::string& message) { - ::cast::channel::CastMessage cast_message; - cast_message.set_protocol_version(::cast::channel::CastMessage::CASTV2_1_0); - cast_message.set_namespace_(message_namespace.data(), - message_namespace.size()); - cast_message.set_source_id(client_sender_id_.data(), - client_sender_id_.size()); - cast_message.set_destination_id(destination_sender_id.data(), - destination_sender_id.size()); - cast_message.set_payload_type(::cast::channel::CastMessage::STRING); - cast_message.set_payload_utf8(message.data(), message.size()); + if (!client_) { + OSP_DLOG_WARN << "Not posting message due to nullptr client_"; + return; + } if (!socket_) { client_->OnError(Error::Code::kAlreadyClosed); return; } - // TODO(jophba): migrate to using VirtualConnectionRouter::Send(). - Error error = socket_->Send(cast_message); - if (!error.ok()) { - client_->OnError(error); + VirtualConnection connection{client_sender_id_, destination_sender_id, + socket_->socket_id()}; + if (!router_->manager()->GetConnectionData(connection)) { + router_->manager()->AddConnection(connection, + VirtualConnection::AssociatedData{}); + } + + const Error send_error = router_->Send( + std::move(connection), MakeSimpleUTF8Message(message_namespace, message)); + if (!send_error.ok()) { + client_->OnError(std::move(send_error)); } } @@ -78,6 +90,11 @@ void CastSocketMessagePort::OnMessage(VirtualConnectionRouter* router, OSP_DCHECK(router == router_); OSP_DCHECK(socket_.get() == socket); OSP_DVLOG << "Received a cast socket message"; + if (!client_) { + OSP_DLOG_WARN << "Dropping message due to nullptr client_"; + return; + } + client_->OnMessage(message.source_id(), message.namespace_(), message.payload_utf8()); } diff --git a/cast/common/channel/virtual_connection_router.h b/cast/common/channel/virtual_connection_router.h index 3f549b1e..3238d5aa 100644 --- a/cast/common/channel/virtual_connection_router.h +++ b/cast/common/channel/virtual_connection_router.h @@ -67,6 +67,8 @@ class VirtualConnectionRouter final : public CastSocket::Client { void OnMessage(CastSocket* socket, ::cast::channel::CastMessage message) override; + VirtualConnectionManager* manager() { return vc_manager_; } + private: struct SocketWithHandler { std::unique_ptr<CastSocket> socket; |