146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_WIFI_WIFI_MANAGER_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define CHROME_BROWSER_LOCAL_DISCOVERY_WIFI_WIFI_MANAGER_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string>
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector>
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/callback.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/wifi/network_properties.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace local_discovery {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace wifi {
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Convenience definition for users of this header, since ::wifi and
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// local_discovery::wifi may conflict.
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using ::wifi::NetworkProperties;
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef std::vector<NetworkProperties> NetworkPropertiesList;
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Credentials for WiFi networks. Currently only supports PSK-based networks.
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(noamsml): Support for 802.11X and other authentication methods.
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct WifiCredentials {
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static WifiCredentials FromPSK(const std::string& psk);
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string psk;
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class WifiManagerFactory;
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Observer for the network list. Classes may implement this interface and call
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// |AddNetworkListObserver| to be notified of changes to the visible network
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// list.
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class NetworkListObserver {
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~NetworkListObserver() {}
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnNetworkListChanged(const NetworkPropertiesList& ssid) = 0;
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// A class to manage listing, connecting to, and getting the credentials of WiFi
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// networks.
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class WifiManager {
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<void(const NetworkPropertiesList& ssids)>
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      SSIDListCallback;
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<void(bool success)> SuccessCallback;
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      void(bool success, const std::string& ssid, const std::string& password)>
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      CredentialsCallback;
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~WifiManager() {}
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static scoped_ptr<WifiManager> Create();
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void SetFactory(WifiManagerFactory* factory);
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Start the wifi manager. This must be called before any other method calls.
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Start() = 0;
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Get the list of visible SSIDs in the vicinity. This does not initiate a
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // scan, but merely gets the list of networks from the system.
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetSSIDList(const SSIDListCallback& callback) = 0;
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Request a scan for networks nearby.
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestScan() = 0;
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Configure and connect to a network with a given SSID and
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // credentials. |callback| will be called once the network is connected or
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // after it has failed to connect.
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ConfigureAndConnectNetwork(const std::string& ssid,
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                          const WifiCredentials& credentials,
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                          const SuccessCallback& callback) = 0;
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Connect to a configured network with a given network ID. |callback| will be
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // called once the network is connected or after it has failed to connect.
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void ConnectToNetworkByID(const std::string& ssid,
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    const SuccessCallback& callback) = 0;
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Reequest the credentials for a network with a given network ID from the
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // system. |callback| will be called with credentials if they can be
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // retrieved. Depending on platform, this may bring up a confirmation dialog
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // or password prompt.
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestNetworkCredentials(
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& internal_id,
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const CredentialsCallback& callback) = 0;
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Add a network list observer. This observer will be notified every time the
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // network list changes.
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void AddNetworkListObserver(NetworkListObserver* observer) = 0;
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Remove a network list observer.
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RemoveNetworkListObserver(NetworkListObserver* observer) = 0;
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static scoped_ptr<WifiManager> CreateDefault();
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class WifiManagerFactory {
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~WifiManagerFactory() {}
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual scoped_ptr<WifiManager> CreateWifiManager() = 0;
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace wifi
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace local_discovery
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // CHROME_BROWSER_LOCAL_DISCOVERY_WIFI_WIFI_MANAGER_H_
115