1// Copyright (c) 2012 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#ifndef CONTENT_BROWSER_UTILITY_PROCESS_HOST_IMPL_H_
6#define CONTENT_BROWSER_UTILITY_PROCESS_HOST_IMPL_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/files/file_path.h"
14#include "base/memory/ref_counted.h"
15#include "base/memory/scoped_ptr.h"
16#include "base/memory/weak_ptr.h"
17#include "content/public/browser/browser_child_process_host_delegate.h"
18#include "content/public/browser/utility_process_host.h"
19
20namespace base {
21class SequencedTaskRunner;
22class Thread;
23}
24
25namespace content {
26class BrowserChildProcessHostImpl;
27
28class CONTENT_EXPORT UtilityProcessHostImpl
29    : public NON_EXPORTED_BASE(UtilityProcessHost),
30      public BrowserChildProcessHostDelegate {
31 public:
32  UtilityProcessHostImpl(UtilityProcessHostClient* client,
33                         base::SequencedTaskRunner* client_task_runner);
34  virtual ~UtilityProcessHostImpl();
35
36  // UtilityProcessHost implementation:
37  virtual bool Send(IPC::Message* message) OVERRIDE;
38  virtual bool StartBatchMode() OVERRIDE;
39  virtual void EndBatchMode() OVERRIDE;
40  virtual void SetExposedDir(const base::FilePath& dir) OVERRIDE;
41  virtual void EnableMDns() OVERRIDE;
42  virtual void DisableSandbox() OVERRIDE;
43  virtual const ChildProcessData& GetData() OVERRIDE;
44#if defined(OS_POSIX)
45  virtual void SetEnv(const base::EnvironmentMap& env) OVERRIDE;
46#endif
47
48  void set_child_flags(int flags) { child_flags_ = flags; }
49
50 private:
51  // Starts a process if necessary.  Returns true if it succeeded or a process
52  // has already been started via StartBatchMode().
53  bool StartProcess();
54
55  // BrowserChildProcessHost:
56  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
57  virtual void OnProcessCrashed(int exit_code) OVERRIDE;
58
59  // A pointer to our client interface, who will be informed of progress.
60  scoped_refptr<UtilityProcessHostClient> client_;
61  scoped_refptr<base::SequencedTaskRunner> client_task_runner_;
62  // True when running in batch mode, i.e., StartBatchMode() has been called
63  // and the utility process will run until EndBatchMode().
64  bool is_batch_mode_;
65
66  base::FilePath exposed_dir_;
67
68  // Whether the utility process needs to perform presandbox initialization
69  // for mDNS.
70  bool is_mdns_enabled_;
71
72  // Whether to pass switches::kNoSandbox to the child.
73  bool no_sandbox_;
74
75  // Flags defined in ChildProcessHost with which to start the process.
76  int child_flags_;
77
78  base::EnvironmentMap env_;
79
80  bool started_;
81
82  scoped_ptr<BrowserChildProcessHostImpl> process_;
83
84  // Used in single-process mode instead of process_.
85  scoped_ptr<base::Thread> in_process_thread_;
86
87  DISALLOW_COPY_AND_ASSIGN(UtilityProcessHostImpl);
88};
89
90}  // namespace content
91
92#endif  // CONTENT_BROWSER_UTILITY_PROCESS_HOST_IMPL_H_
93