OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/local_discovery/wifi/wifi_manager_nonchromeos.h" | 5 #include "chrome/browser/local_discovery/wifi/wifi_manager_nonchromeos.h" |
6 | 6 |
7 #include "base/cancelable_callback.h" | 7 #include "base/cancelable_callback.h" |
8 #include "base/threading/sequenced_worker_pool.h" | 8 #include "base/threading/sequenced_worker_pool.h" |
9 #include "base/threading/thread.h" | 9 #include "base/threading/thread.h" |
10 #include "components/onc/onc_constants.h" | 10 #include "components/onc/onc_constants.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 : wifi_manager_(wifi_manager), | 136 : wifi_manager_(wifi_manager), |
137 callback_runner_(base::MessageLoopProxy::current()), | 137 callback_runner_(base::MessageLoopProxy::current()), |
138 weak_factory_(this) { | 138 weak_factory_(this) { |
139 } | 139 } |
140 | 140 |
141 WifiManagerNonChromeos::WifiServiceWrapper::~WifiServiceWrapper() { | 141 WifiManagerNonChromeos::WifiServiceWrapper::~WifiServiceWrapper() { |
142 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); | 142 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
143 } | 143 } |
144 | 144 |
145 void WifiManagerNonChromeos::WifiServiceWrapper::Start() { | 145 void WifiManagerNonChromeos::WifiServiceWrapper::Start() { |
146 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 146 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
147 wifi_service_.reset(WiFiService::Create()); | 147 wifi_service_.reset(WiFiService::Create()); |
148 | 148 |
149 wifi_service_->Initialize(base::MessageLoopProxy::current()); | 149 wifi_service_->Initialize(base::MessageLoopProxy::current()); |
150 | 150 |
151 wifi_service_->SetEventObservers( | 151 wifi_service_->SetEventObservers( |
152 base::MessageLoopProxy::current(), | 152 base::MessageLoopProxy::current(), |
153 base::Bind(&WifiServiceWrapper::OnNetworksChangedEvent, AsWeakPtr()), | 153 base::Bind(&WifiServiceWrapper::OnNetworksChangedEvent, AsWeakPtr()), |
154 base::Bind(&WifiServiceWrapper::OnNetworkListChangedEvent, AsWeakPtr())); | 154 base::Bind(&WifiServiceWrapper::OnNetworkListChangedEvent, AsWeakPtr())); |
155 | 155 |
156 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); | 156 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
157 } | 157 } |
158 | 158 |
159 void WifiManagerNonChromeos::WifiServiceWrapper::GetSSIDList( | 159 void WifiManagerNonChromeos::WifiServiceWrapper::GetSSIDList( |
160 const WifiManager::SSIDListCallback& callback) { | 160 const WifiManager::SSIDListCallback& callback) { |
161 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 161 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
162 | 162 |
163 scoped_ptr<NetworkPropertiesList> ssid_list(new NetworkPropertiesList); | 163 scoped_ptr<NetworkPropertiesList> ssid_list(new NetworkPropertiesList); |
164 GetSSIDListInternal(ssid_list.get()); | 164 GetSSIDListInternal(ssid_list.get()); |
165 | 165 |
166 callback_runner_->PostTask( | 166 callback_runner_->PostTask( |
167 FROM_HERE, | 167 FROM_HERE, |
168 base::Bind(&WifiManagerNonChromeos::PostSSIDListCallback, | 168 base::Bind(&WifiManagerNonChromeos::PostSSIDListCallback, |
169 wifi_manager_, | 169 wifi_manager_, |
170 callback, | 170 callback, |
171 base::Passed(&ssid_list))); | 171 base::Passed(&ssid_list))); |
172 } | 172 } |
173 | 173 |
174 void WifiManagerNonChromeos::WifiServiceWrapper::ConfigureAndConnectPskNetwork( | 174 void WifiManagerNonChromeos::WifiServiceWrapper::ConfigureAndConnectPskNetwork( |
175 const std::string& ssid, | 175 const std::string& ssid, |
176 const std::string& password, | 176 const std::string& password, |
177 const WifiManager::SuccessCallback& callback) { | 177 const WifiManager::SuccessCallback& callback) { |
178 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 178 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
179 scoped_ptr<base::DictionaryValue> properties = MakeProperties(ssid, password); | 179 scoped_ptr<base::DictionaryValue> properties = MakeProperties(ssid, password); |
180 | 180 |
181 std::string network_guid; | 181 std::string network_guid; |
182 std::string error_string; | 182 std::string error_string; |
183 // Will fail without changing system state if network already exists. | 183 // Will fail without changing system state if network already exists. |
184 wifi_service_->CreateNetwork( | 184 wifi_service_->CreateNetwork( |
185 false, properties.Pass(), &network_guid, &error_string); | 185 false, properties.Pass(), &network_guid, &error_string); |
186 | 186 |
187 if (error_string.empty()) { | 187 if (error_string.empty()) { |
188 ConnectToNetworkByID(network_guid, callback); | 188 ConnectToNetworkByID(network_guid, callback); |
189 return; | 189 return; |
190 } | 190 } |
191 | 191 |
192 // If we cannot create the network, attempt to configure and connect to an | 192 // If we cannot create the network, attempt to configure and connect to an |
193 // existing network. | 193 // existing network. |
194 if (FindAndConfigureNetwork(ssid, password, &network_guid)) { | 194 if (FindAndConfigureNetwork(ssid, password, &network_guid)) { |
195 ConnectToNetworkByID(network_guid, callback); | 195 ConnectToNetworkByID(network_guid, callback); |
196 } else { | 196 } else { |
197 if (!callback.is_null()) | 197 if (!callback.is_null()) |
198 PostClosure(base::Bind(callback, false /* success */)); | 198 PostClosure(base::Bind(callback, false /* success */)); |
199 } | 199 } |
200 } | 200 } |
201 | 201 |
202 void WifiManagerNonChromeos::WifiServiceWrapper::OnNetworkListChangedEvent( | 202 void WifiManagerNonChromeos::WifiServiceWrapper::OnNetworkListChangedEvent( |
203 const std::vector<std::string>& network_guids) { | 203 const std::vector<std::string>& network_guids) { |
204 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 204 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
205 scoped_ptr<NetworkPropertiesList> ssid_list(new NetworkPropertiesList); | 205 scoped_ptr<NetworkPropertiesList> ssid_list(new NetworkPropertiesList); |
206 GetSSIDListInternal(ssid_list.get()); | 206 GetSSIDListInternal(ssid_list.get()); |
207 callback_runner_->PostTask( | 207 callback_runner_->PostTask( |
208 FROM_HERE, | 208 FROM_HERE, |
209 base::Bind(&WifiManagerNonChromeos::OnNetworkListChanged, | 209 base::Bind(&WifiManagerNonChromeos::OnNetworkListChanged, |
210 wifi_manager_, | 210 wifi_manager_, |
211 base::Passed(&ssid_list))); | 211 base::Passed(&ssid_list))); |
212 } | 212 } |
213 | 213 |
214 void WifiManagerNonChromeos::WifiServiceWrapper::OnNetworksChangedEvent( | 214 void WifiManagerNonChromeos::WifiServiceWrapper::OnNetworksChangedEvent( |
215 const std::vector<std::string>& network_guids) { | 215 const std::vector<std::string>& network_guids) { |
216 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 216 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
217 if (connecting_network_guid_.empty() || | 217 if (connecting_network_guid_.empty() || |
218 !IsConnected(connecting_network_guid_)) { | 218 !IsConnected(connecting_network_guid_)) { |
219 return; | 219 return; |
220 } | 220 } |
221 | 221 |
222 connecting_network_guid_.clear(); | 222 connecting_network_guid_.clear(); |
223 connect_failure_callback_.Cancel(); | 223 connect_failure_callback_.Cancel(); |
224 | 224 |
225 if (!connect_success_callback_.is_null()) | 225 if (!connect_success_callback_.is_null()) |
226 PostClosure(base::Bind(connect_success_callback_, true)); | 226 PostClosure(base::Bind(connect_success_callback_, true)); |
227 | 227 |
228 connect_success_callback_.Reset(); | 228 connect_success_callback_.Reset(); |
229 } | 229 } |
230 | 230 |
231 base::WeakPtr<WifiManagerNonChromeos::WifiServiceWrapper> | 231 base::WeakPtr<WifiManagerNonChromeos::WifiServiceWrapper> |
232 WifiManagerNonChromeos::WifiServiceWrapper::AsWeakPtr() { | 232 WifiManagerNonChromeos::WifiServiceWrapper::AsWeakPtr() { |
233 return weak_factory_.GetWeakPtr(); | 233 return weak_factory_.GetWeakPtr(); |
234 } | 234 } |
235 | 235 |
236 void WifiManagerNonChromeos::WifiServiceWrapper::RequestScan() { | 236 void WifiManagerNonChromeos::WifiServiceWrapper::RequestScan() { |
237 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 237 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
238 wifi_service_->RequestNetworkScan(); | 238 wifi_service_->RequestNetworkScan(); |
239 } | 239 } |
240 | 240 |
241 void WifiManagerNonChromeos::WifiServiceWrapper::ConnectToNetworkByID( | 241 void WifiManagerNonChromeos::WifiServiceWrapper::ConnectToNetworkByID( |
242 const std::string& network_guid, | 242 const std::string& network_guid, |
243 const WifiManager::SuccessCallback& callback) { | 243 const WifiManager::SuccessCallback& callback) { |
244 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 244 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
245 | 245 |
246 std::string connected_network_id = GetConnectedGUID(); | 246 std::string connected_network_id = GetConnectedGUID(); |
247 std::string error_string; | 247 std::string error_string; |
248 wifi_service_->StartConnect(network_guid, &error_string); | 248 wifi_service_->StartConnect(network_guid, &error_string); |
249 | 249 |
250 if (!error_string.empty()) { | 250 if (!error_string.empty()) { |
251 LOG(ERROR) << "Could not connect to network by ID: " << error_string; | 251 LOG(ERROR) << "Could not connect to network by ID: " << error_string; |
252 PostClosure(base::Bind(callback, false /* success */)); | 252 PostClosure(base::Bind(callback, false /* success */)); |
253 wifi_service_->StartConnect(connected_network_id, &error_string); | 253 wifi_service_->StartConnect(connected_network_id, &error_string); |
254 return; | 254 return; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 // connected to. | 288 // connected to. |
289 if (!connected) | 289 if (!connected) |
290 wifi_service_->StartConnect(connected_network_guid_, &error_string); | 290 wifi_service_->StartConnect(connected_network_guid_, &error_string); |
291 | 291 |
292 PostClosure(base::Bind(connect_success_callback, connected /* success */)); | 292 PostClosure(base::Bind(connect_success_callback, connected /* success */)); |
293 } | 293 } |
294 | 294 |
295 void WifiManagerNonChromeos::WifiServiceWrapper::RequestNetworkCredentials( | 295 void WifiManagerNonChromeos::WifiServiceWrapper::RequestNetworkCredentials( |
296 const std::string& ssid, | 296 const std::string& ssid, |
297 const WifiManager::CredentialsCallback& callback) { | 297 const WifiManager::CredentialsCallback& callback) { |
298 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 298 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
299 | 299 |
300 bool success = true; | 300 bool success = true; |
301 std::string guid; | 301 std::string guid; |
302 std::string key; | 302 std::string key; |
303 | 303 |
304 NetworkPropertiesList network_list; | 304 NetworkPropertiesList network_list; |
305 | 305 |
306 GetSSIDListInternal(&network_list); | 306 GetSSIDListInternal(&network_list); |
307 | 307 |
308 for (NetworkPropertiesList::iterator i = network_list.begin(); | 308 for (NetworkPropertiesList::iterator i = network_list.begin(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 } | 464 } |
465 | 465 |
466 WifiManagerNonChromeos::~WifiManagerNonChromeos() { | 466 WifiManagerNonChromeos::~WifiManagerNonChromeos() { |
467 if (wifi_wrapper_) { | 467 if (wifi_wrapper_) { |
468 content::BrowserThread::DeleteSoon( | 468 content::BrowserThread::DeleteSoon( |
469 content::BrowserThread::FILE, FROM_HERE, wifi_wrapper_); | 469 content::BrowserThread::FILE, FROM_HERE, wifi_wrapper_); |
470 } | 470 } |
471 } | 471 } |
472 | 472 |
473 void WifiManagerNonChromeos::Start() { | 473 void WifiManagerNonChromeos::Start() { |
474 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 474 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
475 task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( | 475 task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( |
476 content::BrowserThread::FILE); | 476 content::BrowserThread::FILE); |
477 | 477 |
478 // Allocated on UI thread, but all initialization is done on file | 478 // Allocated on UI thread, but all initialization is done on file |
479 // thread. Destroyed on file thread, which should be safe since all of the | 479 // thread. Destroyed on file thread, which should be safe since all of the |
480 // thread-unsafe members are created on the file thread. | 480 // thread-unsafe members are created on the file thread. |
481 wifi_wrapper_ = new WifiServiceWrapper(weak_factory_.GetWeakPtr()); | 481 wifi_wrapper_ = new WifiServiceWrapper(weak_factory_.GetWeakPtr()); |
482 | 482 |
483 task_runner_->PostTask( | 483 task_runner_->PostTask( |
484 FROM_HERE, | 484 FROM_HERE, |
485 base::Bind(&WifiServiceWrapper::Start, wifi_wrapper_->AsWeakPtr())); | 485 base::Bind(&WifiServiceWrapper::Start, wifi_wrapper_->AsWeakPtr())); |
486 } | 486 } |
487 | 487 |
488 void WifiManagerNonChromeos::GetSSIDList(const SSIDListCallback& callback) { | 488 void WifiManagerNonChromeos::GetSSIDList(const SSIDListCallback& callback) { |
489 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 489 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
490 task_runner_->PostTask(FROM_HERE, | 490 task_runner_->PostTask(FROM_HERE, |
491 base::Bind(&WifiServiceWrapper::GetSSIDList, | 491 base::Bind(&WifiServiceWrapper::GetSSIDList, |
492 wifi_wrapper_->AsWeakPtr(), | 492 wifi_wrapper_->AsWeakPtr(), |
493 callback)); | 493 callback)); |
494 } | 494 } |
495 | 495 |
496 void WifiManagerNonChromeos::RequestScan() { | 496 void WifiManagerNonChromeos::RequestScan() { |
497 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 497 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
498 task_runner_->PostTask( | 498 task_runner_->PostTask( |
499 FROM_HERE, | 499 FROM_HERE, |
500 base::Bind(&WifiServiceWrapper::RequestScan, wifi_wrapper_->AsWeakPtr())); | 500 base::Bind(&WifiServiceWrapper::RequestScan, wifi_wrapper_->AsWeakPtr())); |
501 } | 501 } |
502 | 502 |
503 void WifiManagerNonChromeos::OnNetworkListChanged( | 503 void WifiManagerNonChromeos::OnNetworkListChanged( |
504 scoped_ptr<NetworkPropertiesList> ssid_list) { | 504 scoped_ptr<NetworkPropertiesList> ssid_list) { |
505 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 505 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
506 FOR_EACH_OBSERVER(NetworkListObserver, | 506 FOR_EACH_OBSERVER(NetworkListObserver, |
507 network_list_observers_, | 507 network_list_observers_, |
508 OnNetworkListChanged(*ssid_list)); | 508 OnNetworkListChanged(*ssid_list)); |
509 } | 509 } |
510 | 510 |
511 void WifiManagerNonChromeos::PostClosure(const base::Closure& callback) { | 511 void WifiManagerNonChromeos::PostClosure(const base::Closure& callback) { |
512 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 512 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
513 callback.Run(); | 513 callback.Run(); |
514 } | 514 } |
515 | 515 |
516 void WifiManagerNonChromeos::PostSSIDListCallback( | 516 void WifiManagerNonChromeos::PostSSIDListCallback( |
517 const SSIDListCallback& callback, | 517 const SSIDListCallback& callback, |
518 scoped_ptr<NetworkPropertiesList> ssid_list) { | 518 scoped_ptr<NetworkPropertiesList> ssid_list) { |
519 callback.Run(*ssid_list); | 519 callback.Run(*ssid_list); |
520 } | 520 } |
521 | 521 |
522 void WifiManagerNonChromeos::ConfigureAndConnectNetwork( | 522 void WifiManagerNonChromeos::ConfigureAndConnectNetwork( |
523 const std::string& ssid, | 523 const std::string& ssid, |
524 const WifiCredentials& credentials, | 524 const WifiCredentials& credentials, |
525 const SuccessCallback& callback) { | 525 const SuccessCallback& callback) { |
526 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 526 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
527 task_runner_->PostTask( | 527 task_runner_->PostTask( |
528 FROM_HERE, | 528 FROM_HERE, |
529 base::Bind(&WifiServiceWrapper::ConfigureAndConnectPskNetwork, | 529 base::Bind(&WifiServiceWrapper::ConfigureAndConnectPskNetwork, |
530 wifi_wrapper_->AsWeakPtr(), | 530 wifi_wrapper_->AsWeakPtr(), |
531 ssid, | 531 ssid, |
532 credentials.psk, | 532 credentials.psk, |
533 callback)); | 533 callback)); |
534 } | 534 } |
535 | 535 |
536 void WifiManagerNonChromeos::ConnectToNetworkByID( | 536 void WifiManagerNonChromeos::ConnectToNetworkByID( |
537 const std::string& internal_id, | 537 const std::string& internal_id, |
538 const SuccessCallback& callback) { | 538 const SuccessCallback& callback) { |
539 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 539 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
540 task_runner_->PostTask(FROM_HERE, | 540 task_runner_->PostTask(FROM_HERE, |
541 base::Bind(&WifiServiceWrapper::ConnectToNetworkByID, | 541 base::Bind(&WifiServiceWrapper::ConnectToNetworkByID, |
542 wifi_wrapper_->AsWeakPtr(), | 542 wifi_wrapper_->AsWeakPtr(), |
543 internal_id, | 543 internal_id, |
544 callback)); | 544 callback)); |
545 } | 545 } |
546 | 546 |
547 void WifiManagerNonChromeos::RequestNetworkCredentials( | 547 void WifiManagerNonChromeos::RequestNetworkCredentials( |
548 const std::string& ssid, | 548 const std::string& ssid, |
549 const CredentialsCallback& callback) { | 549 const CredentialsCallback& callback) { |
550 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 550 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
551 task_runner_->PostTask( | 551 task_runner_->PostTask( |
552 FROM_HERE, | 552 FROM_HERE, |
553 base::Bind(&WifiServiceWrapper::RequestNetworkCredentials, | 553 base::Bind(&WifiServiceWrapper::RequestNetworkCredentials, |
554 wifi_wrapper_->AsWeakPtr(), | 554 wifi_wrapper_->AsWeakPtr(), |
555 ssid, | 555 ssid, |
556 callback)); | 556 callback)); |
557 } | 557 } |
558 | 558 |
559 void WifiManagerNonChromeos::AddNetworkListObserver( | 559 void WifiManagerNonChromeos::AddNetworkListObserver( |
560 NetworkListObserver* observer) { | 560 NetworkListObserver* observer) { |
561 network_list_observers_.AddObserver(observer); | 561 network_list_observers_.AddObserver(observer); |
562 } | 562 } |
563 | 563 |
564 void WifiManagerNonChromeos::RemoveNetworkListObserver( | 564 void WifiManagerNonChromeos::RemoveNetworkListObserver( |
565 NetworkListObserver* observer) { | 565 NetworkListObserver* observer) { |
566 network_list_observers_.RemoveObserver(observer); | 566 network_list_observers_.RemoveObserver(observer); |
567 } | 567 } |
568 | 568 |
569 } // namespace wifi | 569 } // namespace wifi |
570 | 570 |
571 } // namespace local_discovery | 571 } // namespace local_discovery |
OLD | NEW |