| 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 #include "remoting/host/signaling_connector.h" | 5 #include "remoting/host/signaling_connector.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 reconnect_attempts_(0) { | 53 reconnect_attempts_(0) { |
| 54 DCHECK(!auth_failed_callback_.is_null()); | 54 DCHECK(!auth_failed_callback_.is_null()); |
| 55 DCHECK(dns_blackhole_checker_.get()); | 55 DCHECK(dns_blackhole_checker_.get()); |
| 56 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | 56 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 57 net::NetworkChangeNotifier::AddIPAddressObserver(this); | 57 net::NetworkChangeNotifier::AddIPAddressObserver(this); |
| 58 signal_strategy_->AddListener(this); | 58 signal_strategy_->AddListener(this); |
| 59 ScheduleTryReconnect(); | 59 ScheduleTryReconnect(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 SignalingConnector::~SignalingConnector() { | 62 SignalingConnector::~SignalingConnector() { |
| 63 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 63 signal_strategy_->RemoveListener(this); | 64 signal_strategy_->RemoveListener(this); |
| 64 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | 65 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
| 65 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); | 66 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| 66 } | 67 } |
| 67 | 68 |
| 68 void SignalingConnector::OnSignalStrategyStateChange( | 69 void SignalingConnector::OnSignalStrategyStateChange( |
| 69 SignalStrategy::State state) { | 70 SignalStrategy::State state) { |
| 70 DCHECK(CalledOnValidThread()); | 71 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 71 | 72 |
| 72 if (state == SignalStrategy::CONNECTED) { | 73 if (state == SignalStrategy::CONNECTED) { |
| 73 HOST_LOG << "Signaling connected. New JID: " | 74 HOST_LOG << "Signaling connected. New JID: " |
| 74 << signal_strategy_->GetLocalAddress().jid(); | 75 << signal_strategy_->GetLocalAddress().jid(); |
| 75 reconnect_attempts_ = 0; | 76 reconnect_attempts_ = 0; |
| 76 } else if (state == SignalStrategy::DISCONNECTED) { | 77 } else if (state == SignalStrategy::DISCONNECTED) { |
| 77 HOST_LOG << "Signaling disconnected. error=" | 78 HOST_LOG << "Signaling disconnected. error=" |
| 78 << SignalStrategyErrorToString(signal_strategy_->GetError()); | 79 << SignalStrategyErrorToString(signal_strategy_->GetError()); |
| 79 reconnect_attempts_++; | 80 reconnect_attempts_++; |
| 80 | 81 |
| 81 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) | 82 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) |
| 82 oauth_token_getter_->InvalidateCache(); | 83 oauth_token_getter_->InvalidateCache(); |
| 83 | 84 |
| 84 ScheduleTryReconnect(); | 85 ScheduleTryReconnect(); |
| 85 } | 86 } |
| 86 } | 87 } |
| 87 | 88 |
| 88 bool SignalingConnector::OnSignalStrategyIncomingStanza( | 89 bool SignalingConnector::OnSignalStrategyIncomingStanza( |
| 89 const buzz::XmlElement* stanza) { | 90 const buzz::XmlElement* stanza) { |
| 90 return false; | 91 return false; |
| 91 } | 92 } |
| 92 | 93 |
| 93 void SignalingConnector::OnConnectionTypeChanged( | 94 void SignalingConnector::OnConnectionTypeChanged( |
| 94 net::NetworkChangeNotifier::ConnectionType type) { | 95 net::NetworkChangeNotifier::ConnectionType type) { |
| 95 DCHECK(CalledOnValidThread()); | 96 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 96 if (type != net::NetworkChangeNotifier::CONNECTION_NONE && | 97 if (type != net::NetworkChangeNotifier::CONNECTION_NONE && |
| 97 signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { | 98 signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { |
| 98 HOST_LOG << "Network state changed to online."; | 99 HOST_LOG << "Network state changed to online."; |
| 99 ResetAndTryReconnect(); | 100 ResetAndTryReconnect(); |
| 100 } | 101 } |
| 101 } | 102 } |
| 102 | 103 |
| 103 void SignalingConnector::OnIPAddressChanged() { | 104 void SignalingConnector::OnIPAddressChanged() { |
| 104 DCHECK(CalledOnValidThread()); | 105 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 105 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { | 106 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { |
| 106 HOST_LOG << "IP address has changed."; | 107 HOST_LOG << "IP address has changed."; |
| 107 ResetAndTryReconnect(); | 108 ResetAndTryReconnect(); |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 void SignalingConnector::OnAccessToken(OAuthTokenGetter::Status status, | 112 void SignalingConnector::OnAccessToken(OAuthTokenGetter::Status status, |
| 112 const std::string& user_email, | 113 const std::string& user_email, |
| 113 const std::string& access_token) { | 114 const std::string& access_token) { |
| 114 DCHECK(CalledOnValidThread()); | 115 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 115 | 116 |
| 116 if (status == OAuthTokenGetter::AUTH_ERROR) { | 117 if (status == OAuthTokenGetter::AUTH_ERROR) { |
| 117 auth_failed_callback_.Run(); | 118 auth_failed_callback_.Run(); |
| 118 return; | 119 return; |
| 119 } else if (status == OAuthTokenGetter::NETWORK_ERROR) { | 120 } else if (status == OAuthTokenGetter::NETWORK_ERROR) { |
| 120 OnNetworkError(); | 121 OnNetworkError(); |
| 121 return; | 122 return; |
| 122 } | 123 } |
| 123 | 124 |
| 124 DCHECK_EQ(status, OAuthTokenGetter::SUCCESS); | 125 DCHECK_EQ(status, OAuthTokenGetter::SUCCESS); |
| 125 HOST_LOG << "Received user info."; | 126 HOST_LOG << "Received user info."; |
| 126 | 127 |
| 127 signal_strategy_->SetAuthInfo(user_email, access_token); | 128 signal_strategy_->SetAuthInfo(user_email, access_token); |
| 128 | 129 |
| 129 // Now that we've refreshed the token and verified that it's for the correct | 130 // Now that we've refreshed the token and verified that it's for the correct |
| 130 // user account, try to connect using the new token. | 131 // user account, try to connect using the new token. |
| 131 DCHECK_EQ(signal_strategy_->GetState(), SignalStrategy::DISCONNECTED); | 132 DCHECK_EQ(signal_strategy_->GetState(), SignalStrategy::DISCONNECTED); |
| 132 signal_strategy_->Connect(); | 133 signal_strategy_->Connect(); |
| 133 } | 134 } |
| 134 | 135 |
| 135 void SignalingConnector::OnNetworkError() { | 136 void SignalingConnector::OnNetworkError() { |
| 136 DCHECK(CalledOnValidThread()); | 137 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 137 reconnect_attempts_++; | 138 reconnect_attempts_++; |
| 138 ScheduleTryReconnect(); | 139 ScheduleTryReconnect(); |
| 139 } | 140 } |
| 140 | 141 |
| 141 void SignalingConnector::ScheduleTryReconnect() { | 142 void SignalingConnector::ScheduleTryReconnect() { |
| 142 DCHECK(CalledOnValidThread()); | 143 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 143 if (timer_.IsRunning() || net::NetworkChangeNotifier::IsOffline()) | 144 if (timer_.IsRunning() || net::NetworkChangeNotifier::IsOffline()) |
| 144 return; | 145 return; |
| 145 int delay_s = std::min(1 << reconnect_attempts_, | 146 int delay_s = std::min(1 << reconnect_attempts_, |
| 146 kMaxReconnectDelaySeconds); | 147 kMaxReconnectDelaySeconds); |
| 147 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay_s), | 148 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay_s), |
| 148 this, &SignalingConnector::TryReconnect); | 149 this, &SignalingConnector::TryReconnect); |
| 149 } | 150 } |
| 150 | 151 |
| 151 void SignalingConnector::ResetAndTryReconnect() { | 152 void SignalingConnector::ResetAndTryReconnect() { |
| 152 DCHECK(CalledOnValidThread()); | 153 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 153 signal_strategy_->Disconnect(); | 154 signal_strategy_->Disconnect(); |
| 154 reconnect_attempts_ = 0; | 155 reconnect_attempts_ = 0; |
| 155 timer_.Stop(); | 156 timer_.Stop(); |
| 156 ScheduleTryReconnect(); | 157 ScheduleTryReconnect(); |
| 157 } | 158 } |
| 158 | 159 |
| 159 void SignalingConnector::TryReconnect() { | 160 void SignalingConnector::TryReconnect() { |
| 160 DCHECK(CalledOnValidThread()); | 161 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 161 DCHECK(dns_blackhole_checker_.get()); | 162 DCHECK(dns_blackhole_checker_.get()); |
| 162 | 163 |
| 163 // This will check if this machine is allowed to access the chromoting | 164 // This will check if this machine is allowed to access the chromoting |
| 164 // host talkgadget. | 165 // host talkgadget. |
| 165 dns_blackhole_checker_->CheckForDnsBlackhole( | 166 dns_blackhole_checker_->CheckForDnsBlackhole( |
| 166 base::Bind(&SignalingConnector::OnDnsBlackholeCheckerDone, | 167 base::Bind(&SignalingConnector::OnDnsBlackholeCheckerDone, |
| 167 base::Unretained(this))); | 168 base::Unretained(this))); |
| 168 } | 169 } |
| 169 | 170 |
| 170 void SignalingConnector::OnDnsBlackholeCheckerDone(bool allow) { | 171 void SignalingConnector::OnDnsBlackholeCheckerDone(bool allow) { |
| 171 DCHECK(CalledOnValidThread()); | 172 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 172 | 173 |
| 173 // Unable to access the host talkgadget. Don't allow the connection, but | 174 // Unable to access the host talkgadget. Don't allow the connection, but |
| 174 // schedule a reconnect in case this is a transient problem rather than | 175 // schedule a reconnect in case this is a transient problem rather than |
| 175 // an outright block. | 176 // an outright block. |
| 176 if (!allow) { | 177 if (!allow) { |
| 177 reconnect_attempts_++; | 178 reconnect_attempts_++; |
| 178 HOST_LOG << "Talkgadget check failed. Scheduling reconnect. Attempt " | 179 HOST_LOG << "Talkgadget check failed. Scheduling reconnect. Attempt " |
| 179 << reconnect_attempts_; | 180 << reconnect_attempts_; |
| 180 ScheduleTryReconnect(); | 181 ScheduleTryReconnect(); |
| 181 return; | 182 return; |
| 182 } | 183 } |
| 183 | 184 |
| 184 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { | 185 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { |
| 185 HOST_LOG << "Attempting to connect signaling."; | 186 HOST_LOG << "Attempting to connect signaling."; |
| 186 oauth_token_getter_->CallWithToken( | 187 oauth_token_getter_->CallWithToken( |
| 187 base::Bind(&SignalingConnector::OnAccessToken, AsWeakPtr())); | 188 base::Bind(&SignalingConnector::OnAccessToken, AsWeakPtr())); |
| 188 } | 189 } |
| 189 } | 190 } |
| 190 | 191 |
| 191 } // namespace remoting | 192 } // namespace remoting |
| OLD | NEW |