| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // This file implements the Windows service controlling Me2Me host processes |
| // running within user sessions. |
| |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/command_line.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/run_loop.h" |
| #include "remoting/base/auto_thread.h" |
| #include "remoting/base/auto_thread_task_runner.h" |
| #include "remoting/host/desktop_process.h" |
| #include "remoting/host/host_exit_codes.h" |
| #include "remoting/host/host_main.h" |
| #include "remoting/host/ipc_constants.h" |
| #include "remoting/host/me2me_desktop_environment.h" |
| #include "remoting/host/win/session_desktop_environment.h" |
| |
| namespace remoting { |
| |
| int DesktopProcessMain() { |
| const base::CommandLine* command_line = |
| base::CommandLine::ForCurrentProcess(); |
| std::string channel_name = |
| command_line->GetSwitchValueASCII(kDaemonPipeSwitchName); |
| |
| if (channel_name.empty()) |
| return kUsageExitCode; |
| |
| base::MessageLoopForUI message_loop; |
| base::RunLoop run_loop; |
| scoped_refptr<AutoThreadTaskRunner> ui_task_runner = |
| new AutoThreadTaskRunner(message_loop.message_loop_proxy(), |
| run_loop.QuitClosure()); |
| |
| // Launch the input thread. |
| scoped_refptr<AutoThreadTaskRunner> input_task_runner = |
| AutoThread::CreateWithType( |
| "Input thread", ui_task_runner, base::MessageLoop::TYPE_IO); |
| |
| DesktopProcess desktop_process(ui_task_runner, |
| input_task_runner, |
| channel_name); |
| |
| // Create a platform-dependent environment factory. |
| scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory; |
| #if defined(OS_WIN) |
| desktop_environment_factory.reset( |
| new SessionDesktopEnvironmentFactory( |
| ui_task_runner, |
| input_task_runner, |
| ui_task_runner, |
| base::Bind(&DesktopProcess::InjectSas, |
| desktop_process.AsWeakPtr()))); |
| #else // !defined(OS_WIN) |
| desktop_environment_factory.reset(new Me2MeDesktopEnvironmentFactory( |
| ui_task_runner, |
| input_task_runner, |
| ui_task_runner)); |
| #endif // !defined(OS_WIN) |
| |
| if (!desktop_process.Start(desktop_environment_factory.Pass())) |
| return kInitializationFailed; |
| |
| // Run the UI message loop. |
| ui_task_runner = nullptr; |
| run_loop.Run(); |
| |
| return kSuccessExitCode; |
| } |
| |
| } // namespace remoting |
| |
| #if !defined(OS_WIN) |
| int main(int argc, char** argv) { |
| return remoting::HostMain(argc, argv); |
| } |
| #endif // !defined(OS_WIN) |