// Copyright 2019 The Chromium Authors // 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_PENDING_REMOTE_H_ #define MOJO_PUBLIC_CPP_BINDINGS_PENDING_REMOTE_H_ #include <cstdint> #include <type_traits> #include <utility> #include "base/check.h" #include "base/compiler_specific.h" #include "build/build_config.h" #include "mojo/public/c/system/types.h" #include "mojo/public/cpp/bindings/disconnect_reason.h" #include "mojo/public/cpp/bindings/interface_id.h" #include "mojo/public/cpp/bindings/lib/pending_remote_state.h" #include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/pipe_control_message_proxy.h" #include "mojo/public/cpp/bindings/runtime_features.h" #include "mojo/public/cpp/system/message_pipe.h" namespace mojo { template <typename T> class PendingReceiver; template <typename T> struct PendingRemoteConverter; // A valid PendingRemote is entangled with exactly one Receiver or // PendingReceiver, and can be consumed to bind a Remote in order to begin // issuing method calls to that receiver. See Remote documentation for more // details. // // PendingRemote instances may be freely moved to another thread/sequence, or // even transferred to another process via a Mojo interface call (see // pending_remote<T> syntax in mojom IDL). // // NOTE: This object is essentially semantic sugar wrapping a raw message pipe // handle that is expected to send Interface messages of a specified version // (typically 0) to a Receiver. As such, consumers who know what they're doing // (i.e. who are confident about what lies on the other side of a pipe) may // freely convert between a PendingRemote and a 2-tuple of // [raw message pipe handle, expected interface version number]. template <typename Interface> class PendingRemote { … }; class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) NullRemote { … }; // Fuses a PendingReceiver<T> endpoint with a PendingRemote<T> endpoint. The // endpoints must belong to two different message pipes, and this effectively // fuses two pipes into a single pipe. Returns |true| on success or |false| on // failure. template <typename Interface> bool FusePipes(PendingReceiver<Interface> receiver, PendingRemote<Interface> remote) { … } } // namespace mojo #include "mojo/public/cpp/bindings/pending_receiver.h" namespace mojo { template <typename Interface> PendingReceiver<Interface> PendingRemote<Interface>::InitWithNewPipeAndPassReceiver() { … } } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_PENDING_REMOTE_H_