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