Home | History | Annotate | Download | only in proxy
      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/broker_dispatcher.h"
      6 
      7 #include "base/sync_socket.h"
      8 #include "ppapi/c/pp_errors.h"
      9 #include "ppapi/proxy/ppapi_messages.h"
     10 #include "ppapi/shared_impl/platform_file.h"
     11 
     12 namespace ppapi {
     13 namespace proxy {
     14 
     15 BrokerDispatcher::BrokerDispatcher(PP_ConnectInstance_Func connect_instance)
     16     : connect_instance_(connect_instance) {
     17 }
     18 
     19 BrokerDispatcher::~BrokerDispatcher() {
     20 }
     21 
     22 bool BrokerDispatcher::InitBrokerWithChannel(
     23     ProxyChannel::Delegate* delegate,
     24     base::ProcessId peer_pid,
     25     const IPC::ChannelHandle& channel_handle,
     26     bool is_client) {
     27   return ProxyChannel::InitWithChannel(delegate, peer_pid, channel_handle,
     28                                        is_client);
     29 }
     30 
     31 bool BrokerDispatcher::OnMessageReceived(const IPC::Message& msg) {
     32   // Control messages.
     33   if (msg.routing_id() == MSG_ROUTING_CONTROL) {
     34     bool handled = true;
     35     IPC_BEGIN_MESSAGE_MAP(BrokerDispatcher, msg)
     36       IPC_MESSAGE_HANDLER(PpapiMsg_ConnectToPlugin, OnMsgConnectToPlugin)
     37       IPC_MESSAGE_UNHANDLED(handled = false)
     38     IPC_END_MESSAGE_MAP()
     39     return handled;
     40   }
     41   return false;
     42 }
     43 
     44 // Transfers ownership of the handle to the broker module.
     45 void BrokerDispatcher::OnMsgConnectToPlugin(
     46     PP_Instance instance,
     47     IPC::PlatformFileForTransit handle,
     48     int32_t* result) {
     49   if (handle == IPC::InvalidPlatformFileForTransit()) {
     50     *result = PP_ERROR_FAILED;
     51   } else {
     52     base::SyncSocket::Handle socket_handle =
     53         IPC::PlatformFileForTransitToPlatformFile(handle);
     54 
     55     if (connect_instance_) {
     56       *result = connect_instance_(instance,
     57                                   ppapi::PlatformFileToInt(socket_handle));
     58     } else {
     59       *result = PP_ERROR_FAILED;
     60       // Close the handle since there is no other owner.
     61       // The easiest way to clean it up is to just put it in an object
     62       // and then close them. This failure case is not performance critical.
     63       base::SyncSocket temp_socket(socket_handle);
     64     }
     65   }
     66 }
     67 
     68 BrokerHostDispatcher::BrokerHostDispatcher()
     69     : BrokerDispatcher(NULL) {
     70 }
     71 
     72 void BrokerHostDispatcher::OnChannelError() {
     73   DVLOG(1) << "BrokerHostDispatcher::OnChannelError()";
     74   BrokerDispatcher::OnChannelError();  // Stop using the channel.
     75 
     76   // Tell the host about the crash so it can clean up and display notification.
     77   // TODO(ddorwin): Add BrokerCrashed() to PPB_Proxy_Private and call it.
     78   // ppb_proxy_->BrokerCrashed(pp_module());
     79 }
     80 
     81 BrokerSideDispatcher::BrokerSideDispatcher(
     82     PP_ConnectInstance_Func connect_instance)
     83     : BrokerDispatcher(connect_instance) {
     84 }
     85 
     86 void BrokerSideDispatcher::OnChannelError() {
     87   DVLOG(1) << "BrokerSideDispatcher::OnChannelError()";
     88   BrokerDispatcher::OnChannelError();
     89 
     90   // The renderer has crashed or exited. This channel and all instances
     91   // associated with it are no longer valid.
     92   // TODO(ddorwin): This causes the broker process to exit, which may not be
     93   // desirable in some use cases.
     94   delete this;
     95 }
     96 
     97 
     98 }  // namespace proxy
     99 }  // namespace ppapi
    100