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