blob: 2c787d66ec4635fabccd5a0a33e20459406764ba [file] [log] [blame]
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00001// 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.
4
5#ifndef DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_vector.h"
13#include "base/observer_list.h"
14#include "base/win/scoped_handle.h"
15#include "device/bluetooth/bluetooth_adapter.h"
16
17namespace base {
18
19class SequencedTaskRunner;
20class SequencedWorkerPool;
21
22} // namespace base
23
24namespace device {
25
26// Manages the blocking Bluetooth tasks using |SequencedWorkerPool|. It runs
27// bluetooth tasks using |SequencedWorkerPool| and informs its observers of
28// bluetooth adapter state changes and any other bluetooth device inquiry
29// result.
30//
31// It delegates the blocking Windows API calls to |bluetooth_task_runner_|'s
32// message loop, and receives responses via methods like OnAdapterStateChanged
33// posted to UI thread.
34class BluetoothTaskManagerWin
35 : public base::RefCountedThreadSafe<BluetoothTaskManagerWin> {
36 public:
37 struct AdapterState {
38 std::string name;
39 std::string address;
40 bool powered;
41 };
42
43 struct ServiceRecordState {
44 std::string name;
45 std::string address;
46 std::vector<uint8> sdp_bytes;
47 };
48
49 struct DeviceState {
50 std::string name;
51 std::string address;
52 uint32 bluetooth_class;
53 bool visible;
54 bool connected;
55 bool authenticated;
56 ScopedVector<ServiceRecordState> service_record_states;
57 };
58
59 class Observer {
60 public:
61 virtual ~Observer() {}
62
63 virtual void AdapterStateChanged(const AdapterState& state) {}
64 virtual void DiscoveryStarted(bool success) {}
65 virtual void DiscoveryStopped() {}
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010066 virtual void DevicesUpdated(const ScopedVector<DeviceState>& devices) {}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000067 virtual void DevicesDiscovered(const ScopedVector<DeviceState>& devices) {}
68 };
69
70 explicit BluetoothTaskManagerWin(
71 scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
72
73 void AddObserver(Observer* observer);
74 void RemoveObserver(Observer* observer);
75
76 void Initialize();
77 void InitializeWithBluetoothTaskRunner(
78 scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner);
79 void Shutdown();
80
81 void PostSetPoweredBluetoothTask(
82 bool powered,
83 const base::Closure& callback,
84 const BluetoothAdapter::ErrorCallback& error_callback);
85 void PostStartDiscoveryTask();
86 void PostStopDiscoveryTask();
87
88 private:
89 friend class base::RefCountedThreadSafe<BluetoothTaskManagerWin>;
90 friend class BluetoothTaskManagerWinTest;
91
92 static const int kPollIntervalMs;
93
94 virtual ~BluetoothTaskManagerWin();
95
96 // Notify all Observers of updated AdapterState. Should only be called on the
97 // UI thread.
98 void OnAdapterStateChanged(const AdapterState* state);
99 void OnDiscoveryStarted(bool success);
100 void OnDiscoveryStopped();
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100101 void OnDevicesUpdated(const ScopedVector<DeviceState>* devices);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000102 void OnDevicesDiscovered(const ScopedVector<DeviceState>* devices);
103
104 // Called on BluetoothTaskRunner.
105 void StartPolling();
106 void PollAdapter();
107 void PostAdapterStateToUi();
108 void SetPowered(bool powered,
109 const base::Closure& callback,
110 const BluetoothAdapter::ErrorCallback& error_callback);
111
112 // Starts discovery. Once the discovery starts, it issues a discovery inquiry
113 // with a short timeout, then issues more inquiries with greater timeout
114 // values. The discovery finishes when StopDiscovery() is called or timeout
115 // has reached its maximum value.
116 void StartDiscovery();
117 void StopDiscovery();
118
119 // Issues a device inquiry that runs for |timeout| * 1.28 seconds.
120 // This posts itself again with |timeout| + 1 until |timeout| reaches the
121 // maximum value or stop discovery call is received.
122 void DiscoverDevices(int timeout);
123
124 // Fetch already known device information. Similar to |StartDiscovery|, except
125 // this function does not issue a discovery inquiry. Instead it gets the
126 // device info cached in the adapter.
127 void GetKnownDevices();
128
129 // Sends a device search API call to the adapter.
130 void SearchDevices(int timeout,
131 bool search_cached_devices_only,
132 ScopedVector<DeviceState>* device_list);
133
134 // Discover services for the devices in |device_list|.
135 void DiscoverServices(ScopedVector<DeviceState>* device_list);
136
137 // UI task runner reference.
138 scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
139
140 scoped_refptr<base::SequencedWorkerPool> worker_pool_;
141 scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner_;
142
143 // List of observers interested in event notifications.
144 ObserverList<Observer> observers_;
145
146 // Adapter handle owned by bluetooth task runner.
147 base::win::ScopedHandle adapter_handle_;
148
149 // indicates whether the adapter is in discovery mode or not.
150 bool discovering_;
151
152 DISALLOW_COPY_AND_ASSIGN(BluetoothTaskManagerWin);
153};
154
155} // namespace device
156
157#endif // DEVICE_BLUETOOTH_BLUETOOTH_TASK_MANAGER_WIN_H_