| // 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 <memory> |
| |
| #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<AssociatedGroupController> { |
| 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<DisconnectReason>& 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<base::SequencedTaskRunner> 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<AssociatedGroupController>; |
| |
| // 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_ |