[go: nahoru, domu]

blob: 985dd72f74ff256942d9753b40038bb00ecbe747 [file] [log] [blame]
// 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_GENERIC_PENDING_RECEIVER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_RECEIVER_H_
#include <string>
#include "base/component_export.h"
#include "base/strings/string_piece.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
namespace mojo {
// GenericPendingReceiver encapsulates a pairing of a receiving pipe 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.GenericPendingReceiver|, and it serves as a semi-safe
// wrapper for transporting arbitrary interface receivers in a generic object.
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) GenericPendingReceiver {
public:
GenericPendingReceiver();
GenericPendingReceiver(base::StringPiece interface_name,
mojo::ScopedMessagePipeHandle receiving_pipe);
template <typename Interface>
GenericPendingReceiver(mojo::PendingReceiver<Interface> receiver)
: GenericPendingReceiver(Interface::Name_, receiver.PassPipe()) {}
GenericPendingReceiver(GenericPendingReceiver&&);
GenericPendingReceiver(const GenericPendingReceiver&) = delete;
GenericPendingReceiver& operator=(const GenericPendingReceiver&) = delete;
~GenericPendingReceiver();
GenericPendingReceiver& operator=(GenericPendingReceiver&&);
bool is_valid() const { return pipe_.is_valid(); }
explicit operator bool() const { return is_valid(); }
void reset();
const absl::optional<std::string>& interface_name() const {
return interface_name_;
}
mojo::MessagePipeHandle pipe() const { return pipe_.get(); }
// Takes ownership of the receiving pipe, invalidating this
// GenericPendingReceiver.
mojo::ScopedMessagePipeHandle PassPipe();
// Takes ownership of the pipe, strongly typed as an |Interface| receiver, if
// and only if that interface's name matches the stored interface name.
template <typename Interface>
mojo::PendingReceiver<Interface> As() {
return mojo::PendingReceiver<Interface>(PassPipeIfNameIs(Interface::Name_));
}
void WriteIntoTrace(perfetto::TracedValue ctx) const;
private:
mojo::ScopedMessagePipeHandle PassPipeIfNameIs(const char* interface_name);
absl::optional<std::string> interface_name_;
mojo::ScopedMessagePipeHandle pipe_;
};
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_RECEIVER_H_