Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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, which is currently | 5 // This file implements a standalone host process for Me2Me, which is currently |
| 6 // used for the Linux-only Virtual Me2Me build. | 6 // used for the Linux-only Virtual Me2Me build. |
| 7 | 7 |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "crypto/nss_util.h" | 22 #include "crypto/nss_util.h" |
| 23 #include "remoting/base/constants.h" | 23 #include "remoting/base/constants.h" |
| 24 #include "remoting/host/capturer.h" | 24 #include "remoting/host/capturer.h" |
| 25 #include "remoting/host/chromoting_host.h" | 25 #include "remoting/host/chromoting_host.h" |
| 26 #include "remoting/host/chromoting_host_context.h" | 26 #include "remoting/host/chromoting_host_context.h" |
| 27 #include "remoting/host/desktop_environment.h" | 27 #include "remoting/host/desktop_environment.h" |
| 28 #include "remoting/host/event_executor.h" | 28 #include "remoting/host/event_executor.h" |
| 29 #include "remoting/host/heartbeat_sender.h" | 29 #include "remoting/host/heartbeat_sender.h" |
| 30 #include "remoting/host/host_config.h" | 30 #include "remoting/host/host_config.h" |
| 31 #include "remoting/host/json_host_config.h" | 31 #include "remoting/host/json_host_config.h" |
| 32 #include "remoting/jingle_glue/xmpp_signal_strategy.h" | |
| 32 | 33 |
| 33 #if defined(TOOLKIT_USES_GTK) | 34 #if defined(TOOLKIT_USES_GTK) |
| 34 #include "ui/gfx/gtk_util.h" | 35 #include "ui/gfx/gtk_util.h" |
| 35 #endif | 36 #endif |
| 36 | 37 |
| 37 namespace { | 38 namespace { |
| 38 // These are used for parsing the config-file locations from the command line, | 39 // These are used for parsing the config-file locations from the command line, |
| 39 // and for defining the default locations if the switches are not present. | 40 // and for defining the default locations if the switches are not present. |
| 40 const char kAuthConfigSwitchName[] = "auth-config"; | 41 const char kAuthConfigSwitchName[] = "auth-config"; |
| 41 const char kHostConfigSwitchName[] = "host-config"; | 42 const char kHostConfigSwitchName[] = "host-config"; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 context.Start(); | 85 context.Start(); |
| 85 | 86 |
| 86 base::Thread file_io_thread("FileIO"); | 87 base::Thread file_io_thread("FileIO"); |
| 87 file_io_thread.Start(); | 88 file_io_thread.Start(); |
| 88 | 89 |
| 89 if (!LoadConfig(file_io_thread.message_loop_proxy())) { | 90 if (!LoadConfig(file_io_thread.message_loop_proxy())) { |
| 90 context.Stop(); | 91 context.Stop(); |
| 91 return 1; | 92 return 1; |
| 92 } | 93 } |
| 93 | 94 |
| 95 | |
|
Wez
2012/01/03 16:25:04
nit: Lose extra newline?
Sergey Ulanov
2012/01/03 21:51:02
Done.
| |
| 96 // Use an XMPP connection to the Talk network for session signalling. | |
| 97 std::string xmpp_login; | |
| 98 std::string xmpp_auth_token; | |
| 99 if (!auth_config_->GetString(kXmppLoginConfigPath, &xmpp_login) || | |
| 100 !auth_config_->GetString(kXmppAuthTokenConfigPath, &xmpp_auth_token)) { | |
| 101 LOG(ERROR) << "XMPP credentials are not defined in the config."; | |
| 102 return 1; | |
| 103 } | |
| 104 | |
| 105 std::string xmpp_auth_service; | |
| 106 if (!auth_config_->GetString(remoting::kXmppAuthServiceConfigPath, | |
| 107 &xmpp_auth_service)) { | |
| 108 // For the me2me host, we assume we use the ClientLogin token for | |
| 109 // chromiumsync because we do not have an HTTP stack with which we can | |
| 110 // easily request an OAuth2 access token even if we had a RefreshToken for | |
| 111 // the account. | |
|
Wez
2012/01/03 16:25:04
Sorry, I'm not sure whether this comment belongs i
Sergey Ulanov
2012/01/03 21:51:02
It belongs inside because the if just tries to rea
| |
| 112 xmpp_auth_service = remoting::kChromotingTokenDefaultServiceName; | |
| 113 } | |
| 114 | |
| 115 // Create and start XMPP connection. | |
| 116 scoped_ptr<SignalStrategy> signal_strategy( | |
| 117 new XmppSignalStrategy(context.jingle_thread(), xmpp_login, | |
| 118 xmpp_auth_token, xmpp_auth_service)); | |
| 119 | |
| 94 // Create the DesktopEnvironment and ChromotingHost. | 120 // Create the DesktopEnvironment and ChromotingHost. |
| 95 scoped_ptr<DesktopEnvironment> desktop_environment( | 121 scoped_ptr<DesktopEnvironment> desktop_environment( |
| 96 DesktopEnvironment::Create(&context)); | 122 DesktopEnvironment::Create(&context)); |
| 97 | 123 |
| 98 host_ = ChromotingHost::Create( | 124 host_ = new ChromotingHost( |
| 99 &context, host_config_, desktop_environment.get(), false); | 125 &context, host_config_, signal_strategy.get(), |
| 126 desktop_environment.get(), false); | |
| 100 | 127 |
| 101 // Initialize HeartbeatSender. | 128 // Initialize HeartbeatSender. |
| 102 scoped_ptr<remoting::HeartbeatSender> heartbeat_sender( | 129 scoped_ptr<remoting::HeartbeatSender> heartbeat_sender( |
| 103 new remoting::HeartbeatSender(context.network_message_loop(), | 130 new remoting::HeartbeatSender()); |
| 104 host_config_)); | 131 if (!heartbeat_sender->Init(signal_strategy.get(), host_config_)) { |
| 105 if (!heartbeat_sender->Init()) { | |
| 106 context.Stop(); | 132 context.Stop(); |
| 107 return 1; | 133 return 1; |
| 108 } | 134 } |
| 109 host_->AddStatusObserver(heartbeat_sender.get()); | 135 |
| 136 // Post a task to start XMPP connection. | |
| 137 context.network_message_loop()->PostTask( | |
| 138 FROM_HERE, base::Bind(&remoting::SignalStrategy::Connect, | |
| 139 base::Unretained(signal_strategy.get()))); | |
| 110 | 140 |
| 111 // Run the ChromotingHost until the shutdown task is executed. | 141 // Run the ChromotingHost until the shutdown task is executed. |
| 112 host_->Start(); | 142 host_->Start(); |
| 113 | 143 |
| 114 // Set an empty shared-secret for Me2Me. | 144 // Set an empty shared-secret for Me2Me. |
| 115 // TODO(lambroslambrou): This is a temporary fix, pending a Me2Me-specific | 145 // TODO(lambroslambrou): This is a temporary fix, pending a Me2Me-specific |
| 116 // AuthenticatorFactory - crbug.com/105214. | 146 // AuthenticatorFactory - crbug.com/105214. |
| 117 context.network_message_loop()->PostTask( | 147 context.network_message_loop()->PostTask( |
| 118 FROM_HERE, base::Bind(&ChromotingHost::SetSharedSecret, host_.get(), | 148 FROM_HERE, base::Bind(&ChromotingHost::SetSharedSecret, host_.get(), |
| 119 "")); | 149 "")); |
| 120 | 150 |
| 121 message_loop.MessageLoop::Run(); | 151 message_loop.MessageLoop::Run(); |
| 122 | 152 |
| 123 // And then stop the chromoting context. | 153 // And then stop the chromoting context. |
| 124 context.Stop(); | 154 context.Stop(); |
| 125 file_io_thread.Stop(); | 155 file_io_thread.Stop(); |
| 126 | 156 |
| 127 host_ = NULL; | 157 host_ = NULL; |
| 128 | 158 |
| 129 return 0; | 159 return 0; |
| 130 } | 160 } |
| 131 | 161 |
| 132 private: | 162 private: |
| 133 // Read Host config from disk, returning true if successful. | 163 // Read Host config from disk, returning true if successful. |
| 134 bool LoadConfig(base::MessageLoopProxy* message_loop_proxy) { | 164 bool LoadConfig(base::MessageLoopProxy* message_loop_proxy) { |
| 135 host_config_ = | 165 host_config_ = |
| 136 new remoting::JsonHostConfig(host_config_path_, message_loop_proxy); | 166 new remoting::JsonHostConfig(host_config_path_, message_loop_proxy); |
| 137 scoped_refptr<remoting::JsonHostConfig> auth_config = | 167 auth_config_ = |
| 138 new remoting::JsonHostConfig(auth_config_path_, message_loop_proxy); | 168 new remoting::JsonHostConfig(auth_config_path_, message_loop_proxy); |
| 139 | 169 |
| 140 std::string failed_path; | 170 std::string failed_path; |
| 141 if (!host_config_->Read()) { | 171 if (!host_config_->Read()) { |
| 142 failed_path = host_config_path_.value(); | 172 failed_path = host_config_path_.value(); |
| 143 } else if (!auth_config->Read()) { | 173 } else if (!auth_config_->Read()) { |
| 144 failed_path = auth_config_path_.value(); | 174 failed_path = auth_config_path_.value(); |
| 145 } | 175 } |
| 146 if (!failed_path.empty()) { | 176 if (!failed_path.empty()) { |
| 147 LOG(ERROR) << "Failed to read configuration file " << failed_path; | 177 LOG(ERROR) << "Failed to read configuration file " << failed_path; |
| 148 return false; | 178 return false; |
| 149 } | 179 } |
| 150 | 180 |
| 151 // Copy the needed keys from |auth_config| into |host_config|. | |
| 152 std::string value; | |
| 153 auth_config->GetString(kXmppAuthTokenConfigPath, &value); | |
| 154 host_config_->SetString(kXmppAuthTokenConfigPath, value); | |
| 155 auth_config->GetString(kXmppLoginConfigPath, &value); | |
| 156 host_config_->SetString(kXmppLoginConfigPath, value); | |
| 157 | |
| 158 // For the Me2Me host, we assume we always use the ClientLogin token for | |
| 159 // chromiumsync because we do not have an HTTP stack with which we can | |
| 160 // easily request an OAuth2 access token even if we had a RefreshToken for | |
| 161 // the account. | |
| 162 host_config_->SetString(kXmppAuthServiceConfigPath, | |
| 163 kChromotingTokenDefaultServiceName); | |
| 164 return true; | 181 return true; |
| 165 } | 182 } |
| 166 | 183 |
| 167 FilePath auth_config_path_; | 184 FilePath auth_config_path_; |
| 168 FilePath host_config_path_; | 185 FilePath host_config_path_; |
| 169 | 186 |
| 187 scoped_refptr<remoting::JsonHostConfig> auth_config_; | |
| 170 scoped_refptr<remoting::JsonHostConfig> host_config_; | 188 scoped_refptr<remoting::JsonHostConfig> host_config_; |
| 171 | 189 |
| 172 scoped_refptr<ChromotingHost> host_; | 190 scoped_refptr<ChromotingHost> host_; |
| 173 }; | 191 }; |
| 174 | 192 |
| 175 } // namespace remoting | 193 } // namespace remoting |
| 176 | 194 |
| 177 int main(int argc, char** argv) { | 195 int main(int argc, char** argv) { |
| 178 CommandLine::Init(argc, argv); | 196 CommandLine::Init(argc, argv); |
| 179 | 197 |
| 180 // This object instance is required by Chrome code (for example, | 198 // This object instance is required by Chrome code (for example, |
| 181 // LazyInstance, MessageLoop). | 199 // LazyInstance, MessageLoop). |
| 182 base::AtExitManager exit_manager; | 200 base::AtExitManager exit_manager; |
| 183 | 201 |
| 184 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 202 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 185 | 203 |
| 186 #if defined(TOOLKIT_USES_GTK) | 204 #if defined(TOOLKIT_USES_GTK) |
| 187 // Required for any calls into GTK functions, such as the Disconnect and | 205 // Required for any calls into GTK functions, such as the Disconnect and |
| 188 // Continue windows, though these should not be used for the Me2Me case | 206 // Continue windows, though these should not be used for the Me2Me case |
| 189 // (crbug.com/104377). | 207 // (crbug.com/104377). |
| 190 gfx::GtkInitFromCommandLine(*cmd_line); | 208 gfx::GtkInitFromCommandLine(*cmd_line); |
| 191 #endif // TOOLKIT_USES_GTK | 209 #endif // TOOLKIT_USES_GTK |
| 192 | 210 |
| 193 remoting::HostProcess me2me_host; | 211 remoting::HostProcess me2me_host; |
| 194 me2me_host.InitWithCommandLine(cmd_line); | 212 me2me_host.InitWithCommandLine(cmd_line); |
| 195 | 213 |
| 196 return me2me_host.Run(); | 214 return me2me_host.Run(); |
| 197 } | 215 } |
| OLD | NEW |