10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file. 423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "mojo/embedder/channel_init.h" 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/bind.h" 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "mojo/embedder/embedder.h" 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace mojo { 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace embedder { 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciChannelInit::ChannelInit() : channel_info_(nullptr), weak_factory_(this) { 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuChannelInit::~ChannelInit() { 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (channel_info_) 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DestroyChannel(channel_info_); 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ScopedMessagePipeHandle ChannelInit::Init( 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::PlatformFile file, 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_refptr<base::TaskRunner> io_thread_task_runner) { 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(!io_thread_task_runner_.get()); // Should only init once. 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) io_thread_task_runner_ = io_thread_task_runner; 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScopedMessagePipeHandle message_pipe = 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateChannel(ScopedPlatformHandle(PlatformHandle(file)), 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) io_thread_task_runner, 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ChannelInit::OnCreatedChannel, 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) weak_factory_.GetWeakPtr(), 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) io_thread_task_runner), 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::MessageLoop::current()->message_loop_proxy()).Pass(); 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return message_pipe.Pass(); 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ChannelInit::WillDestroySoon() { 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (channel_info_) 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WillDestroyChannelSoon(channel_info_); 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ChannelInit::OnCreatedChannel(base::WeakPtr<ChannelInit> self, 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::TaskRunner> io_thread, 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChannelInfo* channel) { 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // If |self| was already destroyed, shut the channel down. 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!self) { 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DestroyChannel(channel); 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) self->channel_info_ = channel; 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} // namespace embedder 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace mojo 57