| 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 |