1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/child_process.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "mojo/embedder/platform_channel_pair.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/app_child_process.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/switches.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/test_child_process.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace mojo {
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace shell {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChildProcess::~ChildProcess() {
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<ChildProcess> ChildProcess::Create(
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::CommandLine& command_line) {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!command_line.HasSwitch(switches::kChildProcessType))
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<ChildProcess>();
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int type_as_int;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK(base::StringToInt(command_line.GetSwitchValueASCII(
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            switches::kChildProcessType), &type_as_int));
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<ChildProcess> rv;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (type_as_int) {
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case TYPE_TEST:
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      rv.reset(new TestChildProcess());
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case TYPE_APP:
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      rv.reset(new AppChildProcess());
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    default:
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      CHECK(false) << "Invalid child process type";
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (rv) {
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    rv->platform_channel_ =
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        embedder::PlatformChannelPair::PassClientHandleFromParentProcess(
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            command_line);
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CHECK(rv->platform_channel_.is_valid());
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return rv.Pass();
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChildProcess::ChildProcess() {
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace shell
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace mojo
59