blob: 5867c08baa3a3635d920de3ef156eb21df27007f [file] [log] [blame]
[email protected]64860882014-08-04 23:44:171// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef IPC_IPC_CHANNEL_MOJO_H_
6#define IPC_IPC_CHANNEL_MOJO_H_
7
8#include <vector>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/memory/scoped_vector.h"
12#include "base/memory/weak_ptr.h"
13#include "ipc/ipc_channel.h"
14#include "ipc/ipc_channel_factory.h"
15#include "ipc/ipc_export.h"
16#include "ipc/mojo/ipc_message_pipe_reader.h"
morrita54f6f80c2014-09-23 21:16:0017#include "ipc/mojo/ipc_mojo_bootstrap.h"
[email protected]64860882014-08-04 23:44:1718#include "mojo/public/cpp/system/core.h"
19
20namespace mojo {
21namespace embedder {
22struct ChannelInfo;
23}
24}
25
26namespace IPC {
27
morrita3b41d6c2014-09-11 19:06:2928namespace internal {
29class ControlReader;
30class ServerControlReader;
31class ClientControlReader;
32class MessageReader;
33}
34
[email protected]64860882014-08-04 23:44:1735// Mojo-based IPC::Channel implementation over a platform handle.
36//
37// ChannelMojo builds Mojo MessagePipe using underlying pipe given by
38// "bootstrap" IPC::Channel which creates and owns platform pipe like
39// named socket. The bootstrap Channel is used only for establishing
40// the underlying connection. ChannelMojo takes its handle over once
41// the it is made and puts MessagePipe on it.
42//
43// ChannelMojo has a couple of MessagePipes:
44//
45// * The first MessagePipe, which is built on top of bootstrap handle,
46// is the "control" pipe. It is used to communicate out-of-band
47// control messages that aren't visible from IPC::Listener.
48//
49// * The second MessagePipe, which is created by the server channel
50// and sent to client Channel over the control pipe, is used
51// to send IPC::Messages as an IPC::Sender.
52//
53// TODO(morrita): Extract handle creation part of IPC::Channel into
54// separate class to clarify what ChannelMojo relies
55// on.
56// TODO(morrita): Add APIs to create extra MessagePipes to let
57// Mojo-based objects talk over this Channel.
58//
morrita54f6f80c2014-09-23 21:16:0059class IPC_MOJO_EXPORT ChannelMojo : public Channel,
60 public MojoBootstrap::Delegate {
[email protected]64860882014-08-04 23:44:1761 public:
morritae9453ea2014-09-26 03:20:4862 class Delegate {
63 public:
64 virtual ~Delegate() {}
65 virtual base::WeakPtr<Delegate> ToWeakPtr() = 0;
66 virtual scoped_refptr<base::TaskRunner> GetIOTaskRunner() = 0;
67 virtual void OnChannelCreated(base::WeakPtr<ChannelMojo> channel) = 0;
68 };
69
[email protected]64860882014-08-04 23:44:1770 // Create ChannelMojo. A bootstrap channel is created as well.
morritae9453ea2014-09-26 03:20:4871 // |host| must not be null for server channels.
72 static scoped_ptr<ChannelMojo> Create(Delegate* delegate,
morrita54f6f80c2014-09-23 21:16:0073 const ChannelHandle& channel_handle,
74 Mode mode,
75 Listener* listener);
[email protected]64860882014-08-04 23:44:1776
77 // Create a factory object for ChannelMojo.
78 // The factory is used to create Mojo-based ChannelProxy family.
morrita54f6f80c2014-09-23 21:16:0079 // |host| must not be null.
80 static scoped_ptr<ChannelFactory> CreateServerFactory(
morritae9453ea2014-09-26 03:20:4881 Delegate* delegate,
morrita54f6f80c2014-09-23 21:16:0082 const ChannelHandle& channel_handle);
83
84 static scoped_ptr<ChannelFactory> CreateClientFactory(
85 const ChannelHandle& channel_handle);
[email protected]64860882014-08-04 23:44:1786
87 virtual ~ChannelMojo();
88
morrita54f6f80c2014-09-23 21:16:0089 // ChannelMojoHost tells the client handle using this API.
90 void OnClientLaunched(base::ProcessHandle handle);
91
[email protected]64860882014-08-04 23:44:1792 // Channel implementation
93 virtual bool Connect() OVERRIDE;
94 virtual void Close() OVERRIDE;
95 virtual bool Send(Message* message) OVERRIDE;
96 virtual base::ProcessId GetPeerPID() const OVERRIDE;
97 virtual base::ProcessId GetSelfPID() const OVERRIDE;
[email protected]64860882014-08-04 23:44:1798
99#if defined(OS_POSIX) && !defined(OS_NACL)
100 virtual int GetClientFileDescriptor() const OVERRIDE;
101 virtual int TakeClientFileDescriptor() OVERRIDE;
morrita3b41d6c2014-09-11 19:06:29102
103 // These access protected API of IPC::Message, which has ChannelMojo
104 // as a friend class.
105 static MojoResult WriteToFileDescriptorSet(
106 const std::vector<MojoHandle>& handle_buffer,
107 Message* message);
morrita96693852014-09-24 20:11:45108 static MojoResult ReadFromFileDescriptorSet(Message* message,
morrita3b41d6c2014-09-11 19:06:29109 std::vector<MojoHandle>* handles);
110
[email protected]64860882014-08-04 23:44:17111#endif // defined(OS_POSIX) && !defined(OS_NACL)
112
morrita54f6f80c2014-09-23 21:16:00113 // MojoBootstrapDelegate implementation
114 virtual void OnPipeAvailable(
115 mojo::embedder::ScopedPlatformHandle handle) OVERRIDE;
116 virtual void OnBootstrapError() OVERRIDE;
117
[email protected]64860882014-08-04 23:44:17118 // Called from MessagePipeReader implementations
119 void OnMessageReceived(Message& message);
120 void OnConnected(mojo::ScopedMessagePipeHandle pipe);
121 void OnPipeClosed(internal::MessagePipeReader* reader);
122 void OnPipeError(internal::MessagePipeReader* reader);
123 void set_peer_pid(base::ProcessId pid) { peer_pid_ = pid; }
124
morrita3b41d6c2014-09-11 19:06:29125 protected:
morritae9453ea2014-09-26 03:20:48126 ChannelMojo(Delegate* delegate,
morrita54f6f80c2014-09-23 21:16:00127 const ChannelHandle& channel_handle,
morrita3b41d6c2014-09-11 19:06:29128 Mode mode,
morrita54f6f80c2014-09-23 21:16:00129 Listener* listener);
morrita3b41d6c2014-09-11 19:06:29130
[email protected]64860882014-08-04 23:44:17131 private:
132 struct ChannelInfoDeleter {
133 void operator()(mojo::embedder::ChannelInfo* ptr) const;
134 };
135
136 // ChannelMojo needs to kill its MessagePipeReader in delayed manner
137 // because the channel wants to kill these readers during the
138 // notifications invoked by them.
139 typedef internal::MessagePipeReader::DelayedDeleter ReaderDeleter;
140
morritae9453ea2014-09-26 03:20:48141 void InitDelegate(ChannelMojo::Delegate* delegate);
morrita54f6f80c2014-09-23 21:16:00142 void InitControlReader(mojo::embedder::ScopedPlatformHandle handle);
[email protected]64860882014-08-04 23:44:17143
morrita54f6f80c2014-09-23 21:16:00144 scoped_ptr<MojoBootstrap> bootstrap_;
morritae9453ea2014-09-26 03:20:48145 base::WeakPtr<Delegate> delegate_;
[email protected]64860882014-08-04 23:44:17146 Mode mode_;
147 Listener* listener_;
148 base::ProcessId peer_pid_;
149 scoped_ptr<mojo::embedder::ChannelInfo,
150 ChannelInfoDeleter> channel_info_;
151
morrita3b41d6c2014-09-11 19:06:29152 scoped_ptr<internal::ControlReader, ReaderDeleter> control_reader_;
153 scoped_ptr<internal::MessageReader, ReaderDeleter> message_reader_;
[email protected]64860882014-08-04 23:44:17154 ScopedVector<Message> pending_messages_;
155
anujk.sharma0184ced2014-08-28 06:49:02156 base::WeakPtrFactory<ChannelMojo> weak_factory_;
157
[email protected]64860882014-08-04 23:44:17158 DISALLOW_COPY_AND_ASSIGN(ChannelMojo);
159};
160
161} // namespace IPC
162
163#endif // IPC_IPC_CHANNEL_MOJO_H_