| // Copyright 2015 The Weave Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_ |
| #define LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_ |
| |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include <base/callback.h> |
| #include <base/macros.h> |
| #include <base/memory/weak_ptr.h> |
| #include <base/scoped_observer.h> |
| #include <base/time/time.h> |
| |
| #include "src/privet/privet_types.h" |
| #include "src/privet/wifi_delegate.h" |
| #include "src/privet/wifi_ssid_generator.h" |
| |
| namespace weave { |
| |
| class Config; |
| |
| namespace provider { |
| class Network; |
| class TaskRunner; |
| class Wifi; |
| } |
| |
| namespace privet { |
| |
| class CloudDelegate; |
| class DeviceDelegate; |
| |
| class WifiBootstrapManager : public WifiDelegate { |
| public: |
| enum class State { |
| kDisabled, |
| kBootstrapping, |
| kMonitoring, |
| kConnecting, |
| }; |
| |
| WifiBootstrapManager(Config* config, |
| provider::TaskRunner* task_runner, |
| provider::Network* shill_client, |
| provider::Wifi* wifi, |
| CloudDelegate* gcd); |
| ~WifiBootstrapManager() override = default; |
| virtual void Init(); |
| |
| // Overrides from WifiDelegate. |
| const ConnectionState& GetConnectionState() const override; |
| const SetupState& GetSetupState() const override; |
| bool ConfigureCredentials(const std::string& ssid, |
| const std::string& passphrase, |
| ErrorPtr* error) override; |
| std::string GetCurrentlyConnectedSsid() const override; |
| std::string GetHostedSsid() const override; |
| std::set<WifiType> GetTypes() const override; |
| |
| private: |
| // These Start* tasks: |
| // 1) Do state appropriate work for entering the indicated state. |
| // 2) Update the state variable to reflect that we're in a new state |
| // 3) Call StateListeners to notify that we've transitioned. |
| // These End* tasks perform cleanup on leaving indicated state. |
| void StartBootstrapping(); |
| void EndBootstrapping(); |
| |
| void StartConnecting(const std::string& ssid, const std::string& passphrase); |
| void EndConnecting(); |
| |
| void StartMonitoring(const base::TimeDelta& timeout); |
| void ContinueMonitoring(const base::TimeDelta& timeout); |
| void EndMonitoring(); |
| |
| // Update the current state, post tasks to notify listeners accordingly to |
| // the MessageLoop. |
| void UpdateState(State new_state); |
| |
| std::string GenerateSsid() const; |
| |
| // If we've been bootstrapped successfully before, and we're bootstrapping |
| // again because we slipped offline for a sufficiently longtime, we want |
| // to return to monitoring mode periodically in case our connectivity issues |
| // were temporary. |
| void OnBootstrapTimeout(); |
| void OnConnectDone(const std::string& ssid, ErrorPtr error); |
| void OnConnectTimeout(); |
| void OnConnectivityChange(); |
| void OnMonitorTimeout(); |
| void UpdateConnectionState(); |
| |
| State state_{State::kDisabled}; |
| // Setup state is the temporal state of the most recent bootstrapping attempt. |
| // It is not persisted to disk. |
| SetupState setup_state_{SetupState::kNone}; |
| ConnectionState connection_state_{ConnectionState::kDisabled}; |
| Config* config_{nullptr}; |
| provider::TaskRunner* task_runner_{nullptr}; |
| provider::Network* network_{nullptr}; |
| provider::Wifi* wifi_{nullptr}; |
| WifiSsidGenerator ssid_generator_; |
| base::Time monitor_until_; |
| |
| bool currently_online_{false}; |
| std::string privet_ssid_; |
| |
| // Helps to reset irrelevant tasks switching state. |
| base::WeakPtrFactory<WifiBootstrapManager> tasks_weak_factory_{this}; |
| |
| base::WeakPtrFactory<WifiBootstrapManager> lifetime_weak_factory_{this}; |
| |
| DISALLOW_COPY_AND_ASSIGN(WifiBootstrapManager); |
| }; |
| |
| } // namespace privet |
| } // namespace weave |
| |
| #endif // LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_ |