#ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
#include <stdint.h>
#include <map>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "build/build_config.h"
#include "device/bluetooth/bluetooth_export.h"
namespace device {
class DEVICE_BLUETOOTH_EXPORT BluetoothAdvertisement
: public base::RefCounted<BluetoothAdvertisement> {
public:
enum ErrorCode {
ERROR_UNSUPPORTED_PLATFORM,
ERROR_ADVERTISEMENT_ALREADY_EXISTS,
ERROR_ADVERTISEMENT_DOES_NOT_EXIST,
ERROR_ADVERTISEMENT_INVALID_LENGTH,
ERROR_STARTING_ADVERTISEMENT,
ERROR_RESET_ADVERTISING,
ERROR_ADAPTER_POWERED_OFF,
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
ERROR_INVALID_ADVERTISEMENT_INTERVAL,
#endif
INVALID_ADVERTISEMENT_ERROR_CODE
};
enum AdvertisementType {
ADVERTISEMENT_TYPE_BROADCAST,
ADVERTISEMENT_TYPE_PERIPHERAL
};
using UUIDList = std::vector<std::string>;
using ManufacturerData = std::map<uint16_t, std::vector<uint8_t>>;
using ServiceData = std::map<std::string, std::vector<uint8_t>>;
using ScanResponseData = std::map<uint8_t, std::vector<uint8_t>>;
class DEVICE_BLUETOOTH_EXPORT Data {
public:
explicit Data(AdvertisementType type);
Data(const Data&) = delete;
Data& operator=(const Data&) = delete;
~Data();
AdvertisementType type() { return type_; }
std::optional<UUIDList> service_uuids() {
return pass_value(service_uuids_);
}
std::optional<ManufacturerData> manufacturer_data() {
return pass_value(manufacturer_data_);
}
std::optional<UUIDList> solicit_uuids() {
return pass_value(solicit_uuids_);
}
std::optional<ServiceData> service_data() {
return pass_value(service_data_);
}
std::optional<ScanResponseData> scan_response_data() {
return pass_value(scan_response_data_);
}
void set_service_uuids(std::optional<UUIDList> service_uuids) {
service_uuids_ = std::move(service_uuids);
}
void set_manufacturer_data(
std::optional<ManufacturerData> manufacturer_data) {
manufacturer_data_ = std::move(manufacturer_data);
}
void set_solicit_uuids(std::optional<UUIDList> solicit_uuids) {
solicit_uuids_ = std::move(solicit_uuids);
}
void set_service_data(std::optional<ServiceData> service_data) {
service_data_ = std::move(service_data);
}
void set_scan_response_data(
std::optional<ScanResponseData> scan_response_data) {
scan_response_data_ = std::move(scan_response_data);
}
void set_include_tx_power(bool include_tx_power) {
include_tx_power_ = include_tx_power;
}
private:
Data();
template <typename T>
static std::optional<T> pass_value(std::optional<T>& from) {
std::optional<T> value = std::move(from);
from = std::nullopt;
return value;
}
AdvertisementType type_;
std::optional<UUIDList> service_uuids_;
std::optional<ManufacturerData> manufacturer_data_;
std::optional<UUIDList> solicit_uuids_;
std::optional<ServiceData> service_data_;
std::optional<ScanResponseData> scan_response_data_;
bool include_tx_power_;
};
class Observer {
public:
virtual ~Observer() {}
virtual void AdvertisementReleased(
BluetoothAdvertisement* advertisement) = 0;
};
BluetoothAdvertisement(const BluetoothAdvertisement&) = delete;
BluetoothAdvertisement& operator=(const BluetoothAdvertisement&) = delete;
void AddObserver(BluetoothAdvertisement::Observer* observer);
void RemoveObserver(BluetoothAdvertisement::Observer* observer);
using SuccessCallback = base::OnceClosure;
using ErrorCallback = base::OnceCallback<void(ErrorCode)>;
virtual void Unregister(SuccessCallback success_callback,
ErrorCallback error_callback) = 0;
protected:
friend class base::RefCounted<BluetoothAdvertisement>;
BluetoothAdvertisement();
virtual ~BluetoothAdvertisement();
base::ObserverList<BluetoothAdvertisement::Observer>::Unchecked observers_;
};
}
#endif