// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_SYSTEM_PLATFORM_CHANNEL_H_ #define MOJO_SYSTEM_PLATFORM_CHANNEL_H_ #include #include #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/process/launch.h" #include "mojo/system/platform_channel_handle.h" #include "mojo/system/system_impl_export.h" class CommandLine; namespace mojo { namespace system { class MOJO_SYSTEM_IMPL_EXPORT PlatformChannel { public: virtual ~PlatformChannel(); // Returns the channel's handle, passing ownership. PlatformChannelHandle PassHandle(); bool is_valid() const { return handle_.is_valid(); } protected: PlatformChannel(); PlatformChannelHandle* mutable_handle() { return &handle_; } private: PlatformChannelHandle handle_; 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 { public: virtual ~PlatformServerChannel() {} static scoped_ptr Create(const std::string& name); // For in-process use, from a server channel you can make a corresponding // client channel. virtual scoped_ptr CreateClientChannel() = 0; // 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( CommandLine* command_line, base::FileHandleMappingVector* file_handle_mapping) const = 0; // 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 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 CreateFromParentProcess( const CommandLine& command_line); private: PlatformClientChannel() {} DISALLOW_COPY_AND_ASSIGN(PlatformClientChannel); }; } // namespace system } // namespace mojo #endif // MOJO_SYSTEM_PLATFORM_CHANNEL_H_