blob: 412baa72eebf45e0d726532d5e51a53a2a4d882b [file] [log] [blame]
Luis Hector Chavez2256d982017-12-14 21:17:47 -08001// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_
7
8#include <stdint.h>
9
10#include <map>
11#include <memory>
12#include <string>
13#include <utility>
14#include <vector>
15
16#include "base/callback.h"
17#include "base/macros.h"
18#include "base/memory/ref_counted.h"
19#include "base/observer_list.h"
20#include "device/bluetooth/bluetooth_export.h"
21
22namespace device {
23
24// BluetoothAdvertisement represents an advertisement which advertises over the
25// LE channel during its lifetime.
26class DEVICE_BLUETOOTH_EXPORT BluetoothAdvertisement
27 : public base::RefCounted<BluetoothAdvertisement> {
28 public:
29 // Possible types of error raised while registering or unregistering
30 // advertisements.
31 enum ErrorCode {
32 ERROR_UNSUPPORTED_PLATFORM, // Bluetooth advertisement not supported on
33 // current platform.
34 ERROR_ADVERTISEMENT_ALREADY_EXISTS, // An advertisement is already
35 // registered.
36 ERROR_ADVERTISEMENT_DOES_NOT_EXIST, // Unregistering an advertisement which
37 // is not registered.
38 ERROR_ADVERTISEMENT_INVALID_LENGTH, // Advertisement is not of a valid
39 // length.
40#if defined(OS_CHROMEOS) || defined(OS_LINUX)
41 ERROR_INVALID_ADVERTISEMENT_INTERVAL, // Advertisement interval specified
42 // is out of valid range.
43#endif
44 INVALID_ADVERTISEMENT_ERROR_CODE
45 };
46
47 // Type of advertisement.
48 enum AdvertisementType {
49 // This advertises with the type set to ADV_NONCONN_IND, which indicates
50 // to receivers that our device is not connectable.
51 ADVERTISEMENT_TYPE_BROADCAST,
52 // This advertises with the type set to ADV_IND or ADV_SCAN_IND, which
53 // indicates to receivers that our device is connectable.
54 ADVERTISEMENT_TYPE_PERIPHERAL
55 };
56
57 using UUIDList = std::vector<std::string>;
58 using ManufacturerData = std::map<uint16_t, std::vector<uint8_t>>;
59 using ServiceData = std::map<std::string, std::vector<uint8_t>>;
60
61 // Structure that holds the data for an advertisement.
62 class DEVICE_BLUETOOTH_EXPORT Data {
63 public:
64 explicit Data(AdvertisementType type);
65 ~Data();
66
67 AdvertisementType type() { return type_; }
68 std::unique_ptr<UUIDList> service_uuids() {
69 return std::move(service_uuids_);
70 }
71 std::unique_ptr<ManufacturerData> manufacturer_data() {
72 return std::move(manufacturer_data_);
73 }
74 std::unique_ptr<UUIDList> solicit_uuids() {
75 return std::move(solicit_uuids_);
76 }
77 std::unique_ptr<ServiceData> service_data() {
78 return std::move(service_data_);
79 }
80
81 void set_service_uuids(std::unique_ptr<UUIDList> service_uuids) {
82 service_uuids_ = std::move(service_uuids);
83 }
84 void set_manufacturer_data(
85 std::unique_ptr<ManufacturerData> manufacturer_data) {
86 manufacturer_data_ = std::move(manufacturer_data);
87 }
88 void set_solicit_uuids(std::unique_ptr<UUIDList> solicit_uuids) {
89 solicit_uuids_ = std::move(solicit_uuids);
90 }
91 void set_service_data(std::unique_ptr<ServiceData> service_data) {
92 service_data_ = std::move(service_data);
93 }
94
95 void set_include_tx_power(bool include_tx_power) {
96 include_tx_power_ = include_tx_power;
97 }
98
99 private:
100 Data();
101
102 AdvertisementType type_;
103 std::unique_ptr<UUIDList> service_uuids_;
104 std::unique_ptr<ManufacturerData> manufacturer_data_;
105 std::unique_ptr<UUIDList> solicit_uuids_;
106 std::unique_ptr<ServiceData> service_data_;
107 bool include_tx_power_;
108
109 DISALLOW_COPY_AND_ASSIGN(Data);
110 };
111
112 // Interface for observing changes to this advertisement.
113 class Observer {
114 public:
115 virtual ~Observer() {}
116
117 // Called when this advertisement is released and is no longer advertising.
118 virtual void AdvertisementReleased(
119 BluetoothAdvertisement* advertisement) = 0;
120 };
121
122 // Adds and removes observers for events for this advertisement.
123 void AddObserver(BluetoothAdvertisement::Observer* observer);
124 void RemoveObserver(BluetoothAdvertisement::Observer* observer);
125
126 // Unregisters this advertisement. Called on destruction of this object
127 // automatically but can be called directly to explicitly unregister this
128 // object.
129 using SuccessCallback = base::Closure;
130 using ErrorCallback = base::Callback<void(ErrorCode)>;
131 virtual void Unregister(const SuccessCallback& success_callback,
132 const ErrorCallback& error_callback) = 0;
133
134 protected:
135 friend class base::RefCounted<BluetoothAdvertisement>;
136
137 BluetoothAdvertisement();
138
139 // The destructor will unregister this advertisement.
140 virtual ~BluetoothAdvertisement();
141
142 // List of observers interested in event notifications from us. Objects in
143 // |observers_| are expected to outlive a BluetoothAdvertisement object.
144 base::ObserverList<BluetoothAdvertisement::Observer> observers_;
145
146 private:
147 DISALLOW_COPY_AND_ASSIGN(BluetoothAdvertisement);
148};
149
150} // namespace device
151
152#endif // DEVICE_BLUETOOTH_BLUETOOTH_ADVERTISEMENT_H_