Index: remoting/host/simple_host_process.cc |
diff --git a/remoting/host/simple_host_process.cc b/remoting/host/simple_host_process.cc |
index 3ab83eeabee0bdd9647efad5a8f3331a5fcb9153..edef62078a410e6226d977e99223d71fae06d0cb 100644 |
--- a/remoting/host/simple_host_process.cc |
+++ b/remoting/host/simple_host_process.cc |
@@ -42,6 +42,7 @@ |
#include "remoting/host/log_to_server.h" |
#include "remoting/host/json_host_config.h" |
#include "remoting/host/register_support_host_request.h" |
+#include "remoting/jingle_glue/xmpp_signal_strategy.h" |
#include "remoting/proto/video.pb.h" |
#if defined(TOOLKIT_USES_GTK) |
@@ -56,8 +57,6 @@ HMODULE g_hModule = NULL; |
using remoting::ChromotingHost; |
using remoting::DesktopEnvironment; |
-using remoting::kChromotingTokenDefaultServiceName; |
-using remoting::kXmppAuthServiceConfigPath; |
using remoting::It2MeHostUserInterface; |
using remoting::protocol::CandidateSessionConfig; |
using remoting::protocol::ChannelConfig; |
@@ -98,10 +97,6 @@ class SimpleHost { |
// It needs to be a UI message loop to keep runloops spinning on the Mac. |
MessageLoop message_loop(MessageLoop::TYPE_UI); |
- remoting::ChromotingHostContext context( |
- base::MessageLoopProxy::current()); |
- context.Start(); |
- |
base::Thread file_io_thread("FileIO"); |
file_io_thread.Start(); |
@@ -112,36 +107,37 @@ class SimpleHost { |
if (!config->Read()) { |
LOG(ERROR) << "Failed to read configuration file " |
<< config_path.value(); |
- context.Stop(); |
return 1; |
} |
- // For the simple host, we assume we always use the ClientLogin token for |
- // chromiumsync because we do not have an HTTP stack with which we can |
- // easily request an OAuth2 access token even if we had a RefreshToken for |
- // the account. |
- config->SetString(kXmppAuthServiceConfigPath, |
- kChromotingTokenDefaultServiceName); |
- |
- // Initialize AccessVerifier. |
- // TODO(jamiewalch): For the IT2Me case, the access verifier is passed to |
- // RegisterSupportHostRequest::Init, so transferring ownership of it to the |
- // ChromotingHost could cause a crash condition if SetIT2MeAccessCode is |
- // called after the ChromotingHost is destroyed (for example, at shutdown). |
- // Fix this. |
- scoped_ptr<remoting::RegisterSupportHostRequest> register_request; |
- scoped_ptr<remoting::HeartbeatSender> heartbeat_sender; |
- scoped_ptr<remoting::LogToServer> log_to_server; |
- if (is_it2me_) { |
- register_request.reset(new remoting::RegisterSupportHostRequest()); |
- if (!register_request->Init( |
- config, base::Bind(&SimpleHost::SetIT2MeAccessCode, |
- base::Unretained(this)))) { |
- return 1; |
- } |
+ remoting::ChromotingHostContext context( |
+ base::MessageLoopProxy::current()); |
+ context.Start(); |
+ |
+ // Use an XMPP connection to the Talk network for session signalling. |
+ std::string xmpp_login; |
+ std::string xmpp_auth_token; |
+ if (!config->GetString(remoting::kXmppLoginConfigPath, &xmpp_login) || |
+ !config->GetString(remoting::kXmppAuthTokenConfigPath, |
+ &xmpp_auth_token)) { |
+ LOG(ERROR) << "XMPP credentials are not defined in the config."; |
+ return 1; |
+ } |
+ std::string xmpp_auth_service; |
+ if (!config->GetString(remoting::kXmppAuthServiceConfigPath, |
+ &xmpp_auth_service)) { |
+ // For the simple host, we assume we always use the ClientLogin token for |
+ // chromiumsync because we do not have an HTTP stack with which we can |
+ // easily request an OAuth2 access token even if we had a RefreshToken for |
+ // the account. |
+ xmpp_auth_service = remoting::kChromotingTokenDefaultServiceName; |
} |
- log_to_server.reset(new remoting::LogToServer( |
- context.network_message_loop())); |
+ |
+ // Create and start XMPP connection. |
+ scoped_ptr<remoting::SignalStrategy> signal_strategy( |
+ new remoting::XmppSignalStrategy(context.jingle_thread(), xmpp_login, |
+ xmpp_auth_token, xmpp_auth_service)); |
+ |
// Construct a chromoting host. |
scoped_ptr<DesktopEnvironment> desktop_environment; |
@@ -157,10 +153,14 @@ class SimpleHost { |
desktop_environment.reset(DesktopEnvironment::Create(&context)); |
} |
- host_ = ChromotingHost::Create( |
- &context, config, desktop_environment.get(), false); |
+ host_ = new ChromotingHost(&context, config, signal_strategy.get(), |
+ desktop_environment.get(), false); |
host_->set_it2me(is_it2me_); |
+ scoped_ptr<remoting::LogToServer> log_to_server; |
+ log_to_server.reset(new remoting::LogToServer(signal_strategy.get())); |
+ host_->AddStatusObserver(log_to_server.get()); |
+ |
scoped_ptr<It2MeHostUserInterface> it2me_host_user_interface; |
if (is_it2me_) { |
it2me_host_user_interface.reset(new It2MeHostUserInterface(host_, |
@@ -173,18 +173,27 @@ class SimpleHost { |
host_->set_protocol_config(protocol_config_.release()); |
} |
+ scoped_ptr<remoting::RegisterSupportHostRequest> register_request; |
+ scoped_ptr<remoting::HeartbeatSender> heartbeat_sender; |
if (is_it2me_) { |
- host_->AddStatusObserver(register_request.get()); |
+ register_request.reset(new remoting::RegisterSupportHostRequest()); |
+ if (!register_request->Init(signal_strategy.get(), config, |
+ base::Bind(&SimpleHost::SetIT2MeAccessCode, |
+ base::Unretained(this)))) { |
+ return 1; |
+ } |
} else { |
// Initialize HeartbeatSender. |
heartbeat_sender.reset( |
- new remoting::HeartbeatSender(context.network_message_loop(), |
- config)); |
- if (!heartbeat_sender->Init()) |
+ new remoting::HeartbeatSender()); |
+ if (!heartbeat_sender->Init(signal_strategy.get(), config)) |
return 1; |
- host_->AddStatusObserver(heartbeat_sender.get()); |
} |
- host_->AddStatusObserver(log_to_server.get()); |
+ |
+ // Post a task to start XMPP connection. |
+ context.network_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&remoting::SignalStrategy::Connect, |
+ base::Unretained(signal_strategy.get()))); |
// Let the chromoting host run until the shutdown task is executed. |
host_->Start(); |