1 // Copyright (c) 2011 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 "chrome/browser/nacl_host/nacl_broker_host_win.h"
6
7 #include "base/command_line.h"
8 #include "base/path_service.h"
9 #include "ipc/ipc_switches.h"
10 #include "chrome/browser/nacl_host/nacl_broker_service_win.h"
11 #include "chrome/browser/nacl_host/nacl_process_host.h"
12 #include "chrome/common/chrome_constants.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "chrome/common/nacl_cmd_line.h"
15 #include "chrome/common/nacl_messages.h"
16
NaClBrokerHost()17 NaClBrokerHost::NaClBrokerHost()
18 : BrowserChildProcessHost(NACL_BROKER_PROCESS),
19 stopping_(false) {
20 }
21
~NaClBrokerHost()22 NaClBrokerHost::~NaClBrokerHost() {
23 }
24
Init()25 bool NaClBrokerHost::Init() {
26 // Create the channel that will be used for communicating with the broker.
27 if (!CreateChannel())
28 return false;
29
30 // Create the path to the nacl broker/loader executable.
31 FilePath module_path;
32 if (!PathService::Get(base::FILE_MODULE, &module_path))
33 return false;
34
35 FilePath nacl_path = module_path.DirName().Append(chrome::kNaClAppName);
36 CommandLine* cmd_line = new CommandLine(nacl_path);
37 nacl::CopyNaClCommandLineArguments(cmd_line);
38
39 cmd_line->AppendSwitchASCII(switches::kProcessType,
40 switches::kNaClBrokerProcess);
41
42 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
43
44 BrowserChildProcessHost::Launch(FilePath(), cmd_line);
45 return true;
46 }
47
OnMessageReceived(const IPC::Message & msg)48 bool NaClBrokerHost::OnMessageReceived(const IPC::Message& msg) {
49 bool handled = true;
50 IPC_BEGIN_MESSAGE_MAP(NaClBrokerHost, msg)
51 IPC_MESSAGE_HANDLER(NaClProcessMsg_LoaderLaunched, OnLoaderLaunched)
52 IPC_MESSAGE_UNHANDLED(handled = false)
53 IPC_END_MESSAGE_MAP()
54 return handled;
55 }
56
LaunchLoader(const std::wstring & loader_channel_id)57 bool NaClBrokerHost::LaunchLoader(
58 const std::wstring& loader_channel_id) {
59 return Send(new NaClProcessMsg_LaunchLoaderThroughBroker(loader_channel_id));
60 }
61
OnLoaderLaunched(const std::wstring & loader_channel_id,base::ProcessHandle handle)62 void NaClBrokerHost::OnLoaderLaunched(const std::wstring& loader_channel_id,
63 base::ProcessHandle handle) {
64 NaClBrokerService::GetInstance()->OnLoaderLaunched(loader_channel_id, handle);
65 }
66
StopBroker()67 void NaClBrokerHost::StopBroker() {
68 stopping_ = true;
69 Send(new NaClProcessMsg_StopBroker());
70 }
71