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 REMOTING_HOST_CHROMOTING_HOST_CONTEXT_H_
6#define REMOTING_HOST_CHROMOTING_HOST_CONTEXT_H_
7
8#include "base/gtest_prod_util.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11
12namespace net {
13class URLRequestContextGetter;
14}  // namespace net
15
16namespace remoting {
17
18class AutoThreadTaskRunner;
19
20// A class that manages threads and running context for the chromoting host
21// process.  This class is virtual only for testing purposes (see below).
22class ChromotingHostContext {
23 public:
24  ~ChromotingHostContext();
25
26  // Create threads and URLRequestContextGetter for use by a host.
27  // During shutdown the caller should tear-down the ChromotingHostContext and
28  // then continue to run until |ui_task_runner| is no longer referenced.
29  // NULL is returned if any threads fail to start.
30  static scoped_ptr<ChromotingHostContext> Create(
31      scoped_refptr<AutoThreadTaskRunner> ui_task_runner);
32
33  // Task runner for the thread used for audio capture and encoding.
34  scoped_refptr<AutoThreadTaskRunner> audio_task_runner();
35
36  // Task runner for the thread that is used for blocking file
37  // IO. This thread is used by the URLRequestContext to read proxy
38  // configuration and by NatConfig to read policy configs.
39  scoped_refptr<AutoThreadTaskRunner> file_task_runner();
40
41  // Task runner for the thread that is used by the InputInjector.
42  //
43  // TODO(sergeyu): Do we need a separate thread for InputInjector?
44  // Can we use some other thread instead?
45  scoped_refptr<AutoThreadTaskRunner> input_task_runner();
46
47  // Task runner for the thread used for network IO. This thread runs
48  // a libjingle message loop, and is the only thread on which
49  // libjingle code may be run.
50  scoped_refptr<AutoThreadTaskRunner> network_task_runner();
51
52  // Task runner for the thread that is used for the UI. In the NPAPI
53  // plugin this corresponds to the main plugin thread.
54  scoped_refptr<AutoThreadTaskRunner> ui_task_runner();
55
56  // Task runner for the thread used by the ScreenRecorder to capture
57  // the screen.
58  scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner();
59
60  // Task runner for the thread used to encode video streams.
61  scoped_refptr<AutoThreadTaskRunner> video_encode_task_runner();
62
63  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter();
64
65 private:
66  ChromotingHostContext(AutoThreadTaskRunner* ui_task_runner);
67
68  // Thread for audio capture and encoding.
69  scoped_refptr<AutoThreadTaskRunner> audio_task_runner_;
70
71  // Thread for I/O operations.
72  scoped_refptr<AutoThreadTaskRunner> file_task_runner_;
73
74  // Thread for input injection.
75  scoped_refptr<AutoThreadTaskRunner> input_task_runner_;
76
77  // Thread for network operations.
78  scoped_refptr<AutoThreadTaskRunner> network_task_runner_;
79
80  // Caller-supplied UI thread. This is usually the application main thread.
81  scoped_refptr<AutoThreadTaskRunner> ui_task_runner_;
82
83  // Thread for screen capture.
84  scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner_;
85
86  // Thread for video encoding.
87  scoped_refptr<AutoThreadTaskRunner> video_encode_task_runner_;
88
89  // Serves URLRequestContexts that use the network and UI task runners.
90  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
91
92  DISALLOW_COPY_AND_ASSIGN(ChromotingHostContext);
93};
94
95}  // namespace remoting
96
97#endif  // REMOTING_HOST_CHROMOTING_HOST_CONTEXT_H_
98