chromium/chromecast/mojo/remote_interfaces.cc

// 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