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.
53  scoped_refptr<AutoThreadTaskRunner> ui_task_runner();
54
55  // Task runner for the thread used by the ScreenRecorder to capture
56  // the screen.
57  scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner();
58
59  // Task runner for the thread used to encode video streams.
60  scoped_refptr<AutoThreadTaskRunner> video_encode_task_runner();
61
62  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter();
63
64 private:
65  ChromotingHostContext(AutoThreadTaskRunner* ui_task_runner);
66
67  // Thread for audio capture and encoding.
68  scoped_refptr<AutoThreadTaskRunner> audio_task_runner_;
69
70  // Thread for I/O operations.
71  scoped_refptr<AutoThreadTaskRunner> file_task_runner_;
72
73  // Thread for input injection.
74  scoped_refptr<AutoThreadTaskRunner> input_task_runner_;
75
76  // Thread for network operations.
77  scoped_refptr<AutoThreadTaskRunner> network_task_runner_;
78
79  // Caller-supplied UI thread. This is usually the application main thread.
80  scoped_refptr<AutoThreadTaskRunner> ui_task_runner_;
81
82  // Thread for screen capture.
83  scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner_;
84
85  // Thread for video encoding.
86  scoped_refptr<AutoThreadTaskRunner> video_encode_task_runner_;
87
88  // Serves URLRequestContexts that use the network and UI task runners.
89  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
90
91  DISALLOW_COPY_AND_ASSIGN(ChromotingHostContext);
92};
93
94}  // namespace remoting
95
96#endif  // REMOTING_HOST_CHROMOTING_HOST_CONTEXT_H_
97