1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/it2me_desktop_environment.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/single_thread_task_runner.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/client_session_control.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/host_window.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/host_window_proxy.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/local_input_monitor.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_POSIX)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/types.h>
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <unistd.h>
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // defined(OS_POSIX)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace remoting {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironment::~It2MeDesktopEnvironment() {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(caller_task_runner()->BelongsToCurrentThread());
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironment::It2MeDesktopEnvironment(
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::WeakPtr<ClientSessionControl> client_session_control)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : BasicDesktopEnvironment(caller_task_runner,
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              input_task_runner,
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                              ui_task_runner) {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(caller_task_runner->BelongsToCurrentThread());
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create the local input monitor.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  local_input_monitor_ = LocalInputMonitor::Create(caller_task_runner,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                   input_task_runner,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                   ui_task_runner,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                   client_session_control);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The host UI should be created on the UI thread.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool want_user_interface = true;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Don't try to display any UI on top of the system's login screen as this
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is rejected by the Window Server on OS X 10.7.4, and prevents the
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // capturer from working (http://crbug.com/140984).
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(lambroslambrou): Use a better technique of detecting whether we're
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // running in the LoginWindow context, and refactor this into a separate
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // function to be used here and in CurtainMode::ActivateCurtain().
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  want_user_interface = getuid() != 0;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // defined(OS_MACOSX)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create the continue and disconnect windows.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (want_user_interface) {
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    continue_window_ = HostWindow::CreateContinueWindow();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    continue_window_.reset(new HostWindowProxy(
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        caller_task_runner,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ui_task_runner,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        continue_window_.Pass()));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    continue_window_->Start(client_session_control);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    disconnect_window_ = HostWindow::CreateDisconnectWindow();
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    disconnect_window_.reset(new HostWindowProxy(
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        caller_task_runner,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ui_task_runner,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        disconnect_window_.Pass()));
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    disconnect_window_->Start(client_session_control);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironmentFactory::It2MeDesktopEnvironmentFactory(
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : BasicDesktopEnvironmentFactory(caller_task_runner,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     input_task_runner,
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                     ui_task_runner) {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironmentFactory::~It2MeDesktopEnvironmentFactory() {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<DesktopEnvironment> It2MeDesktopEnvironmentFactory::Create(
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::WeakPtr<ClientSessionControl> client_session_control) {
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(caller_task_runner()->BelongsToCurrentThread());
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return scoped_ptr<DesktopEnvironment>(
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new It2MeDesktopEnvironment(caller_task_runner(),
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  input_task_runner(),
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ui_task_runner(),
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  client_session_control));
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace remoting
96