// Copyright 2015 The Chromium 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 DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "device/bluetooth/bluetooth_export.h"
namespace device {
// BluetoothAdvertisement represents an advertisement which advertises over the
// LE channel during its lifetime.
class DEVICE_BLUETOOTH_EXPORT BluetoothAdvertisement
: public base::RefCounted<BluetoothAdvertisement> {
public:
// Possible types of error raised while registering or unregistering
// advertisements.
enum ErrorCode {
ERROR_UNSUPPORTED_PLATFORM, // Bluetooth advertisement not supported on
// current platform.
ERROR_ADVERTISEMENT_ALREADY_EXISTS, // An advertisement is already
// registered.
ERROR_ADVERTISEMENT_DOES_NOT_EXIST, // Unregistering an advertisement which
// is not registered.
ERROR_ADVERTISEMENT_INVALID_LENGTH, // Advertisement is not of a valid
// length.
#if defined(OS_CHROMEOS) || defined(OS_LINUX)
ERROR_INVALID_ADVERTISEMENT_INTERVAL, // Advertisement interval specified
// is out of valid range.
#endif
INVALID_ADVERTISEMENT_ERROR_CODE
};
// Type of advertisement.
enum AdvertisementType {
// This advertises with the type set to ADV_NONCONN_IND, which indicates
// to receivers that our device is not connectable.
ADVERTISEMENT_TYPE_BROADCAST,
// This advertises with the type set to ADV_IND or ADV_SCAN_IND, which
// indicates to receivers that our device is connectable.
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>>;
// Structure that holds the data for an advertisement.
class DEVICE_BLUETOOTH_EXPORT Data {
public:
explicit Data(AdvertisementType type);
~Data();
AdvertisementType type() { return type_; }
std::unique_ptr<UUIDList> service_uuids() {
return std::move(service_uuids_);
}
std::unique_ptr<ManufacturerData> manufacturer_data() {
return std::move(manufacturer_data_);
}
std::unique_ptr<UUIDList> solicit_uuids() {
return std::move(solicit_uuids_);
}
std::unique_ptr<ServiceData> service_data() {
return std::move(service_data_);
}
void set_service_uuids(std::unique_ptr<UUIDList> service_uuids) {
service_uuids_ = std::move(service_uuids);
}
void set_manufacturer_data(
std::unique_ptr<ManufacturerData> manufacturer_data) {
manufacturer_data_ = std::move(manufacturer_data);
}
void set_solicit_uuids(std::unique_ptr<UUIDList> solicit_uuids) {
solicit_uuids_ = std::move(solicit_uuids);
}
void set_service_data(std::unique_ptr<ServiceData> service_data) {
service_data_ = std::move(service_data);
}
void set_include_tx_power(bool include_tx_power) {
include_tx_power_ = include_tx_power;
}
private:
Data();
AdvertisementType type_;
std::unique_ptr<UUIDList> service_uuids_;
std::unique_ptr<ManufacturerData> manufacturer_data_;
std::unique_ptr<UUIDList> solicit_uuids_;
std::unique_ptr<ServiceData> service_data_;
bool include_tx_power_;
DISALLOW_COPY_AND_ASSIGN(Data);
};
// Interface for observing changes to this advertisement.
class Observer {
public:
virtual ~Observer() {}
// Called when this advertisement is released and is no longer advertising.
virtual void AdvertisementReleased(
BluetoothAdvertisement* advertisement) = 0;
};
// Adds and removes observers for events for this advertisement.
void AddObserver(BluetoothAdvertisement::Observer* observer);
void RemoveObserver(BluetoothAdvertisement::Observer* observer);
// Unregisters this advertisement. Called on destruction of this object
// automatically but can be called directly to explicitly unregister this
// object.
using SuccessCallback = base::Closure;
using ErrorCallback = base::Callback<void(ErrorCode)>;
virtual void Unregister(const SuccessCallback& success_callback,
const ErrorCallback& error_callback) = 0;
protected:
friend class base::RefCounted<BluetoothAdvertisement>;
BluetoothAdvertisement();
// The destructor will unregister this advertisement.
virtual ~BluetoothAdvertisement();
// List of observers interested in event notifications from us. Objects in
// |observers_| are expected to outlive a BluetoothAdvertisement object.
base::ObserverList<BluetoothAdvertisement::Observer> observers_;
private:
DISALLOW_COPY_AND_ASSIGN(BluetoothAdvertisement);
};
} // namespace device
#endif // DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_