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 "mojo/shell/out_of_process_dynamic_service_runner.h"
6
7#include "base/bind.h"
8#include "base/callback_helpers.h"
9#include "base/files/file_util.h"
10#include "base/logging.h"
11#include "base/scoped_native_library.h"
12
13namespace mojo {
14namespace shell {
15
16OutOfProcessDynamicServiceRunner::OutOfProcessDynamicServiceRunner(
17    Context* context)
18    : context_(context) {
19}
20
21OutOfProcessDynamicServiceRunner::~OutOfProcessDynamicServiceRunner() {
22  if (app_child_process_host_) {
23    // TODO(vtl): Race condition: If |AppChildProcessHost::DidStart()| hasn't
24    // been called yet, we shouldn't call |Join()| here. (Until |DidStart()|, we
25    // may not have a child process to wait on.) Probably we should fix
26    // |Join()|.
27    app_child_process_host_->Join();
28  }
29}
30
31void OutOfProcessDynamicServiceRunner::Start(
32    const base::FilePath& app_path,
33    ScopedMessagePipeHandle service_handle,
34    const base::Closure& app_completed_callback) {
35  app_path_ = app_path;
36
37  DCHECK(!service_handle_.is_valid());
38  service_handle_ = service_handle.Pass();
39
40  DCHECK(app_completed_callback_.is_null());
41  app_completed_callback_ = app_completed_callback;
42
43  app_child_process_host_.reset(new AppChildProcessHost(context_, this));
44  app_child_process_host_->Start();
45
46  // TODO(vtl): |app_path.AsUTF8Unsafe()| is unsafe.
47  app_child_process_host_->controller()->StartApp(
48      app_path.AsUTF8Unsafe(),
49      ScopedMessagePipeHandle(MessagePipeHandle(
50          service_handle.release().value())));
51}
52
53void OutOfProcessDynamicServiceRunner::AppCompleted(int32_t result) {
54  DVLOG(2) << "OutOfProcessDynamicServiceRunner::AppCompleted(" << result
55           << ")";
56
57  app_completed_callback_.Run();
58  app_completed_callback_.Reset();
59  app_child_process_host_.reset();
60}
61
62}  // namespace shell
63}  // namespace mojo
64