| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/mojo/remote_interfaces.h" |
| |
| #include "base/check.h" |
| |
| namespace chromecast { |
| |
| RemoteInterfaces::RemoteInterfaces() { |
| Init(); |
| DCHECK(remote_provider_.is_bound()); |
| } |
| |
| RemoteInterfaces::RemoteInterfaces( |
| mojo::PendingRemote<mojom::RemoteInterfaces> provider) { |
| Init(); |
| DCHECK(remote_provider_.is_bound()); |
| SetProvider(std::move(provider)); |
| } |
| |
| RemoteInterfaces::~RemoteInterfaces() = default; |
| |
| void RemoteInterfaces::SetProvider( |
| mojo::PendingRemote<mojom::RemoteInterfaces> provider) { |
| DCHECK(waiting_receiver_); |
| mojo::FusePipes(std::move(waiting_receiver_), std::move(provider)); |
| } |
| |
| mojo::PendingRemote<mojom::RemoteInterfaces> RemoteInterfaces::Forward() { |
| mojo::PendingRemote<mojom::RemoteInterfaces> pending_remote; |
| remote_provider_->AddClient(pending_remote.InitWithNewPipeAndPassReceiver()); |
| return pending_remote; |
| } |
| |
| mojo::PendingReceiver<mojom::RemoteInterfaces> RemoteInterfaces::GetReceiver() { |
| DCHECK(waiting_receiver_); |
| return std::move(waiting_receiver_); |
| } |
| |
| void RemoteInterfaces::Bind(mojo::GenericPendingReceiver receiver) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| // Important: We need to copy the interface name before sending it. |
| std::string interface_name = *receiver.interface_name(); |
| remote_provider_->BindInterface(interface_name, receiver.PassPipe()); |
| } |
| |
| void RemoteInterfaces::Init() { |
| if (remote_provider_.is_bound()) { |
| LOG(WARNING) << "Remote provider disconnected, reseting..."; |
| remote_provider_.reset(); |
| } |
| waiting_receiver_ = remote_provider_.BindNewPipeAndPassReceiver(); |
| remote_provider_.set_disconnect_handler( |
| base::BindOnce(&RemoteInterfaces::Init, base::Unretained(this))); |
| } |
| |
| } // namespace chromecast |