1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// Copyright 2021 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_GENERIC_PENDING_ASSOCIATED_RECEIVER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_ASSOCIATED_RECEIVER_H_
#include <optional>
#include <string>
#include <string_view>
#include "base/component_export.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/runtime_features.h"
#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
namespace mojo {
// GenericPendingAssociatedReceiver encapsulates a pairing of a receiving
// associated interface endpoint with the name of the mojom interface assumed by
// the corresponding remote endpoint.
//
// This is used by mojom C++ bindings to represent
// |mojo_base.mojom.GenericAssociatedPendingReceiver|, and it serves as a
// semi-safe wrapper for transporting arbitrary associated interface receivers
// in a generic object.
//
// It is intended to be used in the (relatively rare) scenario where an
// interface needs to support sharing its message ordering with interfaces
// defined at higher application layers, such that knowledge of those associated
// interface(s) would constitute a layering violation.
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) GenericPendingAssociatedReceiver {
public:
GenericPendingAssociatedReceiver();
GenericPendingAssociatedReceiver(std::string_view interface_name,
mojo::ScopedInterfaceEndpointHandle handle);
template <typename Interface>
GenericPendingAssociatedReceiver(
mojo::PendingAssociatedReceiver<Interface> receiver)
: GenericPendingAssociatedReceiver(Interface::Name_,
receiver.PassHandle()) {}
GenericPendingAssociatedReceiver(const GenericPendingAssociatedReceiver&) =
delete;
GenericPendingAssociatedReceiver(GenericPendingAssociatedReceiver&&);
GenericPendingAssociatedReceiver& operator=(
const GenericPendingAssociatedReceiver&) = delete;
GenericPendingAssociatedReceiver& operator=(
GenericPendingAssociatedReceiver&&);
~GenericPendingAssociatedReceiver();
bool is_valid() const { return handle_.is_valid(); }
explicit operator bool() const { return is_valid(); }
void reset();
const std::optional<std::string>& interface_name() const {
return interface_name_;
}
// Takes ownership of the endpoint, invalidating this object.
mojo::ScopedInterfaceEndpointHandle PassHandle();
// Takes ownership of the endpoint, strongly typed as an `Interface` receiver,
// if and only if that interface's name matches the stored interface name.
template <typename Interface>
mojo::PendingAssociatedReceiver<Interface> As() {
if (!internal::GetRuntimeFeature_ExpectEnabled<Interface>()) {
return mojo::PendingAssociatedReceiver<Interface>();
}
return mojo::PendingAssociatedReceiver<Interface>(
PassHandleIfNameIs(Interface::Name_));
}
private:
mojo::ScopedInterfaceEndpointHandle PassHandleIfNameIs(
const char* interface_name);
std::optional<std::string> interface_name_;
mojo::ScopedInterfaceEndpointHandle handle_;
};
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_ASSOCIATED_RECEIVER_H_
|