tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "mojo/public/cpp/bindings/lib/binding_state.h" |
| 6 | |
Sam McNally | d482b4b | 2017-07-17 03:45:03 | [diff] [blame] | 7 | #include "mojo/public/cpp/bindings/lib/task_runner_helper.h" |
| 8 | |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 9 | namespace mojo { |
| 10 | namespace internal { |
| 11 | |
Marijn Kruisselbrink | 3325c22c | 2017-06-07 20:54:26 | [diff] [blame] | 12 | BindingStateBase::BindingStateBase() : weak_ptr_factory_(this) {} |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 13 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 14 | BindingStateBase::~BindingStateBase() = default; |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 15 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 16 | void BindingStateBase::AddFilter(std::unique_ptr<MessageReceiver> filter) { |
rockot | 21bb8854 | 2016-08-26 21:21:32 | [diff] [blame] | 17 | DCHECK(endpoint_client_); |
| 18 | endpoint_client_->AddFilter(std::move(filter)); |
| 19 | } |
| 20 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 21 | bool BindingStateBase::HasAssociatedInterfaces() const { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 22 | return router_ ? router_->HasAssociatedEndpoints() : false; |
| 23 | } |
| 24 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 25 | void BindingStateBase::PauseIncomingMethodCallProcessing() { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 26 | DCHECK(router_); |
| 27 | router_->PauseIncomingMethodCallProcessing(); |
| 28 | } |
Marijn Kruisselbrink | 3325c22c | 2017-06-07 20:54:26 | [diff] [blame] | 29 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 30 | void BindingStateBase::ResumeIncomingMethodCallProcessing() { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 31 | DCHECK(router_); |
| 32 | router_->ResumeIncomingMethodCallProcessing(); |
| 33 | } |
| 34 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 35 | bool BindingStateBase::WaitForIncomingMethodCall(MojoDeadline deadline) { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 36 | DCHECK(router_); |
| 37 | return router_->WaitForIncomingMessage(deadline); |
| 38 | } |
| 39 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 40 | void BindingStateBase::Close() { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 41 | if (!router_) |
| 42 | return; |
| 43 | |
| 44 | endpoint_client_.reset(); |
| 45 | router_->CloseMessagePipe(); |
| 46 | router_ = nullptr; |
yzshen | 24438d2 | 2016-09-13 17:03:53 | [diff] [blame] | 47 | } |
| 48 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 49 | void BindingStateBase::CloseWithReason(uint32_t custom_reason, |
| 50 | const std::string& description) { |
yzshen | 24438d2 | 2016-09-13 17:03:53 | [diff] [blame] | 51 | if (endpoint_client_) |
yzshen | 8be41d3a | 2017-01-23 20:40:37 | [diff] [blame] | 52 | endpoint_client_->CloseWithReason(custom_reason, description); |
| 53 | |
yzshen | 24438d2 | 2016-09-13 17:03:53 | [diff] [blame] | 54 | Close(); |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 55 | } |
| 56 | |
Marijn Kruisselbrink | 3325c22c | 2017-06-07 20:54:26 | [diff] [blame] | 57 | ReportBadMessageCallback BindingStateBase::GetBadMessageCallback() { |
| 58 | return base::Bind( |
| 59 | [](const ReportBadMessageCallback& inner_callback, |
| 60 | base::WeakPtr<BindingStateBase> binding, const std::string& error) { |
| 61 | inner_callback.Run(error); |
| 62 | if (binding) |
| 63 | binding->Close(); |
| 64 | }, |
| 65 | mojo::GetBadMessageCallback(), weak_ptr_factory_.GetWeakPtr()); |
| 66 | } |
| 67 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 68 | void BindingStateBase::FlushForTesting() { |
yzshen | 2859a2ac | 2017-02-14 22:24:25 | [diff] [blame] | 69 | endpoint_client_->FlushForTesting(); |
sammc | 462458f | 2016-09-01 09:52:58 | [diff] [blame] | 70 | } |
| 71 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 72 | void BindingStateBase::EnableTestingMode() { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 73 | DCHECK(is_bound()); |
| 74 | router_->EnableTestingMode(); |
| 75 | } |
| 76 | |
Tim Becker | 6573d89 | 2017-08-04 17:24:35 | [diff] [blame] | 77 | scoped_refptr<internal::MultiplexRouter> BindingStateBase::RouterForTesting() { |
| 78 | return router_; |
| 79 | } |
| 80 | |
yzshen | a87f4ac | 2016-11-30 19:03:20 | [diff] [blame] | 81 | void BindingStateBase::BindInternal( |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 82 | ScopedMessagePipeHandle handle, |
Sam McNally | d482b4b | 2017-07-17 03:45:03 | [diff] [blame] | 83 | scoped_refptr<base::SingleThreadTaskRunner> runner, |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 84 | const char* interface_name, |
rockot | 222e7dd | 2016-08-24 23:37:11 | [diff] [blame] | 85 | std::unique_ptr<MessageReceiver> request_validator, |
yzshen | 97c656d | 2016-09-22 17:02:40 | [diff] [blame] | 86 | bool passes_associated_kinds, |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 87 | bool has_sync_methods, |
sammc | 462458f | 2016-09-01 09:52:58 | [diff] [blame] | 88 | MessageReceiverWithResponderStatus* stub, |
| 89 | uint32_t interface_version) { |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 90 | DCHECK(!router_); |
| 91 | |
Sam McNally | d482b4b | 2017-07-17 03:45:03 | [diff] [blame] | 92 | auto sequenced_runner = |
| 93 | GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)); |
yzshen | 97c656d | 2016-09-22 17:02:40 | [diff] [blame] | 94 | MultiplexRouter::Config config = |
| 95 | passes_associated_kinds |
| 96 | ? MultiplexRouter::MULTI_INTERFACE |
| 97 | : (has_sync_methods |
| 98 | ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS |
| 99 | : MultiplexRouter::SINGLE_INTERFACE); |
Sam McNally | d482b4b | 2017-07-17 03:45:03 | [diff] [blame] | 100 | router_ = |
| 101 | new MultiplexRouter(std::move(handle), config, false, sequenced_runner); |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 102 | router_->SetMasterInterfaceName(interface_name); |
| 103 | |
| 104 | endpoint_client_.reset(new InterfaceEndpointClient( |
| 105 | router_->CreateLocalEndpointHandle(kMasterInterfaceId), stub, |
Sam McNally | d482b4b | 2017-07-17 03:45:03 | [diff] [blame] | 106 | std::move(request_validator), has_sync_methods, |
| 107 | std::move(sequenced_runner), interface_version)); |
tibell | ad0c0b3 | 2016-08-04 01:13:30 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | } // namesapce internal |
| 111 | } // namespace mojo |