• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 namespace remoting {
24 
DesktopProcessMain()25 int 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)
main(int argc,char ** argv)79 int main(int argc, char** argv) {
80   return remoting::HostMain(argc, argv);
81 }
82 #endif  // !defined(OS_WIN)
83