blob: dd64443650fe2e6511e7a898bba066cf95c81a9e [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/service_manager/public/cpp/interface_provider.h"
#include "base/macros.h"
namespace service_manager {
InterfaceProvider::InterfaceProvider(
scoped_refptr<base::SequencedTaskRunner> task_runner)
: pending_receiver_(
interface_provider_.BindNewPipeAndPassReceiver(task_runner)),
task_runner_(std::move(task_runner)) {
DCHECK(task_runner_);
}
InterfaceProvider::InterfaceProvider(
mojo::PendingRemote<mojom::InterfaceProvider> interface_provider,
scoped_refptr<base::SequencedTaskRunner> task_runner)
: interface_provider_(std::move(interface_provider), task_runner),
task_runner_(std::move(task_runner)) {
DCHECK(task_runner_);
}
InterfaceProvider::~InterfaceProvider() = default;
void InterfaceProvider::Close() {
if (pending_receiver_)
pending_receiver_.PassPipe().reset();
interface_provider_.reset();
}
void InterfaceProvider::Bind(
mojo::PendingRemote<mojom::InterfaceProvider> interface_provider) {
DCHECK(pending_receiver_ || !interface_provider_);
DCHECK(forward_callback_.is_null());
if (pending_receiver_) {
mojo::FusePipes(std::move(pending_receiver_),
std::move(interface_provider));
} else {
interface_provider_.Bind(std::move(interface_provider), task_runner_);
}
}
void InterfaceProvider::Forward(const ForwardCallback& callback) {
DCHECK(pending_receiver_);
DCHECK(forward_callback_.is_null());
interface_provider_.reset();
pending_receiver_.PassPipe().reset();
forward_callback_ = callback;
}
void InterfaceProvider::SetConnectionLostClosure(
base::OnceClosure connection_lost_closure) {
interface_provider_.set_disconnect_handler(
std::move(connection_lost_closure));
}
base::WeakPtr<InterfaceProvider> InterfaceProvider::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void InterfaceProvider::GetInterfaceByName(
const std::string& name,
mojo::ScopedMessagePipeHandle request_handle) {
// Local binders can be registered via TestApi.
auto it = binders_.find(name);
if (it != binders_.end()) {
it->second.Run(std::move(request_handle));
return;
}
if (!forward_callback_.is_null()) {
DCHECK(!interface_provider_.is_bound());
forward_callback_.Run(name, std::move(request_handle));
} else {
DCHECK(interface_provider_.is_bound());
interface_provider_->GetInterface(name, std::move(request_handle));
}
}
bool InterfaceProvider::HasBinderForName(const std::string& name) const {
return binders_.find(name) != binders_.end();
}
void InterfaceProvider::ClearBinderForName(const std::string& name) {
binders_.erase(name);
}
void InterfaceProvider::ClearBinders() {
binders_.clear();
}
} // namespace service_manager