C++程序  |  124行  |  3.75 KB

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