// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/nacl/renderer/trusted_plugin_channel.h"
#include "base/callback_helpers.h"
#include "components/nacl/common/nacl_renderer_messages.h"
#include "components/nacl/renderer/nexe_load_manager.h"
#include "content/public/renderer/render_thread.h"
#include "ipc/ipc_sync_channel.h"
#include "ipc/ipc_message_macros.h"
#include "ppapi/c/pp_errors.h"
namespace nacl {
TrustedPluginChannel::TrustedPluginChannel(
NexeLoadManager* nexe_load_manager,
const IPC::ChannelHandle& handle,
base::WaitableEvent* shutdown_event,
bool report_exit_status)
: nexe_load_manager_(nexe_load_manager),
report_exit_status_(report_exit_status) {
channel_ = IPC::SyncChannel::Create(
handle,
IPC::Channel::MODE_CLIENT,
this,
content::RenderThread::Get()->GetIOMessageLoopProxy(),
true,
shutdown_event).Pass();
}
TrustedPluginChannel::~TrustedPluginChannel() {
}
bool TrustedPluginChannel::Send(IPC::Message* message) {
return channel_->Send(message);
}
bool TrustedPluginChannel::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(TrustedPluginChannel, msg)
IPC_MESSAGE_HANDLER(NaClRendererMsg_ReportExitStatus, OnReportExitStatus);
IPC_MESSAGE_UNHANDLED(handled = false);
IPC_END_MESSAGE_MAP()
return handled;
}
void TrustedPluginChannel::OnChannelError() {
if (report_exit_status_)
nexe_load_manager_->NexeDidCrash();
}
void TrustedPluginChannel::OnReportExitStatus(int exit_status) {
if (report_exit_status_)
nexe_load_manager_->set_exit_status(exit_status);
}
} // namespace nacl