| // 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_H_ |
| #define MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_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/public/cpp/platform/platform_channel_endpoint.h" |
| |
| namespace mojo { |
| |
| // PlatformChannel encapsulates construction and ownership of two entangled |
| // endpoints of a platform-specific communication primitive, e.g. a Windows |
| // pipe, a Unix domain socket, or a macOS Mach port pair. One endpoint is |
| // designated as the "local" endpoint and should be retained by the creating |
| // process; the other endpoint is designated as the "remote" endpoint and |
| // should be passed to an external process. |
| // |
| // PlatformChannels can be used to bootstrap Mojo IPC between one process and |
| // another. Typically the other process is a child of this process, and there |
| // are helper methods for passing the endpoint to a child as such; but this |
| // arrangement is not strictly necessary on all platforms. |
| // |
| // For a channel which allows clients to connect by name (i.e. a named pipe |
| // or socket server, supported only on Windows and POSIX systems) see |
| // NamedPlatformChannel. |
| class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) PlatformChannel { |
| public: |
| // A common helper constant that is used to pass handle values on the |
| // command line when the relevant methods are used on this class. |
| static const char kHandleSwitch[]; |
| |
| using HandlePassingInfo = PlatformChannelEndpoint::HandlePassingInfo; |
| |
| PlatformChannel(); |
| PlatformChannel(PlatformChannelEndpoint local, |
| PlatformChannelEndpoint remote); |
| PlatformChannel(PlatformChannel&& other); |
| PlatformChannel& operator=(PlatformChannel&& other); |
| ~PlatformChannel(); |
| |
| const PlatformChannelEndpoint& local_endpoint() const { |
| return local_endpoint_; |
| } |
| const PlatformChannelEndpoint& remote_endpoint() const { |
| return remote_endpoint_; |
| } |
| |
| [[nodiscard]] PlatformChannelEndpoint TakeLocalEndpoint() { |
| return std::move(local_endpoint_); |
| } |
| |
| [[nodiscard]] PlatformChannelEndpoint TakeRemoteEndpoint() { |
| return std::move(remote_endpoint_); |
| } |
| |
| // Prepares to pass the remote endpoint handle to a process that will soon be |
| // launched. Returns a string that can be used in the remote process with |
| // |RecoverPassedEndpointFromString()| (see below). The string can e.g. be |
| // passed on the new process's command line. |
| // |
| // **NOTE**: If this method is called it is important to also call |
| // |RemoteProcessLaunchAttempted()| on this PlatformChannel *after* attempting |
| // to launch the new process, regardless of whether the attempt succeeded. |
| // Failing to do so can result in leaked handles. |
| void PrepareToPassRemoteEndpoint(HandlePassingInfo* info, std::string* value); |
| |
| // Like above but adds handle information to the appropriate field in |
| // `options` and returns the string encoding. |
| std::string PrepareToPassRemoteEndpoint(base::LaunchOptions& options); |
| |
| // Like above but modifies |*command_line| to include the endpoint string |
| // via the |kHandleSwitch| flag. |
| void PrepareToPassRemoteEndpoint(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 PrepareToPassRemoteEndpoint(base::LaunchOptions* options, |
| base::CommandLine* command_line); |
| |
| // Must be called after the corresponding process launch attempt if |
| // |PrepareToPassRemoteEndpoint()| was used. |
| void RemoteProcessLaunchAttempted(); |
| |
| // Recovers an endpoint handle which was passed to the calling process by |
| // its creator. |value| is a string returned by |
| // |PrepareToPassRemoteEndpoint()| in the creator's process. |
| [[nodiscard]] static PlatformChannelEndpoint RecoverPassedEndpointFromString( |
| std::string_view value); |
| |
| // Like above but extracts the input string from |command_line| via the |
| // |kHandleSwitch| flag. |
| [[nodiscard]] static PlatformChannelEndpoint |
| RecoverPassedEndpointFromCommandLine(const base::CommandLine& command_line); |
| |
| // Indicates whether |RecoverPassedEndpointFromCommandLine()| would succeed. |
| static bool CommandLineHasPassedEndpoint( |
| const base::CommandLine& command_line); |
| |
| private: |
| PlatformChannelEndpoint local_endpoint_; |
| PlatformChannelEndpoint remote_endpoint_; |
| }; |
| |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_H_ |