| // 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_GAP_LOW_ENERGY_ADVERTISING_MANAGER_H_ |
| #define GARNET_DRIVERS_BLUETOOTH_LIB_GAP_LOW_ENERGY_ADVERTISING_MANAGER_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include "garnet/drivers/bluetooth/lib/gap/advertising_data.h" |
| #include "garnet/drivers/bluetooth/lib/gap/gap.h" |
| #include "garnet/drivers/bluetooth/lib/hci/hci_constants.h" |
| #include "garnet/drivers/bluetooth/lib/hci/low_energy_advertiser.h" |
| #include "lib/fxl/memory/weak_ptr.h" |
| |
| namespace btlib { |
| |
| namespace hci { |
| class Connection; |
| class Transport; |
| } // namespace hci |
| |
| namespace gap { |
| |
| class LowEnergyAdvertisingManager { |
| public: |
| explicit LowEnergyAdvertisingManager(hci::LowEnergyAdvertiser* advertiser); |
| virtual ~LowEnergyAdvertisingManager(); |
| |
| // Asynchronously attempts to start advertising a set of |data| with |
| // additional scan response data |scan_rsp|. |
| // If |connect_callback| is provided, the advertisement will be connectable |
| // and it will be called with the returned advertisement_id and a pointer to |
| // the new connection, at which point the advertisement will have been |
| // stopped. |
| // |
| // Returns false if the parameters represent an invalid advertisement: |
| // * if |anonymous| is true but |callback| is set |
| // |
| // |status_callback| may be called synchronously within this function. |
| // |status_callback| provides one of: |
| // - an |advertisement_id|, which can be used to stop advertising |
| // or disambiguate calls to |callback|, and a success |status|. |
| // - an empty |advertisement_id| and an error indication in |status|: |
| // * common::HostError::kInvalidParameters if the advertising parameters |
| // are invalid (e.g. |data| is too large). |
| // * common::HostError::kNotSupported if another set cannot be advertised |
| // or if the requested parameters are not supported by the hardware. |
| // * common::HostError::kProtocolError with a HCI error reported from |
| // the controller, otherwise. |
| // |
| // TODO(armansito): Return integer IDs instead. |
| using ConnectionCallback = |
| fit::function<void(std::string advertisement_id, |
| std::unique_ptr<hci::Connection> link)>; |
| using AdvertisingStatusCallback = |
| fit::function<void(std::string advertisement_id, hci::Status status)>; |
| void StartAdvertising(const AdvertisingData& data, |
| const AdvertisingData& scan_rsp, |
| ConnectionCallback connect_callback, |
| uint32_t interval_ms, |
| bool anonymous, |
| AdvertisingStatusCallback status_callback); |
| |
| // Stop advertising the advertisement with the id |advertisement_id| |
| // Returns true if an advertisement was stopped, and false otherwise. |
| // This function is idempotent. |
| bool StopAdvertising(std::string advertisement_id); |
| |
| private: |
| class ActiveAdvertisement; |
| |
| // Active advertisements, indexed by id. |
| // TODO(armansito): Use fbl::HashMap here (NET-176) or move |
| // ActiveAdvertisement definition here and store by value (it is a small |
| // object). |
| std::unordered_map<std::string, std::unique_ptr<ActiveAdvertisement>> |
| advertisements_; |
| |
| // Used to communicate with the controller. |advertiser_| must outlive this |
| // advertising manager. |
| hci::LowEnergyAdvertiser* advertiser_; // weak |
| |
| // Note: Should remain the last member so it'll be destroyed and |
| // invalidate it's pointers before other members are destroyed. |
| fxl::WeakPtrFactory<LowEnergyAdvertisingManager> weak_ptr_factory_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(LowEnergyAdvertisingManager); |
| }; |
| |
| } // namespace gap |
| } // namespace btlib |
| |
| #endif // GARNET_DRIVERS_BLUETOOTH_LIB_GAP_LOW_ENERGY_ADVERTISING_MANAGER_H_ |