OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ipc/mojo/ipc_channel_mojo.h" | 5 #include "ipc/mojo/ipc_channel_mojo.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "ipc/ipc_listener.h" | 10 #include "ipc/ipc_listener.h" |
11 #include "ipc/mojo/client_channel.mojom.h" | |
11 #include "ipc/mojo/ipc_channel_mojo_readers.h" | 12 #include "ipc/mojo/ipc_channel_mojo_readers.h" |
12 #include "ipc/mojo/ipc_mojo_bootstrap.h" | 13 #include "ipc/mojo/ipc_mojo_bootstrap.h" |
13 #include "mojo/edk/embedder/embedder.h" | 14 #include "mojo/edk/embedder/embedder.h" |
15 #include "mojo/public/cpp/bindings/error_handler.h" | |
14 | 16 |
15 #if defined(OS_POSIX) && !defined(OS_NACL) | 17 #if defined(OS_POSIX) && !defined(OS_NACL) |
16 #include "ipc/file_descriptor_set_posix.h" | 18 #include "ipc/file_descriptor_set_posix.h" |
17 #endif | 19 #endif |
18 | 20 |
19 namespace IPC { | 21 namespace IPC { |
20 | 22 |
21 namespace { | 23 namespace { |
22 | 24 |
23 class MojoChannelFactory : public ChannelFactory { | 25 class MojoChannelFactory : public ChannelFactory { |
(...skipping 10 matching lines...) Expand all Loading... | |
34 scoped_ptr<Channel> BuildChannel(Listener* listener) override { | 36 scoped_ptr<Channel> BuildChannel(Listener* listener) override { |
35 return ChannelMojo::Create(delegate_, channel_handle_, mode_, listener); | 37 return ChannelMojo::Create(delegate_, channel_handle_, mode_, listener); |
36 } | 38 } |
37 | 39 |
38 private: | 40 private: |
39 ChannelMojo::Delegate* delegate_; | 41 ChannelMojo::Delegate* delegate_; |
40 ChannelHandle channel_handle_; | 42 ChannelHandle channel_handle_; |
41 Channel::Mode mode_; | 43 Channel::Mode mode_; |
42 }; | 44 }; |
43 | 45 |
46 //------------------------------------------------------------------------------ | |
47 | |
48 class ClientChannelMojo | |
49 : public ChannelMojo, | |
50 public NON_EXPORTED_BASE(mojo::InterfaceImpl<ClientChannel>) { | |
51 public: | |
52 ClientChannelMojo(ChannelMojo::Delegate* delegate, | |
53 const ChannelHandle& handle, | |
54 Listener* listener); | |
55 ~ClientChannelMojo() override; | |
56 // MojoBootstrap::Delegate implementation | |
57 void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) override; | |
58 // InterfaceImpl implementation | |
59 void OnConnectionError() override; | |
60 // ClientChannel implementation | |
61 void Init( | |
62 mojo::ScopedMessagePipeHandle pipe, | |
63 int32_t peer_pid, | |
64 const mojo::Callback<void(int32_t)>& callback) override; | |
65 | |
66 DISALLOW_COPY_AND_ASSIGN(ClientChannelMojo); | |
67 }; | |
68 | |
69 ClientChannelMojo::ClientChannelMojo(ChannelMojo::Delegate* delegate, | |
70 const ChannelHandle& handle, | |
71 Listener* listener) | |
72 : ChannelMojo(delegate, handle, Channel::MODE_CLIENT, listener) { | |
73 } | |
74 | |
75 ClientChannelMojo::~ClientChannelMojo() { | |
76 } | |
77 | |
78 void ClientChannelMojo::OnPipeAvailable( | |
79 mojo::embedder::ScopedPlatformHandle handle) { | |
80 mojo::WeakBindToPipe(this, CreateMessagingPipe(handle.Pass())); | |
81 } | |
82 | |
83 void ClientChannelMojo::OnConnectionError() { | |
84 listener()->OnChannelError(); | |
85 } | |
86 | |
87 void ClientChannelMojo::Init( | |
88 mojo::ScopedMessagePipeHandle pipe, | |
89 int32_t peer_pid, | |
90 const mojo::Callback<void(int32_t)>& callback) { | |
91 InitMessageReader(pipe.Pass(), static_cast<base::ProcessId>(peer_pid)); | |
92 callback.Run(GetSelfPID()); | |
93 } | |
94 | |
95 //------------------------------------------------------------------------------ | |
96 | |
97 class ServerChannelMojo : public ChannelMojo, public mojo::ErrorHandler { | |
98 public: | |
99 ServerChannelMojo(ChannelMojo::Delegate* delegate, | |
100 const ChannelHandle& handle, | |
101 Listener* listener); | |
102 ~ServerChannelMojo() override; | |
103 | |
104 // MojoBootstrap::Delegate implementation | |
105 void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) override; | |
106 // ErrorHandler implementation | |
107 void OnConnectionError() override; | |
108 // Channel override | |
109 void Close() override; | |
110 | |
111 private: | |
112 // ClientChannelClient implementation | |
113 void ClientChannelWasInitialized(int32_t peer_pid); | |
114 | |
115 mojo::InterfacePtr<ClientChannel> client_channel_; | |
116 mojo::ScopedMessagePipeHandle message_pipe_; | |
117 | |
118 DISALLOW_COPY_AND_ASSIGN(ServerChannelMojo); | |
119 }; | |
120 | |
121 ServerChannelMojo::ServerChannelMojo(ChannelMojo::Delegate* delegate, | |
122 const ChannelHandle& handle, | |
123 Listener* listener) | |
124 : ChannelMojo(delegate, handle, Channel::MODE_SERVER, listener) { | |
125 } | |
126 | |
127 ServerChannelMojo::~ServerChannelMojo() { | |
128 Close(); | |
129 } | |
130 | |
131 void ServerChannelMojo::OnPipeAvailable( | |
132 mojo::embedder::ScopedPlatformHandle handle) { | |
133 mojo::ScopedMessagePipeHandle peer; | |
134 MojoResult create_result = | |
135 mojo::CreateMessagePipe(nullptr, &message_pipe_, &peer); | |
136 if (create_result != MOJO_RESULT_OK) { | |
137 DLOG(WARNING) << "mojo::CreateMessagePipe failed: " << create_result; | |
138 listener()->OnChannelError(); | |
139 return; | |
140 } | |
141 | |
142 client_channel_.Bind(CreateMessagingPipe(handle.Pass())); | |
143 client_channel_.set_error_handler(this); | |
144 client_channel_->Init( | |
145 peer.Pass(), | |
146 static_cast<int32_t>(GetSelfPID()), | |
147 base::Bind(&ServerChannelMojo::ClientChannelWasInitialized, | |
148 base::Unretained(this))); | |
149 } | |
150 | |
151 void ServerChannelMojo::ClientChannelWasInitialized(int32_t peer_pid) { | |
152 InitMessageReader(message_pipe_.Pass(), peer_pid); | |
153 } | |
154 | |
155 void ServerChannelMojo::OnConnectionError() { | |
156 listener()->OnChannelError(); | |
157 } | |
158 | |
159 void ServerChannelMojo::Close() { | |
160 client_channel_.reset(); | |
161 message_pipe_.reset(); | |
162 ChannelMojo::Close(); | |
163 } | |
164 | |
44 } // namespace | 165 } // namespace |
45 | 166 |
46 //------------------------------------------------------------------------------ | 167 //------------------------------------------------------------------------------ |
47 | 168 |
48 void ChannelMojo::ChannelInfoDeleter::operator()( | 169 void ChannelMojo::ChannelInfoDeleter::operator()( |
49 mojo::embedder::ChannelInfo* ptr) const { | 170 mojo::embedder::ChannelInfo* ptr) const { |
50 mojo::embedder::DestroyChannelOnIOThread(ptr); | 171 mojo::embedder::DestroyChannelOnIOThread(ptr); |
51 } | 172 } |
52 | 173 |
53 //------------------------------------------------------------------------------ | 174 //------------------------------------------------------------------------------ |
54 | 175 |
55 // static | 176 // static |
56 bool ChannelMojo::ShouldBeUsed() { | 177 bool ChannelMojo::ShouldBeUsed() { |
57 // TODO(morrita): Turn this on for a set of platforms. | 178 // TODO(morrita): Turn this on for a set of platforms. |
58 return false; | 179 return false; |
59 } | 180 } |
60 | 181 |
61 // static | 182 // static |
62 scoped_ptr<ChannelMojo> ChannelMojo::Create(ChannelMojo::Delegate* delegate, | 183 scoped_ptr<ChannelMojo> ChannelMojo::Create(ChannelMojo::Delegate* delegate, |
63 const ChannelHandle& channel_handle, | 184 const ChannelHandle& channel_handle, |
64 Mode mode, | 185 Mode mode, |
65 Listener* listener) { | 186 Listener* listener) { |
66 return make_scoped_ptr( | 187 switch (mode) { |
67 new ChannelMojo(delegate, channel_handle, mode, listener)); | 188 case Channel::MODE_CLIENT: |
189 return make_scoped_ptr( | |
190 new ClientChannelMojo(delegate, channel_handle, listener)); | |
191 case Channel::MODE_SERVER: | |
192 return make_scoped_ptr( | |
193 new ServerChannelMojo(delegate, channel_handle, listener)); | |
194 default: | |
195 NOTREACHED(); | |
196 return nullptr; | |
197 } | |
68 } | 198 } |
69 | 199 |
70 // static | 200 // static |
71 scoped_ptr<ChannelFactory> ChannelMojo::CreateServerFactory( | 201 scoped_ptr<ChannelFactory> ChannelMojo::CreateServerFactory( |
72 ChannelMojo::Delegate* delegate, | 202 ChannelMojo::Delegate* delegate, |
73 const ChannelHandle& channel_handle) { | 203 const ChannelHandle& channel_handle) { |
74 return make_scoped_ptr( | 204 return make_scoped_ptr( |
75 new MojoChannelFactory(delegate, channel_handle, Channel::MODE_SERVER)); | 205 new MojoChannelFactory(delegate, channel_handle, Channel::MODE_SERVER)); |
76 } | 206 } |
77 | 207 |
(...skipping 30 matching lines...) Expand all Loading... | |
108 | 238 |
109 ChannelMojo::~ChannelMojo() { | 239 ChannelMojo::~ChannelMojo() { |
110 Close(); | 240 Close(); |
111 } | 241 } |
112 | 242 |
113 void ChannelMojo::InitDelegate(ChannelMojo::Delegate* delegate) { | 243 void ChannelMojo::InitDelegate(ChannelMojo::Delegate* delegate) { |
114 delegate_ = delegate->ToWeakPtr(); | 244 delegate_ = delegate->ToWeakPtr(); |
115 delegate_->OnChannelCreated(weak_factory_.GetWeakPtr()); | 245 delegate_->OnChannelCreated(weak_factory_.GetWeakPtr()); |
116 } | 246 } |
117 | 247 |
118 void ChannelMojo::InitControlReader( | 248 mojo::ScopedMessagePipeHandle ChannelMojo::CreateMessagingPipe( |
119 mojo::embedder::ScopedPlatformHandle handle) { | 249 mojo::embedder::ScopedPlatformHandle handle) { |
120 DCHECK(base::MessageLoopForIO::IsCurrent()); | 250 DCHECK(!channel_info_.get()); |
121 mojo::embedder::ChannelInfo* channel_info; | 251 mojo::embedder::ChannelInfo* channel_info; |
122 mojo::ScopedMessagePipeHandle control_pipe = | 252 mojo::ScopedMessagePipeHandle pipe = |
123 mojo::embedder::CreateChannelOnIOThread(handle.Pass(), &channel_info); | 253 mojo::embedder::CreateChannelOnIOThread(handle.Pass(), &channel_info); |
124 channel_info_.reset(channel_info); | 254 channel_info_.reset(channel_info); |
125 | 255 return pipe.Pass(); |
126 switch (mode_) { | |
127 case MODE_SERVER: | |
128 control_reader_.reset( | |
129 new internal::ServerControlReader(control_pipe.Pass(), this)); | |
130 break; | |
131 case MODE_CLIENT: | |
132 control_reader_.reset( | |
133 new internal::ClientControlReader(control_pipe.Pass(), this)); | |
134 break; | |
135 default: | |
136 NOTREACHED(); | |
137 break; | |
138 } | |
139 } | 256 } |
140 | 257 |
141 bool ChannelMojo::Connect() { | 258 bool ChannelMojo::Connect() { |
142 DCHECK(!message_reader_); | 259 DCHECK(!message_reader_); |
143 DCHECK(!control_reader_); | |
144 return bootstrap_->Connect(); | 260 return bootstrap_->Connect(); |
145 } | 261 } |
146 | 262 |
147 void ChannelMojo::Close() { | 263 void ChannelMojo::Close() { |
148 control_reader_.reset(); | |
149 message_reader_.reset(); | 264 message_reader_.reset(); |
150 channel_info_.reset(); | 265 channel_info_.reset(); |
151 } | 266 } |
152 | 267 |
153 void ChannelMojo::OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) { | |
154 InitControlReader(handle.Pass()); | |
155 control_reader_->Connect(); | |
156 } | |
157 | |
158 void ChannelMojo::OnBootstrapError() { | 268 void ChannelMojo::OnBootstrapError() { |
159 listener_->OnChannelError(); | 269 listener_->OnChannelError(); |
160 } | 270 } |
161 | 271 |
162 void ChannelMojo::OnConnected(mojo::ScopedMessagePipeHandle pipe) { | 272 void ChannelMojo::InitMessageReader(mojo::ScopedMessagePipeHandle pipe, |
273 int32_t peer_pid) { | |
163 message_reader_ = | 274 message_reader_ = |
164 make_scoped_ptr(new internal::MessageReader(pipe.Pass(), this)); | 275 make_scoped_ptr(new internal::MessageReader(pipe.Pass(), this)); |
165 | 276 |
166 for (size_t i = 0; i < pending_messages_.size(); ++i) { | 277 for (size_t i = 0; i < pending_messages_.size(); ++i) { |
167 bool sent = message_reader_->Send(make_scoped_ptr(pending_messages_[i])); | 278 bool sent = message_reader_->Send(make_scoped_ptr(pending_messages_[i])); |
168 pending_messages_[i] = NULL; | 279 pending_messages_[i] = NULL; |
169 if (!sent) { | 280 if (!sent) { |
170 pending_messages_.clear(); | 281 pending_messages_.clear(); |
171 listener_->OnChannelError(); | 282 listener_->OnChannelError(); |
172 return; | 283 return; |
173 } | 284 } |
174 } | 285 } |
175 | 286 |
176 pending_messages_.clear(); | 287 pending_messages_.clear(); |
177 | 288 |
178 listener_->OnChannelConnected(GetPeerPID()); | 289 set_peer_pid(peer_pid); |
290 listener_->OnChannelConnected( | |
viettrungluu
2014/10/24 23:00:47
nit: everything fits on a single line, I think
Hajime Morrita
2014/10/24 23:04:17
Done.
| |
291 static_cast<int32_t>(GetPeerPID())); | |
179 } | 292 } |
180 | 293 |
181 void ChannelMojo::OnPipeClosed(internal::MessagePipeReader* reader) { | 294 void ChannelMojo::OnPipeClosed(internal::MessagePipeReader* reader) { |
182 Close(); | 295 Close(); |
183 } | 296 } |
184 | 297 |
185 void ChannelMojo::OnPipeError(internal::MessagePipeReader* reader) { | 298 void ChannelMojo::OnPipeError(internal::MessagePipeReader* reader) { |
186 listener_->OnChannelError(); | 299 listener_->OnChannelError(); |
187 } | 300 } |
188 | 301 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 | 394 |
282 fdset->CommitAll(); | 395 fdset->CommitAll(); |
283 } | 396 } |
284 | 397 |
285 return MOJO_RESULT_OK; | 398 return MOJO_RESULT_OK; |
286 } | 399 } |
287 | 400 |
288 #endif // defined(OS_POSIX) && !defined(OS_NACL) | 401 #endif // defined(OS_POSIX) && !defined(OS_NACL) |
289 | 402 |
290 } // namespace IPC | 403 } // namespace IPC |
OLD | NEW |