diff options
Diffstat (limited to 'mojo/public/cpp/bindings/lib/binding_state.h')
-rw-r--r-- | mojo/public/cpp/bindings/lib/binding_state.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/mojo/public/cpp/bindings/lib/binding_state.h b/mojo/public/cpp/bindings/lib/binding_state.h new file mode 100644 index 0000000000..0b0dbee002 --- /dev/null +++ b/mojo/public/cpp/bindings/lib/binding_state.h @@ -0,0 +1,128 @@ +// Copyright 2015 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. + +#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_ + +#include <memory> +#include <string> +#include <utility> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/logging.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/memory/ref_counted.h" +#include "base/single_thread_task_runner.h" +#include "mojo/public/cpp/bindings/bindings_export.h" +#include "mojo/public/cpp/bindings/connection_error_callback.h" +#include "mojo/public/cpp/bindings/filter_chain.h" +#include "mojo/public/cpp/bindings/interface_endpoint_client.h" +#include "mojo/public/cpp/bindings/interface_id.h" +#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/public/cpp/bindings/interface_ptr_info.h" +#include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/lib/multiplex_router.h" +#include "mojo/public/cpp/bindings/message_header_validator.h" +#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" +#include "mojo/public/cpp/system/core.h" + +namespace mojo { +namespace internal { + +class MOJO_CPP_BINDINGS_EXPORT BindingStateBase { + public: + BindingStateBase(); + ~BindingStateBase(); + + void AddFilter(std::unique_ptr<MessageReceiver> filter); + + bool HasAssociatedInterfaces() const; + + void PauseIncomingMethodCallProcessing(); + void ResumeIncomingMethodCallProcessing(); + + bool WaitForIncomingMethodCall( + MojoDeadline deadline = MOJO_DEADLINE_INDEFINITE); + + void Close(); + void CloseWithReason(uint32_t custom_reason, const std::string& description); + + void set_connection_error_handler(const base::Closure& error_handler) { + DCHECK(is_bound()); + endpoint_client_->set_connection_error_handler(error_handler); + } + + void set_connection_error_with_reason_handler( + const ConnectionErrorWithReasonCallback& error_handler) { + DCHECK(is_bound()); + endpoint_client_->set_connection_error_with_reason_handler(error_handler); + } + + bool is_bound() const { return !!router_; } + + MessagePipeHandle handle() const { + DCHECK(is_bound()); + return router_->handle(); + } + + void FlushForTesting(); + + void EnableTestingMode(); + + protected: + void 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); + + scoped_refptr<internal::MultiplexRouter> router_; + std::unique_ptr<InterfaceEndpointClient> endpoint_client_; +}; + +template <typename Interface, typename ImplRefTraits> +class BindingState : public BindingStateBase { + public: + using ImplPointerType = typename ImplRefTraits::PointerType; + + explicit BindingState(ImplPointerType impl) { + stub_.set_sink(std::move(impl)); + } + + ~BindingState() { Close(); } + + void Bind(ScopedMessagePipeHandle handle, + scoped_refptr<base::SingleThreadTaskRunner> runner) { + BindingStateBase::BindInternal( + std::move(handle), runner, Interface::Name_, + base::MakeUnique<typename Interface::RequestValidator_>(), + Interface::PassesAssociatedKinds_, Interface::HasSyncMethods_, &stub_, + Interface::Version_); + } + + InterfaceRequest<Interface> Unbind() { + endpoint_client_.reset(); + InterfaceRequest<Interface> request = + MakeRequest<Interface>(router_->PassMessagePipe()); + router_ = nullptr; + return request; + } + + Interface* impl() { return ImplRefTraits::GetRawPointer(&stub_.sink()); } + + private: + typename Interface::template Stub_<ImplRefTraits> stub_; + + DISALLOW_COPY_AND_ASSIGN(BindingState); +}; + +} // namesapce internal +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_ |