Roll breakpad a513e85:7caf028 (svn 1384:1385)
[chromium-blink-merge.git] / device / bluetooth / bluetooth_task_manager_win.h
blob20024c853671c8334f5eb22c8d76d427aa5d6bb9
1 // Copyright (c) 2012 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.
5 #ifndef DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_
6 #define DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_
8 #include <string>
9 #include <vector>
11 #include "base/files/file_path.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/observer_list.h"
15 #include "base/win/scoped_handle.h"
16 #include "device/bluetooth/bluetooth_adapter.h"
18 namespace base {
20 class SequencedTaskRunner;
21 class SequencedWorkerPool;
23 } // namespace base
25 namespace device {
27 // Manages the blocking Bluetooth tasks using |SequencedWorkerPool|. It runs
28 // bluetooth tasks using |SequencedWorkerPool| and informs its observers of
29 // bluetooth adapter state changes and any other bluetooth device inquiry
30 // result.
32 // It delegates the blocking Windows API calls to |bluetooth_task_runner_|'s
33 // message loop, and receives responses via methods like OnAdapterStateChanged
34 // posted to UI thread.
35 class BluetoothTaskManagerWin
36 : public base::RefCountedThreadSafe<BluetoothTaskManagerWin> {
37 public:
38 struct AdapterState {
39 AdapterState();
40 ~AdapterState();
41 std::string name;
42 std::string address;
43 bool powered;
46 struct ServiceRecordState {
47 ServiceRecordState();
48 ~ServiceRecordState();
49 // Properties common to Bluetooth Classic and LE devices.
50 std::string name;
51 // Properties specific to Bluetooth Classic devices.
52 std::vector<uint8> sdp_bytes;
53 // Properties specific to Bluetooth LE devices.
54 BluetoothUUID gatt_uuid;
57 struct DeviceState {
58 DeviceState();
59 ~DeviceState();
61 bool is_bluetooth_classic() const { return path.empty(); }
63 // Properties common to Bluetooth Classic and LE devices.
64 std::string address; // This uniquely identifies the device.
65 std::string name; // Friendly name
66 bool visible;
67 bool connected;
68 bool authenticated;
69 ScopedVector<ServiceRecordState> service_record_states;
70 // Properties specific to Bluetooth Classic devices.
71 uint32 bluetooth_class;
72 // Properties specific to Bluetooth LE devices.
73 base::FilePath path;
76 class Observer {
77 public:
78 virtual ~Observer() {}
80 virtual void AdapterStateChanged(const AdapterState& state) {}
81 virtual void DiscoveryStarted(bool success) {}
82 virtual void DiscoveryStopped() {}
83 // Called when the adapter has just been polled for the list of *all* known
84 // devices. This includes devices previously paired, devices paired using
85 // the underlying Operating System UI, and devices discovered recently due
86 // to an active discovery session. Note that for a given device (address),
87 // the associated state can change over time. For example, during a
88 // discovery session, the "friendly" name may initially be "unknown" before
89 // the actual name is retrieved in subsequent poll events.
90 virtual void DevicesPolled(const ScopedVector<DeviceState>& devices) {}
93 explicit BluetoothTaskManagerWin(
94 scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
96 void AddObserver(Observer* observer);
97 void RemoveObserver(Observer* observer);
99 void Initialize();
100 void InitializeWithBluetoothTaskRunner(
101 scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner);
102 void Shutdown();
104 void PostSetPoweredBluetoothTask(
105 bool powered,
106 const base::Closure& callback,
107 const BluetoothAdapter::ErrorCallback& error_callback);
108 void PostStartDiscoveryTask();
109 void PostStopDiscoveryTask();
111 private:
112 friend class base::RefCountedThreadSafe<BluetoothTaskManagerWin>;
113 friend class BluetoothTaskManagerWinTest;
115 static const int kPollIntervalMs;
117 virtual ~BluetoothTaskManagerWin();
119 // Logs Win32 errors occuring during polling on the worker thread. The method
120 // may discards messages to avoid logging being too verbose.
121 void LogPollingError(const char* message, int win32_error);
123 // Notify all Observers of updated AdapterState. Should only be called on the
124 // UI thread.
125 void OnAdapterStateChanged(const AdapterState* state);
126 void OnDiscoveryStarted(bool success);
127 void OnDiscoveryStopped();
128 void OnDevicesPolled(const ScopedVector<DeviceState>* devices);
130 // Called on BluetoothTaskRunner.
131 void StartPolling();
132 void PollAdapter();
133 void PostAdapterStateToUi();
134 void SetPowered(bool powered,
135 const base::Closure& callback,
136 const BluetoothAdapter::ErrorCallback& error_callback);
138 // Starts discovery. Once the discovery starts, it issues a discovery inquiry
139 // with a short timeout, then issues more inquiries with greater timeout
140 // values. The discovery finishes when StopDiscovery() is called or timeout
141 // has reached its maximum value.
142 void StartDiscovery();
143 void StopDiscovery();
145 // Issues a device inquiry that runs for |timeout_multiplier| * 1.28 seconds.
146 // This posts itself again with |timeout_multiplier| + 1 until
147 // |timeout_multiplier| reaches the maximum value or stop discovery call is
148 // received.
149 void DiscoverDevices(int timeout_multiplier);
151 // Fetch already known device information. Similar to |StartDiscovery|, except
152 // this function does not issue a discovery inquiry. Instead it gets the
153 // device info cached in the adapter.
154 void GetKnownDevices();
156 // Looks for Bluetooth Classic and Low Energy devices, as well as the services
157 // exposed by those devices.
158 bool SearchDevices(int timeout_multiplier,
159 bool search_cached_devices_only,
160 ScopedVector<DeviceState>* device_list);
162 // Sends a device search API call to the adapter to look for Bluetooth Classic
163 // devices.
164 bool SearchClassicDevices(int timeout_multiplier,
165 bool search_cached_devices_only,
166 ScopedVector<DeviceState>* device_list);
168 // Enumerate Bluetooth Low Energy devices.
169 bool SearchLowEnergyDevices(ScopedVector<DeviceState>* device_list);
171 // Discover services for the devices in |device_list|.
172 bool DiscoverServices(ScopedVector<DeviceState>* device_list,
173 bool search_cached_services_only);
175 // Discover Bluetooth Classic services for the given |device_address|.
176 bool DiscoverClassicDeviceServices(
177 const std::string& device_address,
178 const GUID& protocol_uuid,
179 bool search_cached_services_only,
180 ScopedVector<ServiceRecordState>* service_record_states);
182 // Discover Bluetooth Classic services for the given |device_address|.
183 // Returns a Win32 error code.
184 int DiscoverClassicDeviceServicesWorker(
185 const std::string& device_address,
186 const GUID& protocol_uuid,
187 bool search_cached_services_only,
188 ScopedVector<ServiceRecordState>* service_record_states);
190 // Discover Bluetooth Low Energy services for the given |device_path|.
191 bool DiscoverLowEnergyDeviceServices(
192 const base::FilePath& device_path,
193 ScopedVector<ServiceRecordState>* service_record_states);
195 // UI task runner reference.
196 scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
198 scoped_refptr<base::SequencedWorkerPool> worker_pool_;
199 scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner_;
201 // List of observers interested in event notifications.
202 ObserverList<Observer> observers_;
204 // Adapter handle owned by bluetooth task runner.
205 base::win::ScopedHandle adapter_handle_;
207 // indicates whether the adapter is in discovery mode or not.
208 bool discovering_;
210 // Use for discarding too many log messages.
211 base::TimeTicks current_logging_batch_ticks_;
212 int current_logging_batch_count_;
214 DISALLOW_COPY_AND_ASSIGN(BluetoothTaskManagerWin);
217 } // namespace device
219 #endif // DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_