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