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