Home | History | Annotate | Download | only in embedder
      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
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/embedder/channel_init.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/message_loop/message_loop.h"
      9 #include "mojo/embedder/embedder.h"
     10 
     11 namespace mojo {
     12 namespace embedder {
     13 
     14 ChannelInit::ChannelInit() : channel_info_(nullptr), weak_factory_(this) {
     15 }
     16 
     17 ChannelInit::~ChannelInit() {
     18   if (channel_info_)
     19     DestroyChannel(channel_info_);
     20 }
     21 
     22 ScopedMessagePipeHandle ChannelInit::Init(
     23     base::PlatformFile file,
     24     scoped_refptr<base::TaskRunner> io_thread_task_runner) {
     25   DCHECK(!io_thread_task_runner_.get());  // Should only init once.
     26   io_thread_task_runner_ = io_thread_task_runner;
     27   ScopedMessagePipeHandle message_pipe =
     28       CreateChannel(ScopedPlatformHandle(PlatformHandle(file)),
     29                     io_thread_task_runner,
     30                     base::Bind(&ChannelInit::OnCreatedChannel,
     31                                weak_factory_.GetWeakPtr(),
     32                                io_thread_task_runner),
     33                     base::MessageLoop::current()->message_loop_proxy()).Pass();
     34   return message_pipe.Pass();
     35 }
     36 
     37 void ChannelInit::WillDestroySoon() {
     38   if (channel_info_)
     39     WillDestroyChannelSoon(channel_info_);
     40 }
     41 
     42 // static
     43 void ChannelInit::OnCreatedChannel(base::WeakPtr<ChannelInit> self,
     44                                    scoped_refptr<base::TaskRunner> io_thread,
     45                                    ChannelInfo* channel) {
     46   // If |self| was already destroyed, shut the channel down.
     47   if (!self) {
     48     DestroyChannel(channel);
     49     return;
     50   }
     51 
     52   self->channel_info_ = channel;
     53 }
     54 
     55 }  // namespace embedder
     56 }  // namespace mojo
     57