Home | History | Annotate | Download | only in host
      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 
     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)
     79 int main(int argc, char** argv) {
     80   return remoting::HostMain(argc, argv);
     81 }
     82 #endif  // !defined(OS_WIN)
     83