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// This file implements the Windows service controlling Me2Me host processes
6// running within user sessions.
7
8#include "base/bind.h"
9#include "base/bind_helpers.h"
10#include "base/command_line.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/message_loop/message_loop.h"
13#include "base/run_loop.h"
14#include "remoting/base/auto_thread.h"
15#include "remoting/base/auto_thread_task_runner.h"
16#include "remoting/host/desktop_process.h"
17#include "remoting/host/host_exit_codes.h"
18#include "remoting/host/host_main.h"
19#include "remoting/host/ipc_constants.h"
20#include "remoting/host/me2me_desktop_environment.h"
21#include "remoting/host/win/session_desktop_environment.h"
22
23namespace remoting {
24
25int DesktopProcessMain() {
26  const base::CommandLine* command_line =
27      base::CommandLine::ForCurrentProcess();
28  std::string channel_name =
29      command_line->GetSwitchValueASCII(kDaemonPipeSwitchName);
30
31  if (channel_name.empty())
32    return kUsageExitCode;
33
34  base::MessageLoopForUI message_loop;
35  base::RunLoop run_loop;
36  scoped_refptr<AutoThreadTaskRunner> ui_task_runner =
37      new AutoThreadTaskRunner(message_loop.message_loop_proxy(),
38                               run_loop.QuitClosure());
39
40  // Launch the input thread.
41  scoped_refptr<AutoThreadTaskRunner> input_task_runner =
42      AutoThread::CreateWithType(
43          "Input thread", ui_task_runner, base::MessageLoop::TYPE_IO);
44
45  DesktopProcess desktop_process(ui_task_runner,
46                                 input_task_runner,
47                                 channel_name);
48
49  // Create a platform-dependent environment factory.
50  scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory;
51#if defined(OS_WIN)
52  desktop_environment_factory.reset(
53      new SessionDesktopEnvironmentFactory(
54          ui_task_runner,
55          input_task_runner,
56          ui_task_runner,
57          base::Bind(&DesktopProcess::InjectSas,
58                     desktop_process.AsWeakPtr())));
59#else  // !defined(OS_WIN)
60  desktop_environment_factory.reset(new Me2MeDesktopEnvironmentFactory(
61      ui_task_runner,
62      input_task_runner,
63      ui_task_runner));
64#endif  // !defined(OS_WIN)
65
66  if (!desktop_process.Start(desktop_environment_factory.Pass()))
67    return kInitializationFailed;
68
69  // Run the UI message loop.
70  ui_task_runner = NULL;
71  run_loop.Run();
72
73  return kSuccessExitCode;
74}
75
76}  // namespace remoting
77
78#if !defined(OS_WIN)
79int main(int argc, char** argv) {
80  return remoting::HostMain(argc, argv);
81}
82#endif  // !defined(OS_WIN)
83