// Copyright 2020 The Fuchsia 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 SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_LOW_ENERGY_INTERROGATOR_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_LOW_ENERGY_INTERROGATOR_H_

#include "src/connectivity/bluetooth/core/bt-host/gap/interrogator.h"

namespace bt {
namespace hci {
class Transport;
}  // namespace hci

namespace gap {

// LowEnergyInterrogator sends HCI commands that request the controller version and features of a
// peer and handles responses by updating the Peer specified in Interrogator::Start.
// LowEnergyInterrogator must only be used with an LE or dual mode controller.
class LowEnergyInterrogator final : public Interrogator {
 public:
  // |cache| must live longer than this object.
  LowEnergyInterrogator(PeerCache* cache, fxl::RefPtr<hci::Transport> hci,
                        async_dispatcher_t* dispatcher);

 private:
  // Interrogator Overrides:
  void SendCommands(InterrogationRefPtr interrogation) final;

  // LE commands:

  void ReadLERemoteFeatures(InterrogationRefPtr interrogation);

  // Keep this as the last member to make sure that all weak pointers are
  // invalidated before other members get destroyed.
  fxl::WeakPtrFactory<LowEnergyInterrogator> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(LowEnergyInterrogator);
};

}  // namespace gap
}  // namespace bt

#endif  // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_LOW_ENERGY_INTERROGATOR_H_
