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 3// found in the LICENSE file. 4 5#include "chrome/browser/local_discovery/wifi/bootstrapping_network_switcher.h" 6 7#include "base/bind.h" 8#include "components/onc/onc_constants.h" 9 10namespace local_discovery { 11 12namespace wifi { 13 14BootstrappingNetworkSwitcher::BootstrappingNetworkSwitcher( 15 WifiManager* wifi_manager, 16 const std::string& connect_ssid, 17 const SuccessCallback& callback) 18 : wifi_manager_(wifi_manager), 19 connect_ssid_(connect_ssid), 20 callback_(callback), 21 connected_(false), 22 weak_factory_(this) { 23} 24 25BootstrappingNetworkSwitcher::~BootstrappingNetworkSwitcher() { 26 Disconnect(); 27} 28 29void BootstrappingNetworkSwitcher::Connect() { 30 wifi_manager_->GetSSIDList( 31 base::Bind(&BootstrappingNetworkSwitcher::OnGotNetworkList, 32 weak_factory_.GetWeakPtr())); 33} 34 35void BootstrappingNetworkSwitcher::Disconnect() { 36 if (connected_ && !return_guid_.empty()) { 37 connected_ = false; 38 wifi_manager_->ConnectToNetworkByID(return_guid_, 39 WifiManager::SuccessCallback()); 40 } 41} 42 43void BootstrappingNetworkSwitcher::OnGotNetworkList( 44 const NetworkPropertiesList& networks) { 45 for (NetworkPropertiesList::const_iterator i = networks.begin(); 46 i != networks.end(); 47 i++) { 48 if (i->connection_state == onc::connection_state::kConnected) { 49 return_guid_ = i->guid; 50 break; 51 } 52 } 53 54 // We are "connected" while attempting to connect even if we fail 55 connected_ = true; 56 57 // Bootstrapping devices should have an empty PSK. 58 wifi_manager_->ConfigureAndConnectNetwork( 59 connect_ssid_, 60 WifiCredentials::FromPSK(std::string()), 61 base::Bind(&BootstrappingNetworkSwitcher::OnConnectStatus, 62 weak_factory_.GetWeakPtr())); 63} 64 65void BootstrappingNetworkSwitcher::OnConnectStatus(bool status) { 66 connected_ = status; 67 callback_.Run(status); 68} 69 70} // namespace wifi 71 72} // namespace local_discovery 73