OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // This file implements a standalone host process for Me2Me. | 5 // This file implements a standalone host process for Me2Me. |
6 | 6 |
| 7 #include "remoting/host/remoting_me2me_host.h" |
| 8 |
7 #include <string> | 9 #include <string> |
8 | 10 |
9 #include "base/at_exit.h" | 11 #include "base/at_exit.h" |
10 #include "base/bind.h" | 12 #include "base/bind.h" |
11 #include "base/callback.h" | 13 #include "base/callback.h" |
12 #include "base/command_line.h" | 14 #include "base/command_line.h" |
13 #include "base/file_path.h" | 15 #include "base/file_path.h" |
14 #include "base/file_util.h" | 16 #include "base/file_util.h" |
| 17 #include "base/logging.h" |
15 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
16 #include "base/message_loop.h" | 19 #include "base/message_loop.h" |
17 #include "base/scoped_native_library.h" | 20 #include "base/scoped_native_library.h" |
18 #include "base/single_thread_task_runner.h" | 21 #include "base/single_thread_task_runner.h" |
19 #include "base/string_number_conversions.h" | 22 #include "base/string_number_conversions.h" |
20 #include "base/string_util.h" | 23 #include "base/string_util.h" |
21 #include "base/stringize_macros.h" | 24 #include "base/stringize_macros.h" |
22 #include "base/synchronization/waitable_event.h" | 25 #include "base/synchronization/waitable_event.h" |
23 #include "base/threading/thread.h" | 26 #include "base/threading/thread.h" |
24 #include "base/utf_string_conversions.h" | 27 #include "base/utf_string_conversions.h" |
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 NOTREACHED(); | 1032 NOTREACHED(); |
1030 } | 1033 } |
1031 } | 1034 } |
1032 | 1035 |
1033 void HostProcess::OnCrash(const std::string& function_name, | 1036 void HostProcess::OnCrash(const std::string& function_name, |
1034 const std::string& file_name, | 1037 const std::string& file_name, |
1035 const int& line_number) { | 1038 const int& line_number) { |
1036 CHECK(false); | 1039 CHECK(false); |
1037 } | 1040 } |
1038 | 1041 |
1039 } // namespace remoting | 1042 int HostProcessMain(int argc, char** argv) { |
1040 | |
1041 int main(int argc, char** argv) { | |
1042 #if defined(OS_MACOSX) | 1043 #if defined(OS_MACOSX) |
1043 // Needed so we don't leak objects when threads are created. | 1044 // Needed so we don't leak objects when threads are created. |
1044 base::mac::ScopedNSAutoreleasePool pool; | 1045 base::mac::ScopedNSAutoreleasePool pool; |
1045 #endif | 1046 #endif |
1046 | 1047 |
1047 CommandLine::Init(argc, argv); | 1048 CommandLine::Init(argc, argv); |
1048 | 1049 |
1049 // Initialize Breakpad as early as possible. On Windows, this happens in | 1050 // Initialize Breakpad as early as possible. On Mac the command-line needs to |
1050 // WinMain(), so it shouldn't also be done here. The command-line needs to be | 1051 // be initialized first, so that the preference for crash-reporting can be |
1051 // initialized first, so that the preference for crash-reporting can be looked | 1052 // looked up in the config file. |
1052 // up in the config file. | 1053 #if defined(OFFICIAL_BUILD) && (defined(MAC_BREAKPAD) || defined(OS_WIN)) |
1053 #if defined(MAC_BREAKPAD) | 1054 if (IsUsageStatsAllowed()) { |
1054 if (remoting::IsUsageStatsAllowed()) { | 1055 InitializeCrashReporting(); |
1055 remoting::InitializeCrashReporting(); | |
1056 } | 1056 } |
1057 #endif // MAC_BREAKPAD | 1057 #endif // defined(OFFICIAL_BUILD) && (defined(MAC_BREAKPAD) || defined(OS_WIN)) |
1058 | 1058 |
1059 // This object instance is required by Chrome code (for example, | 1059 // This object instance is required by Chrome code (for example, |
1060 // LazyInstance, MessageLoop). | 1060 // LazyInstance, MessageLoop). |
1061 base::AtExitManager exit_manager; | 1061 base::AtExitManager exit_manager; |
1062 | 1062 |
1063 if (CommandLine::ForCurrentProcess()->HasSwitch(kVersionSwitchName)) { | 1063 if (CommandLine::ForCurrentProcess()->HasSwitch(kVersionSwitchName)) { |
1064 printf("%s\n", STRINGIZE(VERSION)); | 1064 printf("%s\n", STRINGIZE(VERSION)); |
1065 return 0; | 1065 return 0; |
1066 } | 1066 } |
1067 | 1067 |
1068 remoting::InitHostLogging(); | 1068 InitHostLogging(); |
| 1069 |
| 1070 #if defined(OS_WIN) |
| 1071 // Register and initialize common controls. |
| 1072 INITCOMMONCONTROLSEX info; |
| 1073 info.dwSize = sizeof(info); |
| 1074 info.dwICC = ICC_STANDARD_CLASSES; |
| 1075 InitCommonControlsEx(&info); |
| 1076 |
| 1077 // Mark the process as DPI-aware, so Windows won't scale coordinates in APIs. |
| 1078 // N.B. This API exists on Vista and above. |
| 1079 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { |
| 1080 FilePath path(base::GetNativeLibraryName(UTF8ToUTF16("user32"))); |
| 1081 base::ScopedNativeLibrary user32(path); |
| 1082 CHECK(user32.is_valid()); |
| 1083 |
| 1084 typedef BOOL (WINAPI * SetProcessDPIAwareFn)(); |
| 1085 SetProcessDPIAwareFn set_process_dpi_aware = |
| 1086 static_cast<SetProcessDPIAwareFn>( |
| 1087 user32.GetFunctionPointer("SetProcessDPIAware")); |
| 1088 set_process_dpi_aware(); |
| 1089 } |
| 1090 #endif // defined(OS_WIN) |
1069 | 1091 |
1070 #if defined(TOOLKIT_GTK) | 1092 #if defined(TOOLKIT_GTK) |
1071 // Required for any calls into GTK functions, such as the Disconnect and | 1093 // Required for any calls into GTK functions, such as the Disconnect and |
1072 // Continue windows, though these should not be used for the Me2Me case | 1094 // Continue windows, though these should not be used for the Me2Me case |
1073 // (crbug.com/104377). | 1095 // (crbug.com/104377). |
1074 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 1096 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
1075 gfx::GtkInitFromCommandLine(*cmd_line); | 1097 gfx::GtkInitFromCommandLine(*cmd_line); |
1076 #endif // TOOLKIT_GTK | 1098 #endif // TOOLKIT_GTK |
1077 | 1099 |
1078 // Enable support for SSL server sockets, which must be done while still | 1100 // Enable support for SSL server sockets, which must be done while still |
1079 // single-threaded. | 1101 // single-threaded. |
1080 net::EnableSSLServerSockets(); | 1102 net::EnableSSLServerSockets(); |
1081 | 1103 |
1082 // Create the main message loop and start helper threads. | 1104 // Create the main message loop and start helper threads. |
1083 MessageLoop message_loop(MessageLoop::TYPE_UI); | 1105 MessageLoop message_loop(MessageLoop::TYPE_UI); |
1084 scoped_ptr<remoting::ChromotingHostContext> context = | 1106 scoped_ptr<ChromotingHostContext> context = |
1085 remoting::ChromotingHostContext::Create( | 1107 ChromotingHostContext::Create( |
1086 new remoting::AutoThreadTaskRunner(message_loop.message_loop_proxy(), | 1108 new AutoThreadTaskRunner(message_loop.message_loop_proxy(), |
1087 MessageLoop::QuitClosure())); | 1109 MessageLoop::QuitClosure())); |
1088 if (!context) | 1110 if (!context) |
1089 return remoting::kInitializationFailed; | 1111 return kInitializationFailed; |
1090 | 1112 |
1091 // Create & start the HostProcess using these threads. | 1113 // Create & start the HostProcess using these threads. |
1092 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). | 1114 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). |
1093 // Remove this hack as part of the multi-process refactoring. | 1115 // Remove this hack as part of the multi-process refactoring. |
1094 int exit_code = remoting::kSuccessExitCode; | 1116 int exit_code = kSuccessExitCode; |
1095 new remoting::HostProcess(context.Pass(), &exit_code); | 1117 new HostProcess(context.Pass(), &exit_code); |
1096 | 1118 |
1097 // Run the main (also UI) message loop until the host no longer needs it. | 1119 // Run the main (also UI) message loop until the host no longer needs it. |
1098 message_loop.Run(); | 1120 message_loop.Run(); |
1099 | 1121 |
1100 return exit_code; | 1122 return exit_code; |
1101 } | 1123 } |
1102 | 1124 |
1103 #if defined(OS_WIN) | 1125 } // namespace remoting |
1104 HMODULE g_hModule = NULL; | |
1105 | 1126 |
1106 int CALLBACK WinMain(HINSTANCE instance, | 1127 #if !defined(OS_WIN) |
1107 HINSTANCE previous_instance, | 1128 int main(int argc, char** argv) { |
1108 LPSTR command_line, | 1129 return remoting::HostProcessMain(argc, argv); |
1109 int show_command) { | |
1110 #if defined(OFFICIAL_BUILD) | |
1111 if (remoting::IsUsageStatsAllowed()) { | |
1112 remoting::InitializeCrashReporting(); | |
1113 } | |
1114 #endif // OFFICIAL_BUILD | |
1115 | |
1116 g_hModule = instance; | |
1117 | |
1118 // Register and initialize common controls. | |
1119 INITCOMMONCONTROLSEX info; | |
1120 info.dwSize = sizeof(info); | |
1121 info.dwICC = ICC_STANDARD_CLASSES; | |
1122 InitCommonControlsEx(&info); | |
1123 | |
1124 // Mark the process as DPI-aware, so Windows won't scale coordinates in APIs. | |
1125 // N.B. This API exists on Vista and above. | |
1126 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { | |
1127 FilePath path(base::GetNativeLibraryName(UTF8ToUTF16("user32"))); | |
1128 base::ScopedNativeLibrary user32(path); | |
1129 CHECK(user32.is_valid()); | |
1130 | |
1131 typedef BOOL (WINAPI * SetProcessDPIAwareFn)(); | |
1132 SetProcessDPIAwareFn set_process_dpi_aware = | |
1133 static_cast<SetProcessDPIAwareFn>( | |
1134 user32.GetFunctionPointer("SetProcessDPIAware")); | |
1135 set_process_dpi_aware(); | |
1136 } | |
1137 | |
1138 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting | |
1139 // the command line from GetCommandLineW(), so we can safely pass NULL here. | |
1140 return main(0, NULL); | |
1141 } | 1130 } |
1142 | 1131 #endif // !defined(OS_WIN) |
1143 #endif // defined(OS_WIN) | |
OLD | NEW |