blob: 0b0dbee0026d07be01c722702eb8da9eacf1ea44 [file] [log] [blame]
// 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_