// 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. #ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_ #define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_ #include #include "base/component_export.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/optional.h" #include "base/sequenced_task_runner.h" #include "mojo/public/cpp/bindings/disconnect_reason.h" #include "mojo/public/cpp/bindings/interface_id.h" #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" namespace mojo { class InterfaceEndpointClient; class InterfaceEndpointController; // An internal interface used to manage endpoints within an associated group, // which corresponds to one end of a message pipe. class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) AssociatedGroupController : public base::RefCountedThreadSafe { public: // Associates an interface with this AssociatedGroupController's message pipe. // It takes ownership of |handle_to_send| and returns an interface ID that // could be sent by any endpoints within the same associated group. // If |handle_to_send| is not in pending association state, it returns // kInvalidInterfaceId. Otherwise, the peer handle of |handle_to_send| joins // the associated group and is no longer pending. virtual InterfaceId AssociateInterface( ScopedInterfaceEndpointHandle handle_to_send) = 0; // Creates an interface endpoint handle from a given interface ID. The handle // joins this associated group. // Typically, this method is used to (1) create an endpoint handle for the // master interface; or (2) create an endpoint handle on receiving an // interface ID from the message pipe. // // On failure, the method returns an invalid handle. Usually that is because // the ID has already been used to create a handle. virtual ScopedInterfaceEndpointHandle CreateLocalEndpointHandle( InterfaceId id) = 0; // Closes an interface endpoint handle. virtual void CloseEndpointHandle( InterfaceId id, const base::Optional& reason) = 0; // Attaches a client to the specified endpoint to send and receive messages. // The returned object is still owned by the controller. It must only be used // on the same sequence as this call, and only before the client is detached // using DetachEndpointClient(). virtual InterfaceEndpointController* AttachEndpointClient( const ScopedInterfaceEndpointHandle& handle, InterfaceEndpointClient* endpoint_client, scoped_refptr runner) = 0; // Detaches the client attached to the specified endpoint. It must be called // on the same sequence as the corresponding AttachEndpointClient() call. virtual void DetachEndpointClient( const ScopedInterfaceEndpointHandle& handle) = 0; // Raises an error on the underlying message pipe. It disconnects the pipe // and notifies all interfaces running on this pipe. virtual void RaiseError() = 0; // Indicates whether or this endpoint prefers to accept outgoing messages in // serializaed form only. virtual bool PrefersSerializedMessages() = 0; protected: friend class base::RefCountedThreadSafe; // Creates a new ScopedInterfaceEndpointHandle within this associated group. ScopedInterfaceEndpointHandle CreateScopedInterfaceEndpointHandle( InterfaceId id); // Notifies that the interface represented by |handle_to_send| and its peer // has been associated with this AssociatedGroupController's message pipe, and // |handle_to_send|'s peer has joined this associated group. (Note: it is the // peer who has joined the associated group; |handle_to_send| will be sent to // the remote side.) // Returns false if |handle_to_send|'s peer has closed. bool NotifyAssociation(ScopedInterfaceEndpointHandle* handle_to_send, InterfaceId id); virtual ~AssociatedGroupController(); }; } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_