| // 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_ |