You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.3 KiB
155 lines
5.3 KiB
// 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 "build/build_config.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_LINUX)
|
|
ERROR_INVALID_ADVERTISEMENT_INTERVAL, // Advertisement interval specified
|
|
// is out of valid range.
|
|
ERROR_RESET_ADVERTISING, // Error while resetting advertising.
|
|
#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_
|