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 |