// Copyright 2017 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 GARNET_DRIVERS_BLUETOOTH_LIB_HCI_LEGACY_LOW_ENERGY_ADVERTISER_H_
#define GARNET_DRIVERS_BLUETOOTH_LIB_HCI_LEGACY_LOW_ENERGY_ADVERTISER_H_

#include "garnet/drivers/bluetooth/lib/hci/low_energy_advertiser.h"
#include "garnet/drivers/bluetooth/lib/hci/sequential_command_runner.h"
#include "lib/fxl/memory/ref_ptr.h"

namespace btlib {
namespace hci {

class Transport;

class LegacyLowEnergyAdvertiser final : public LowEnergyAdvertiser {
 public:
  LegacyLowEnergyAdvertiser(fxl::RefPtr<Transport> hci);
  ~LegacyLowEnergyAdvertiser() override;

  // LowEnergyAdvertiser overrides:
  size_t GetSizeLimit() override;
  size_t GetMaxAdvertisements() const override { return 1; }

  // LegacyLowEnergyAdvertiser supports only a single advertising instance,
  // hence it can report additional errors in the following conditions:
  // 1. If called while a start request is pending, reports kRepeatedAttempts.
  // 2. If called while a stop request is pending, then cancels the stop request
  //    and proceeds with start.
  void StartAdvertising(const common::DeviceAddress& address,
                        const common::ByteBuffer& data,
                        const common::ByteBuffer& scan_rsp,
                        ConnectionCallback connect_callback,
                        uint32_t interval_ms,
                        bool anonymous,
                        AdvertisingStatusCallback callback) override;

  // If called while a stop request is pending, returns false.
  // If called while a start request is pending, then cancels the start
  // request and proceeds with start.
  // Returns false if called while not advertising.
  bool StopAdvertising(const common::DeviceAddress& address) override;

  // Clears the advertising state before passing |link| on to
  // |connect_callback_|.
  void OnIncomingConnection(ConnectionHandle handle, Connection::Role role,
                            const common::DeviceAddress& peer_address,
                            const LEConnectionParameters& conn_params) override;

 private:
  // Unconditionally stops advertising.
  void StopAdvertisingInternal();

  // Returns true if currently advertising.
  bool advertising() const { return advertised_ != common::DeviceAddress(); }

  // The transport that's used to issue commands
  fxl::RefPtr<Transport> hci_;

  // |hci_cmd_runner_| will be running when a start or stop is pending.
  // |starting_| is set to true if a start is pending.
  bool starting_;
  std::unique_ptr<SequentialCommandRunner> hci_cmd_runner_;

  // Non-zero if advertising has been enabled.
  common::DeviceAddress advertised_;

  // if not null, the callback for connectable advertising.
  ConnectionCallback connect_callback_;

  FXL_DISALLOW_COPY_AND_ASSIGN(LegacyLowEnergyAdvertiser);
};

}  // namespace hci

}  // namespace btlib

#endif  // GARNET_DRIVERS_BLUETOOTH_LIB_HCI_LEGACY_LOW_ENERGY_ADVERTISER_H_
