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