blob: 86e675fc698716505dffad15e31fc9310d2a4af3 [file] [log] [blame]
// Copyright 2018 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_PLATFORM_PLATFORM_CHANNEL_ENDPOINT_H_
#define MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_ENDPOINT_H_
#include <string_view>
#include "base/command_line.h"
#include "base/component_export.h"
#include "base/process/launch.h"
#include "build/build_config.h"
#include "mojo/buildflags.h"
#include "mojo/public/cpp/platform/platform_handle.h"
namespace mojo {
// A PlatformHandle with a little extra type information to convey that it's
// a channel endpoint, i.e. a handle that can be used to send or receive
// invitations as |MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL| to a remote
// PlatformChannelEndpoint.
class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) PlatformChannelEndpoint {
public:
// Unfortunately base process support code has no unified handle-passing
// data pipe, so we have this.
#if BUILDFLAG(IS_WIN)
using HandlePassingInfo = base::HandlesToInheritVector;
#elif BUILDFLAG(IS_FUCHSIA)
using HandlePassingInfo = base::HandlesToTransferVector;
#elif BUILDFLAG(MOJO_USE_APPLE_CHANNEL)
using HandlePassingInfo = base::MachPortsForRendezvous;
#elif BUILDFLAG(IS_POSIX)
using HandlePassingInfo = base::FileHandleMappingVector;
#else
#error "Unsupported platform."
#endif
PlatformChannelEndpoint();
PlatformChannelEndpoint(PlatformChannelEndpoint&& other);
explicit PlatformChannelEndpoint(PlatformHandle handle);
PlatformChannelEndpoint(const PlatformChannelEndpoint&) = delete;
PlatformChannelEndpoint& operator=(const PlatformChannelEndpoint&) = delete;
~PlatformChannelEndpoint();
PlatformChannelEndpoint& operator=(PlatformChannelEndpoint&& other);
bool is_valid() const { return handle_.is_valid(); }
void reset();
PlatformChannelEndpoint Clone() const;
const PlatformHandle& platform_handle() const { return handle_; }
[[nodiscard]] PlatformHandle TakePlatformHandle() {
return std::move(handle_);
}
// Prepares to pass this endpoint handle to a process that will soon be
// launched. Returns a string that can be used in the remote process with
// RecoverFromString() (see below). The string can be passed on the new
// process's command line.
//
// NOTE: If this method is called it is important to also call
// ProcessLaunchAttempted() on this endpoint *after* attempting to launch
// the new process, regardless of whether the attempt succeeded. Failing to do
// so can result in leaked handles on some platforms.
void PrepareToPass(HandlePassingInfo& info, std::string& value);
// Like above but modifies `command_line` to include the endpoint string
// via the PlatformChannel::kHandleSwitch flag.
void PrepareToPass(HandlePassingInfo& info, base::CommandLine& command_line);
// Like above but adds handle-passing information directly to
// `launch_options`, eliminating the potential need for callers to write
// platform-specific code to do the same.
void PrepareToPass(base::LaunchOptions& options,
base::CommandLine& command_line);
// Like above but returns an appropriate switch value as a string.
std::string PrepareToPass(base::LaunchOptions& options);
// Must be called after the corresponding process launch attempt if
// PrepareToPass() was called.
void ProcessLaunchAttempted();
[[nodiscard]] static PlatformChannelEndpoint RecoverFromString(
std::string_view value);
private:
PlatformHandle handle_;
};
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_ENDPOINT_H_