Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Unified Diff: remoting/host/chromoting_host.cc

Issue 3305001: Move decoder into separate thread, clean up API layering, and redo update protocl (Closed)
Patch Set: Fix compile error. Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/chromoting_host.h ('k') | remoting/host/chromoting_host_context.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/chromoting_host.cc
diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc
index 740f0f6a2ec38d63dc7e10a9a6e9cde96a134de3..656327fb37f408f6b88e8325a3242a83c906f252 100644
--- a/remoting/host/chromoting_host.cc
+++ b/remoting/host/chromoting_host.cc
@@ -36,21 +36,94 @@ ChromotingHost::~ChromotingHost() {
}
void ChromotingHost::Start(Task* shutdown_task) {
+ if (MessageLoop::current() != context_->main_message_loop()) {
+ context_->main_message_loop()->PostTask(
+ FROM_HERE,
+ NewRunnableMethod(this, &ChromotingHost::Start, shutdown_task));
+ return;
+ }
+
+ DCHECK(!jingle_client_);
+ DCHECK(shutdown_task);
+
+ // Make sure this object is not started.
+ {
+ AutoLock auto_lock(lock_);
+ if (state_ != kInitial)
+ return;
+ state_ = kStarted;
+ }
+
// Get capturer to set up it's initial configuration.
capturer_->ScreenConfigurationChanged();
- // Submit a task to perform host registration. We'll also start
- // listening to connection if registration is done.
- context_->main_message_loop()->PostTask(
- FROM_HERE,
- NewRunnableMethod(this, &ChromotingHost::DoStart, shutdown_task));
+ // Save the shutdown task.
+ shutdown_task_.reset(shutdown_task);
+
+ std::string xmpp_login;
+ std::string xmpp_auth_token;
+ if (!config_->GetString(kXmppLoginConfigPath, &xmpp_login) ||
+ !config_->GetString(kXmppAuthTokenConfigPath, &xmpp_auth_token)) {
+ LOG(ERROR) << "XMPP credentials are not defined in config.";
+ return;
+ }
+
+ access_verifier_.Init(config_);
+
+ // Connect to the talk network with a JingleClient.
+ jingle_client_ = new JingleClient(context_->jingle_thread());
+ jingle_client_->Init(xmpp_login, xmpp_auth_token,
+ kChromotingTokenServiceName, this);
+
+ heartbeat_sender_ = new HeartbeatSender();
+ if (!heartbeat_sender_->Init(config_, jingle_client_.get())) {
+ LOG(ERROR) << "Failed to initialize HeartbeatSender.";
+ return;
+ }
}
// This method is called when we need to destroy the host process.
void ChromotingHost::Shutdown() {
- context_->main_message_loop()->PostTask(
- FROM_HERE,
- NewRunnableMethod(this, &ChromotingHost::DoShutdown));
+ if (MessageLoop::current() != context_->main_message_loop()) {
+ context_->main_message_loop()->PostTask(
+ FROM_HERE,
+ NewRunnableMethod(this, &ChromotingHost::Shutdown));
+ return;
+ }
+
+ // No-op if this object is not started yet.
+ {
+ AutoLock auto_lock(lock_);
+ if (state_ != kStarted)
+ return;
+ state_ = kStopped;
+ }
+
+ // Tell the session to pause and then disconnect all clients.
+ if (session_.get()) {
+ session_->Pause();
+ session_->RemoveAllClients();
+ }
+
+ // Disconnect all clients.
+ if (client_) {
+ client_->Disconnect();
+ }
+
+ // Disconnect from the talk network.
+ if (jingle_client_) {
+ jingle_client_->Close();
+ }
+
+ // Stop the heartbeat sender.
+ if (heartbeat_sender_) {
+ heartbeat_sender_->Stop();
+ }
+
+ // Lastly call the shutdown task.
+ if (shutdown_task_.get()) {
+ shutdown_task_->Run();
+ }
}
// This method is called if a client is connected to this object.
@@ -147,9 +220,7 @@ void ChromotingHost::OnStateChange(JingleClient* jingle_client,
// TODO(sergeyu): We should try reconnecting here instead of terminating
// the host.
- // Post a shutdown task to properly shutdown the chromoting host.
- context_->main_message_loop()->PostTask(
- FROM_HERE, NewRunnableMethod(this, &ChromotingHost::DoShutdown));
+ Shutdown();
}
}
@@ -194,81 +265,4 @@ void ChromotingHost::OnNewConnection(JingleClient* jingle_client,
client_->set_jingle_channel(channel);
}
-void ChromotingHost::DoStart(Task* shutdown_task) {
- DCHECK_EQ(context_->main_message_loop(), MessageLoop::current());
- DCHECK(!jingle_client_);
- DCHECK(shutdown_task);
-
- // Make sure this object is not started.
- {
- AutoLock auto_lock(lock_);
- if (state_ != kInitial)
- return;
- state_ = kStarted;
- }
-
- // Save the shutdown task.
- shutdown_task_.reset(shutdown_task);
-
- std::string xmpp_login;
- std::string xmpp_auth_token;
- if (!config_->GetString(kXmppLoginConfigPath, &xmpp_login) ||
- !config_->GetString(kXmppAuthTokenConfigPath, &xmpp_auth_token)) {
- LOG(ERROR) << "XMPP credentials are not defined in the config.";
- return;
- }
-
- if (!access_verifier_.Init(config_))
- return;
-
- // Connect to the talk network with a JingleClient.
- jingle_client_ = new JingleClient(context_->jingle_thread());
- jingle_client_->Init(xmpp_login, xmpp_auth_token,
- kChromotingTokenServiceName, this);
-
- heartbeat_sender_ = new HeartbeatSender();
- if (!heartbeat_sender_->Init(config_, jingle_client_.get())) {
- LOG(ERROR) << "Failed to initialize HeartbeatSender.";
- return;
- }
-}
-
-void ChromotingHost::DoShutdown() {
- DCHECK_EQ(context_->main_message_loop(), MessageLoop::current());
-
- // No-op if this object is not started yet.
- {
- AutoLock auto_lock(lock_);
- if (state_ != kStarted)
- return;
- state_ = kStopped;
- }
-
- // Tell the session to pause and then disconnect all clients.
- if (session_.get()) {
- session_->Pause();
- session_->RemoveAllClients();
- }
-
- // Disconnect all clients.
- if (client_) {
- client_->Disconnect();
- }
-
- // Disconnect from the talk network.
- if (jingle_client_) {
- jingle_client_->Close();
- }
-
- // Stop the heartbeat sender.
- if (heartbeat_sender_) {
- heartbeat_sender_->Stop();
- }
-
- // Lastly call the shutdown task.
- if (shutdown_task_.get()) {
- shutdown_task_->Run();
- }
-}
-
} // namespace remoting
« no previous file with comments | « remoting/host/chromoting_host.h ('k') | remoting/host/chromoting_host_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698