Index: mojo/system/platform_channel.h |
diff --git a/mojo/system/platform_channel.h b/mojo/system/platform_channel.h |
index 172f1bb9ad70e6d0c258ae54b90eba65e4aabb86..47e1e6ac99e38973ebc067d7fe6a3bbdcc68109a 100644 |
--- a/mojo/system/platform_channel.h |
+++ b/mojo/system/platform_channel.h |
@@ -5,9 +5,6 @@ |
#ifndef MOJO_SYSTEM_PLATFORM_CHANNEL_H_ |
#define MOJO_SYSTEM_PLATFORM_CHANNEL_H_ |
-#include <string> |
-#include <utility> |
- |
#include "base/basictypes.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/process/launch.h" |
@@ -23,6 +20,11 @@ class MOJO_SYSTEM_IMPL_EXPORT PlatformChannel { |
public: |
virtual ~PlatformChannel(); |
+ // Creates a channel if you already have the underlying handle for it, taking |
+ // ownership of |handle|. |
+ static scoped_ptr<PlatformChannel> CreateFromHandle( |
+ const PlatformChannelHandle& handle); |
+ |
// Returns the channel's handle, passing ownership. |
PlatformChannelHandle PassHandle(); |
@@ -39,71 +41,57 @@ class MOJO_SYSTEM_IMPL_EXPORT PlatformChannel { |
DISALLOW_COPY_AND_ASSIGN(PlatformChannel); |
}; |
-class PlatformClientChannel; |
- |
-// A server channel has an "implicit" client channel created with it. This may |
-// be a real channel (in the case of POSIX, in which case there's an actual FD |
-// for it) or fake. |
-// - That client channel may then be used in-process (e.g., for single process |
-// tests) by getting a |PlatformClientChannel| using |CreateClientChannel()|. |
-// - Or it may be "passed" to a new child process using |
-// |GetDataNeededToPassClientChannelToChildProcess()|, etc. (see below). The |
-// child process would then get a |PlatformClientChannel| by using |
-// |PlatformClientChannel::CreateFromParentProcess()|. |
-// - In both these cases, "ownership" of the client channel is transferred (to |
-// the |PlatformClientChannel| or the child process). |
-// TODO(vtl): Add ways of passing it to other existing processes. |
-class MOJO_SYSTEM_IMPL_EXPORT PlatformServerChannel : public PlatformChannel { |
+// This is used to create a pair of connected |PlatformChannel|s. The resulting |
+// channels can then be used in the same process (e.g., in tests) or between |
+// processes. (The "server" channel is the one that will be used in the process |
+// that created the pair, whereas the "client" channel is the one that will be |
+// used in a different process.) |
+// |
+// This class provides facilities for passing the client channel to a child |
+// process. The parent should call |PrepareToPassClientChannelToChildProcess()| |
+// to get the data needed to do this, spawn the child using that data, and then |
+// call |ChildProcessLaunched()|. Note that on Windows this facility (will) only |
+// work on Vista and later (TODO(vtl)). |
+// |
+// Note: |PlatformChannelPair()|, |CreateClientChannelFromParentProcess()|, |
+// |PrepareToPassClientChannelToChildProcess()|, and |ChildProcessLaunched()| |
+// have platform-specific implementations. |
+class MOJO_SYSTEM_IMPL_EXPORT PlatformChannelPair { |
public: |
- virtual ~PlatformServerChannel() {} |
- |
- static scoped_ptr<PlatformServerChannel> Create(const std::string& name); |
- |
- // For in-process use, from a server channel you can make a corresponding |
- // client channel. |
- virtual scoped_ptr<PlatformClientChannel> CreateClientChannel() = 0; |
+ PlatformChannelPair(); |
+ ~PlatformChannelPair(); |
+ |
+ // This transfers ownership of the server channel to the caller. Returns null |
+ // on failure. |
+ scoped_ptr<PlatformChannel> CreateServerChannel(); |
+ |
+ // For in-process use (e.g., in tests). This transfers ownership of the client |
+ // channel to the caller. Returns null on failure. |
+ scoped_ptr<PlatformChannel> CreateClientChannel(); |
+ |
+ // To be called in the child process, after the parent process called |
+ // |PrepareToPassClientChannelToChildProcess()| and launched the child (using |
+ // the provided data), to create a client channel connected to the server |
+ // channel (in the parent process). Returns null on failure. |
+ static scoped_ptr<PlatformChannel> CreateClientChannelFromParentProcess( |
+ const CommandLine& command_line); |
// Prepares to pass the client channel to a new child process, to be launched |
// using |LaunchProcess()| (from base/launch.h). Modifies |*command_line| and |
// |*file_handle_mapping| as needed. (|file_handle_mapping| may be null on |
// platforms that don't need it, like Windows.) |
- virtual void GetDataNeededToPassClientChannelToChildProcess( |
+ void PrepareToPassClientChannelToChildProcess( |
CommandLine* command_line, |
- base::FileHandleMappingVector* file_handle_mapping) const = 0; |
+ base::FileHandleMappingVector* file_handle_mapping) const; |
// To be called once the child process has been successfully launched, to do |
// any cleanup necessary. |
- virtual void ChildProcessLaunched() = 0; |
- |
- const std::string& name() const { return name_; } |
- |
- protected: |
- explicit PlatformServerChannel(const std::string& name); |
- |
- private: |
- const std::string name_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PlatformServerChannel); |
-}; |
- |
-class MOJO_SYSTEM_IMPL_EXPORT PlatformClientChannel : public PlatformChannel { |
- public: |
- virtual ~PlatformClientChannel() {} |
- |
- // Creates a client channel if you already have the underlying handle for it. |
- // Note: This takes ownership of |handle|. |
- static scoped_ptr<PlatformClientChannel> CreateFromHandle( |
- const PlatformChannelHandle& handle); |
- |
- // To be called to get a client channel passed from the parent process, using |
- // |PlatformServerChannel::GetDataNeededToPassClientChannelToChildProcess()|, |
- // etc. Returns null on failure. |
- static scoped_ptr<PlatformClientChannel> CreateFromParentProcess( |
- const CommandLine& command_line); |
+ void ChildProcessLaunched(); |
private: |
- PlatformClientChannel() {} |
+ PlatformChannelHandle server_handle_; |
+ PlatformChannelHandle client_handle_; |
- DISALLOW_COPY_AND_ASSIGN(PlatformClientChannel); |
+ DISALLOW_COPY_AND_ASSIGN(PlatformChannelPair); |
}; |
} // namespace system |