Index: chrome/service/service_main.cc |
=================================================================== |
--- chrome/service/service_main.cc (revision 55524) |
+++ chrome/service/service_main.cc (working copy) |
@@ -11,6 +11,22 @@ |
#include "chrome/service/cloud_print/cloud_print_proxy.h" |
#include "chrome/service/service_process.h" |
+#if defined(ENABLE_REMOTING) |
+#include "remoting/host/json_host_config.h" |
+#include "remoting/host/chromoting_host.h" |
+#include "remoting/host/chromoting_host_context.h" |
+ |
+// This method is called as a signal that the Chromoting Host Process is |
+// shutting down because of failure or a request made by the user. |
+// We'll then post a task to |message_loop| to stop the chromoting host |
+// context to finish the final cleanup. |
+static void OnChromotingHostShutdown( |
+ MessageLoop* message_loop, remoting::ChromotingHostContext* context) { |
+ message_loop->PostTask(FROM_HERE, |
+ NewRunnableMethod(context, &remoting::ChromotingHostContext::Stop)); |
+} |
+#endif |
+ |
// Mainline routine for running as the service process. |
int ServiceProcessMain(const MainFunctionParams& parameters) { |
MessageLoopForUI main_message_loop; |
@@ -24,7 +40,7 @@ |
#endif // defined(OS_WIN) |
ServiceProcess service_process; |
- service_process.Initialize(&main_message_loop); |
+ service_process.Initialize(); |
// Enable Cloud Print if needed. |
if (parameters.command_line_.HasSwitch(switches::kEnableCloudPrintProxy)) { |
@@ -34,7 +50,47 @@ |
service_process.GetCloudPrintProxy()->EnableForUser(lsid); |
} |
+#if defined(ENABLE_REMOTING) |
+ // Enable Chromoting Host if needed. |
+ // TODO(hclam): Merge this config file with Cloud Printing. |
+ // TODO(hclam): There is only start but not stop of the chromoting host |
+ // process. |
+ FilePath user_data_dir; |
+ PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
+ FilePath chromoting_config_path = |
+ user_data_dir.Append(FILE_PATH_LITERAL(".ChromotingConfig.json")); |
+ scoped_refptr<remoting::JsonHostConfig> chromoting_config; |
+ scoped_ptr<remoting::ChromotingHostContext> chromoting_context; |
+ scoped_refptr<remoting::ChromotingHost> chromoting_host; |
+ if (parameters.command_line_.HasSwitch(switches::kEnableRemoting)) { |
+ chromoting_config = new remoting::JsonHostConfig( |
+ chromoting_config_path, |
+ service_process.file_thread()->message_loop_proxy()); |
+ if (!chromoting_config->Read()) { |
+ LOG(ERROR) << "Failed to read chromoting config file."; |
+ } else { |
+ chromoting_context.reset(new remoting::ChromotingHostContext()); |
+ |
+ // Create the Chromoting Host Process with the context and config. |
+ chromoting_host = service_process.CreateChromotingHost( |
+ chromoting_context.get(), chromoting_config); |
+ |
+ // And start the context and the host process. |
+ chromoting_context->Start(); |
+ |
+ // When ChromotingHost is shutdown because of failure or a request that |
+ // we made. ShutdownChromotingTask() is calls. |
+ // ShutdownChromotingTask() will then post a task to |
+ // |main_message_loop| to shutdown the chromoting context. |
+ chromoting_host->Start( |
+ NewRunnableFunction(&OnChromotingHostShutdown, |
+ &main_message_loop, chromoting_context.get())); |
+ } |
+ } |
+#endif |
+ |
MessageLoop::current()->Run(); |
service_process.Teardown(); |
+ |
return 0; |
} |