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 "components/nacl/renderer/trusted_plugin_channel.h"
6
7#include "base/callback_helpers.h"
8#include "components/nacl/common/nacl_renderer_messages.h"
9#include "components/nacl/renderer/nexe_load_manager.h"
10#include "content/public/renderer/render_thread.h"
11#include "ipc/ipc_sync_channel.h"
12#include "ipc/ipc_message_macros.h"
13#include "ppapi/c/pp_errors.h"
14
15namespace nacl {
16
17TrustedPluginChannel::TrustedPluginChannel(
18    NexeLoadManager* nexe_load_manager,
19    const IPC::ChannelHandle& handle,
20    base::WaitableEvent* shutdown_event,
21    bool report_exit_status)
22    : nexe_load_manager_(nexe_load_manager),
23      report_exit_status_(report_exit_status) {
24  channel_ = IPC::SyncChannel::Create(
25      handle,
26      IPC::Channel::MODE_CLIENT,
27      this,
28      content::RenderThread::Get()->GetIOMessageLoopProxy(),
29      true,
30      shutdown_event).Pass();
31}
32
33TrustedPluginChannel::~TrustedPluginChannel() {
34}
35
36bool TrustedPluginChannel::Send(IPC::Message* message) {
37  return channel_->Send(message);
38}
39
40bool TrustedPluginChannel::OnMessageReceived(const IPC::Message& msg) {
41  bool handled = true;
42  IPC_BEGIN_MESSAGE_MAP(TrustedPluginChannel, msg)
43    IPC_MESSAGE_HANDLER(NaClRendererMsg_ReportExitStatus, OnReportExitStatus);
44    IPC_MESSAGE_UNHANDLED(handled = false);
45  IPC_END_MESSAGE_MAP()
46  return handled;
47}
48
49void TrustedPluginChannel::OnChannelError() {
50  if (report_exit_status_)
51    nexe_load_manager_->NexeDidCrash();
52}
53
54void TrustedPluginChannel::OnReportExitStatus(int exit_status) {
55  if (report_exit_status_)
56    nexe_load_manager_->set_exit_status(exit_status);
57}
58
59}  // namespace nacl
60