// Copyright 2018 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 COMPONENTS_ARC_MOJO_CHANNEL_H_ #define COMPONENTS_ARC_MOJO_CHANNEL_H_ #include #include "base/bind.h" #include "base/macros.h" #include "components/arc/connection_holder.h" namespace arc { // Thin interface to wrap InterfacePtr with type erasure. class MojoChannelBase { public: virtual ~MojoChannelBase() = default; protected: MojoChannelBase() = default; private: DISALLOW_COPY_AND_ASSIGN(MojoChannelBase); }; // Thin wrapper for InterfacePtr, where T is one of ARC mojo Instance class. template class MojoChannel : public MojoChannelBase { public: MojoChannel(ConnectionHolder* holder, mojo::InterfacePtr ptr) : holder_(holder), ptr_(std::move(ptr)) { // Delay registration to the ConnectionHolder until the version is ready. } ~MojoChannel() override { holder_->CloseInstance(ptr_.get()); } void set_connection_error_handler(base::OnceClosure error_handler) { ptr_.set_connection_error_handler(std::move(error_handler)); } void QueryVersion() { // Note: the callback will not be called if |ptr_| is destroyed. ptr_.QueryVersion( base::Bind(&MojoChannel::OnVersionReady, base::Unretained(this))); } private: void OnVersionReady(uint32_t unused_version) { holder_->SetInstance(ptr_.get(), ptr_.version()); } // Externally owned ConnectionHolder instance. ConnectionHolder* const holder_; // Put as a last member to ensure that any callback tied to the |ptr_| // is not invoked. mojo::InterfacePtr ptr_; DISALLOW_COPY_AND_ASSIGN(MojoChannel); }; } // namespace arc #endif // COMPONENTS_ARC_MOJO_CHANNEL_H_