forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbluetooth_adapter_factory.h
162 lines (132 loc) · 6.45 KB
/
bluetooth_adapter_factory.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (c) 2012 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_ADAPTER_FACTORY_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_FACTORY_H_
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_export.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/data_decoder/public/mojom/ble_scan_parser.mojom-forward.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace device {
// A factory class for building a Bluetooth adapter on platforms where Bluetooth
// is available.
//
// Testing: Clients that want to specify their own return values for
// BluetoothAdapterFactory's functions need to call InitValuesForTesting().
// If this function has been called, the Factory will return the specified
// test values instead of the default values.
//
// Only IsLowEnergySupported uses ValuesForTesting.
// TODO(crbug.com/569709): Use ValuesForTesting for all functions.
class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterFactory {
public:
using AdapterCallback =
base::OnceCallback<void(scoped_refptr<BluetoothAdapter> adapter)>;
#if BUILDFLAG(IS_CHROMEOS_ASH)
using BleScanParserCallback = base::RepeatingCallback<
mojo::PendingRemote<data_decoder::mojom::BleScanParser>()>;
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
BluetoothAdapterFactory();
~BluetoothAdapterFactory();
static BluetoothAdapterFactory* Get();
// Returns true if the platform supports Bluetooth. It does not imply that
// there is a Bluetooth radio. Use BluetoothAdapter::IsPresent to know
// if there is a Bluetooth radio present.
static bool IsBluetoothSupported();
// Returns true if the platform supports Bluetooth Low Energy. This is
// independent of whether or not there is a Bluetooth radio present e.g.
// Windows 7 does not support BLE so IsLowEnergySupported would return
// false. Windows 10, on the other hand, supports BLE so this function
// returns true even if there is no Bluetooth radio on the system.
bool IsLowEnergySupported();
// Returns the shared instance of the default adapter, creating and
// initializing it if necessary. |callback| is called with the adapter
// instance passed only once the adapter is fully initialized and ready to
// use.
void GetAdapter(AdapterCallback callback);
// Returns the shared instance of the classic adapter, creating and
// initializing it if necessary. |callback| is called with the adapter
// instance passed only once the adapter is fully initialized and ready to
// use.
// For all platforms except Windows this is equivalent to calling
// GetAdapter(), as the default adapter already supports Bluetooth classic.
void GetClassicAdapter(AdapterCallback callback);
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
// Calls |BluetoothAdapter::Shutdown| on the adapter if
// present.
static void Shutdown();
#endif
// Sets the shared instance of the default adapter for testing purposes only,
// no reference is retained after completion of the call, removing the last
// reference will reset the factory.
static void SetAdapterForTesting(scoped_refptr<BluetoothAdapter> adapter);
// Returns true iff the implementation has a (non-NULL) shared instance of the
// adapter. Exposed for testing.
static bool HasSharedInstanceForTesting();
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Sets the mojo::Remote<BleScanParser> callback used in Get*() below.
static void SetBleScanParserCallback(BleScanParserCallback callback);
// Returns a reference to a parser for BLE advertisement packets.
// This will be an empty callback until something calls Set*() above.
static BleScanParserCallback GetBleScanParserCallback();
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
// ValuestForTesting holds the return values for BluetoothAdapterFactory's
// functions that have been set for testing.
class DEVICE_BLUETOOTH_EXPORT GlobalValuesForTesting {
public:
GlobalValuesForTesting();
~GlobalValuesForTesting();
void SetLESupported(bool supported) { le_supported_ = supported; }
bool GetLESupported() { return le_supported_; }
base::WeakPtr<GlobalValuesForTesting> GetWeakPtr();
private:
bool le_supported_ = false;
base::WeakPtrFactory<GlobalValuesForTesting> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(GlobalValuesForTesting);
};
// Returns an object that clients can use to control the return values
// of the Factory's functions. BluetoothAdapterFactory will keep a WeakPtr
// to this object so clients can just destroy the returned
// GlobalValuesForTesting to reset BluetoothAdapterFactory's returned
// values once they are done.
//
// Sometimes clients cannot guarantee that whey will reset all the values
// before another clients starts interacting with BluetoothAdapterFactory.
// By passing ownership of GlobalValuesForTesting to the clients, we
// ensure that only the last client that called
// InitGlobalValuesForTesting() will modify BluetoothAdapterFactory's
// returned values.
std::unique_ptr<GlobalValuesForTesting> InitGlobalValuesForTesting();
private:
void AdapterInitialized();
#if defined(OS_WIN)
void ClassicAdapterInitialized();
#endif
base::WeakPtr<GlobalValuesForTesting> values_for_testing_;
// While a new BluetoothAdapter is being initialized the factory retains a
// reference to it. After initialization is complete |adapter_callbacks_|
// are run and, to allow the class to be destroyed if nobody is using it,
// that reference is dropped and |adapter_| is used instead.
scoped_refptr<BluetoothAdapter> adapter_under_initialization_;
std::vector<AdapterCallback> adapter_callbacks_;
base::WeakPtr<BluetoothAdapter> adapter_;
#if defined(OS_WIN)
// On Windows different implementations of BluetoothAdapter are used for
// supporting Classic and Low Energy devices. The factory logic is duplicated.
scoped_refptr<BluetoothAdapter> classic_adapter_under_initialization_;
std::vector<AdapterCallback> classic_adapter_callbacks_;
base::WeakPtr<BluetoothAdapter> classic_adapter_;
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
BleScanParserCallback ble_scan_parser_;
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
};
} // namespace device
#endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_FACTORY_H_