1 // Copyright (c) 2012 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 "ppapi/proxy/proxy_channel.h" 6 7 #include "base/logging.h" 8 #include "ipc/ipc_platform_file.h" 9 #include "ipc/ipc_test_sink.h" 10 11 #if defined(OS_NACL) 12 #include <unistd.h> 13 #endif 14 15 namespace ppapi { 16 namespace proxy { 17 18 ProxyChannel::ProxyChannel() 19 : delegate_(NULL), 20 peer_pid_(base::kNullProcessId), 21 test_sink_(NULL) { 22 } 23 24 ProxyChannel::~ProxyChannel() { 25 DVLOG(1) << "ProxyChannel::~ProxyChannel()"; 26 } 27 28 bool ProxyChannel::InitWithChannel(Delegate* delegate, 29 base::ProcessId peer_pid, 30 const IPC::ChannelHandle& channel_handle, 31 bool is_client) { 32 delegate_ = delegate; 33 peer_pid_ = peer_pid; 34 IPC::Channel::Mode mode = is_client 35 ? IPC::Channel::MODE_CLIENT 36 : IPC::Channel::MODE_SERVER; 37 channel_ = IPC::SyncChannel::Create(channel_handle, mode, this, 38 delegate->GetIPCMessageLoop(), true, 39 delegate->GetShutdownEvent()); 40 return true; 41 } 42 43 void ProxyChannel::InitWithTestSink(IPC::TestSink* test_sink) { 44 DCHECK(!test_sink_); 45 test_sink_ = test_sink; 46 #if !defined(OS_NACL) 47 peer_pid_ = base::GetCurrentProcId(); 48 #endif 49 } 50 51 void ProxyChannel::OnChannelError() { 52 channel_.reset(); 53 } 54 55 #if defined(OS_POSIX) && !defined(OS_NACL) 56 int ProxyChannel::TakeRendererFD() { 57 DCHECK(channel()); 58 return channel()->TakeClientFileDescriptor(); 59 } 60 #endif 61 62 IPC::PlatformFileForTransit ProxyChannel::ShareHandleWithRemote( 63 base::PlatformFile handle, 64 bool should_close_source) { 65 // Channel could be closed if the plugin crashes. 66 if (!channel_.get()) { 67 if (should_close_source) { 68 base::File file_closer(handle); 69 } 70 return IPC::InvalidPlatformFileForTransit(); 71 } 72 DCHECK(peer_pid_ != base::kNullProcessId); 73 return delegate_->ShareHandleWithRemote(handle, peer_pid_, 74 should_close_source); 75 } 76 77 bool ProxyChannel::Send(IPC::Message* msg) { 78 if (test_sink_) 79 return test_sink_->Send(msg); 80 if (channel_.get()) 81 return channel_->Send(msg); 82 83 // Remote side crashed, drop this message. 84 delete msg; 85 return false; 86 } 87 88 } // namespace proxy 89 } // namespace ppapi 90