Chromium Code Reviews| Index: remoting/host/it2me/it2me_host.cc |
| diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc |
| index b9a17f8c9431b159fddbcd15a586eb438b315995..1ae4c696fb27a5d81d16e838b78d6959644e5b66 100644 |
| --- a/remoting/host/it2me/it2me_host.cc |
| +++ b/remoting/host/it2me/it2me_host.cc |
| @@ -6,7 +6,6 @@ |
| #include "base/bind.h" |
| #include "base/strings/string_util.h" |
| -#include "base/synchronization/waitable_event.h" |
| #include "base/threading/platform_thread.h" |
| #include "net/socket/client_socket_factory.h" |
| #include "remoting/base/auto_thread.h" |
| @@ -36,18 +35,19 @@ const int kMaxLoginAttempts = 5; |
| } // namespace |
| It2MeHost::It2MeHost( |
| - ChromotingHostContext* host_context, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| + scoped_ptr<ChromotingHostContext> host_context, |
| + scoped_ptr<policy_hack::PolicyWatcher> policy_watcher, |
| base::WeakPtr<It2MeHost::Observer> observer, |
| const XmppSignalStrategy::XmppServerConfig& xmpp_server_config, |
| const std::string& directory_bot_jid) |
| - : host_context_(host_context), |
| - task_runner_(task_runner), |
| + : host_context_(host_context.Pass()), |
| + task_runner_(host_context_->ui_task_runner()), |
| observer_(observer), |
| xmpp_server_config_(xmpp_server_config), |
| directory_bot_jid_(directory_bot_jid), |
| state_(kDisconnected), |
| failed_login_attempts_(0), |
| + policy_watcher_(policy_watcher.Pass()), |
| nat_traversal_enabled_(false), |
| policy_received_(false) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| @@ -67,10 +67,7 @@ void It2MeHost::Connect() { |
| host_context_->ui_task_runner())); |
| // Start monitoring configured policies. |
| - policy_watcher_.reset( |
| - policy_hack::PolicyWatcher::Create(host_context_->network_task_runner())); |
| - policy_watcher_->StartWatching( |
| - base::Bind(&It2MeHost::OnPolicyUpdate, this)); |
| + policy_watcher_->StartWatching(base::Bind(&It2MeHost::OnPolicyUpdate, this)); |
| // Switch to the network thread to start the actual connection. |
| host_context_->network_task_runner()->PostTask( |
| @@ -257,13 +254,16 @@ void It2MeHost::ShutdownOnUiThread() { |
| // Stop listening for policy updates. |
| if (policy_watcher_.get()) { |
| - base::WaitableEvent policy_watcher_stopped_(true, false); |
| - policy_watcher_->StopWatching(&policy_watcher_stopped_); |
| - policy_watcher_stopped_.Wait(); |
| - policy_watcher_.reset(); |
| + policy_watcher_->StopWatching( |
| + base::Bind(&It2MeHost::OnPolicyWatcherShutdown, this)); |
| + return; |
| } |
| } |
| +void It2MeHost::OnPolicyWatcherShutdown() { |
| + policy_watcher_.reset(); |
| +} |
| + |
| void It2MeHost::OnAccessDenied(const std::string& jid) { |
| DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| @@ -311,7 +311,14 @@ void It2MeHost::OnClientDisconnected(const std::string& jid) { |
| } |
| void It2MeHost::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { |
| - DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| + // The policy watcher runs on the |ui_task_runner| on ChromeOS and the |
| + // |network_task_runner| on other platforms. |
|
Wez
2014/10/29 18:27:51
That's just an implementation detail of the CrOS p
kelvinp
2014/10/29 22:20:17
Unfortunately, We can't. In ChromeOS, |task_runne
Wez
2014/10/30 01:08:59
No it isn't - it's still passed the network task r
|
| + if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { |
| + host_context_->network_task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&It2MeHost::OnPolicyUpdate, this, base::Passed(&policies))); |
| + return; |
| + } |
| bool nat_policy; |
| if (policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName, |
| @@ -459,18 +466,22 @@ void It2MeHost::OnReceivedSupportID( |
| SetState(kReceivedAccessCode); |
| } |
| -It2MeHostFactory::It2MeHostFactory() {} |
| +It2MeHostFactory::It2MeHostFactory(policy::PolicyService* policy_service) |
| + : policy_service_(policy_service) { |
| +} |
| It2MeHostFactory::~It2MeHostFactory() {} |
| scoped_refptr<It2MeHost> It2MeHostFactory::CreateIt2MeHost( |
| - ChromotingHostContext* context, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| + scoped_ptr<ChromotingHostContext> context, |
| base::WeakPtr<It2MeHost::Observer> observer, |
| const XmppSignalStrategy::XmppServerConfig& xmpp_server_config, |
| const std::string& directory_bot_jid) { |
| - return new It2MeHost( |
| - context, task_runner, observer, xmpp_server_config, directory_bot_jid); |
| + scoped_ptr<policy_hack::PolicyWatcher> policy_watcher = |
| + policy_hack::PolicyWatcher::Create(policy_service_, |
| + context->network_task_runner()); |
| + return new It2MeHost(context.Pass(), policy_watcher.Pass(), observer, |
| + xmpp_server_config, directory_bot_jid); |
| } |
| } // namespace remoting |