// 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 "mojo/public/cpp/bindings/lib/binding_state.h" #include "mojo/public/cpp/bindings/lib/task_runner_helper.h" namespace mojo { namespace internal { BindingStateBase::BindingStateBase() : weak_ptr_factory_(this) {} BindingStateBase::~BindingStateBase() = default; void BindingStateBase::AddFilter(std::unique_ptr<MessageReceiver> filter) { DCHECK(endpoint_client_); endpoint_client_->AddFilter(std::move(filter)); } bool BindingStateBase::HasAssociatedInterfaces() const { return router_ ? router_->HasAssociatedEndpoints() : false; } void BindingStateBase::PauseIncomingMethodCallProcessing() { DCHECK(router_); router_->PauseIncomingMethodCallProcessing(); } void BindingStateBase::ResumeIncomingMethodCallProcessing() { DCHECK(router_); router_->ResumeIncomingMethodCallProcessing(); } bool BindingStateBase::WaitForIncomingMethodCall(MojoDeadline deadline) { DCHECK(router_); return router_->WaitForIncomingMessage(deadline); } void BindingStateBase::Close() { if (!router_) return; endpoint_client_.reset(); router_->CloseMessagePipe(); router_ = nullptr; } void BindingStateBase::CloseWithReason(uint32_t custom_reason, const std::string& description) { if (endpoint_client_) endpoint_client_->CloseWithReason(custom_reason, description); Close(); } ReportBadMessageCallback BindingStateBase::GetBadMessageCallback() { return base::BindOnce( [](ReportBadMessageCallback inner_callback, base::WeakPtr<BindingStateBase> binding, const std::string& error) { std::move(inner_callback).Run(error); if (binding) binding->Close(); }, mojo::GetBadMessageCallback(), weak_ptr_factory_.GetWeakPtr()); } void BindingStateBase::FlushForTesting() { endpoint_client_->FlushForTesting(); } void BindingStateBase::EnableTestingMode() { DCHECK(is_bound()); router_->EnableTestingMode(); } scoped_refptr<internal::MultiplexRouter> BindingStateBase::RouterForTesting() { return router_; } void BindingStateBase::BindInternal( ScopedMessagePipeHandle handle, scoped_refptr<base::SingleThreadTaskRunner> runner, const char* interface_name, std::unique_ptr<MessageReceiver> request_validator, bool passes_associated_kinds, bool has_sync_methods, MessageReceiverWithResponderStatus* stub, uint32_t interface_version) { DCHECK(!is_bound()) << "Attempting to bind interface that is already bound: " << interface_name; auto sequenced_runner = GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)); MultiplexRouter::Config config = passes_associated_kinds ? MultiplexRouter::MULTI_INTERFACE : (has_sync_methods ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS : MultiplexRouter::SINGLE_INTERFACE); router_ = new MultiplexRouter(std::move(handle), config, false, sequenced_runner); router_->SetMasterInterfaceName(interface_name); endpoint_client_.reset(new InterfaceEndpointClient( router_->CreateLocalEndpointHandle(kMasterInterfaceId), stub, std::move(request_validator), has_sync_methods, std::move(sequenced_runner), interface_version)); } } // namesapce internal } // namespace mojo