blob: 9b0ac4aaf13611a04abcf56524c168eb3fd7ecf6 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +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_ADAPTER_WIN_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WIN_H_
7
8#include <string>
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00009#include <utility>
10#include <vector>
Torne (Richard Coles)58218062012-11-14 11:43:16 +000011
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010012#include "base/hash_tables.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000013#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_vector.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000015#include "base/memory/weak_ptr.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000016#include "base/threading/thread_checker.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000017#include "device/bluetooth/bluetooth_adapter.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000018#include "device/bluetooth/bluetooth_task_manager_win.h"
19
20namespace base {
21
22class SequencedTaskRunner;
23
24} // namespace base
Torne (Richard Coles)58218062012-11-14 11:43:16 +000025
26namespace device {
27
28class BluetoothAdapterFactory;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000029class BluetoothAdapterWinTest;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000030class BluetoothDevice;
31
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000032class BluetoothAdapterWin : public BluetoothAdapter,
33 public BluetoothTaskManagerWin::Observer {
34 public:
35 typedef base::Callback<void()> InitCallback;
36
Torne (Richard Coles)58218062012-11-14 11:43:16 +000037 // BluetoothAdapter override
38 virtual void AddObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
39 virtual void RemoveObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010040 virtual std::string GetAddress() const OVERRIDE;
41 virtual std::string GetName() const OVERRIDE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000042 virtual bool IsInitialized() const OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000043 virtual bool IsPresent() const OVERRIDE;
44 virtual bool IsPowered() const OVERRIDE;
45 virtual void SetPowered(
46 bool powered,
47 const base::Closure& callback,
48 const ErrorCallback& error_callback) OVERRIDE;
49 virtual bool IsDiscovering() const OVERRIDE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000050
51 virtual void StartDiscovering(
Torne (Richard Coles)58218062012-11-14 11:43:16 +000052 const base::Closure& callback,
53 const ErrorCallback& error_callback) OVERRIDE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000054 virtual void StopDiscovering(
55 const base::Closure& callback,
56 const ErrorCallback& error_callback) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000057 virtual void ReadLocalOutOfBandPairingData(
58 const BluetoothOutOfBandPairingDataCallback& callback,
59 const ErrorCallback& error_callback) OVERRIDE;
60
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000061 // BluetoothTaskManagerWin::Observer override
62 virtual void AdapterStateChanged(
63 const BluetoothTaskManagerWin::AdapterState& state) OVERRIDE;
64 virtual void DiscoveryStarted(bool success) OVERRIDE;
65 virtual void DiscoveryStopped() OVERRIDE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000066 virtual void DevicesDiscovered(
67 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices)
68 OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000069
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010070 virtual void DevicesUpdated(
71 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices)
72 OVERRIDE;
73
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000074 private:
75 friend class BluetoothAdapterFactory;
76 friend class BluetoothAdapterWinTest;
77
78 enum DiscoveryStatus {
79 NOT_DISCOVERING,
80 DISCOVERY_STARTING,
81 DISCOVERING,
82 DISCOVERY_STOPPING
83 };
84
85 explicit BluetoothAdapterWin(const InitCallback& init_callback);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000086 virtual ~BluetoothAdapterWin();
87
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010088 void Init();
89 void InitForTest(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000090 scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
91 scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner);
92
93 void MaybePostStartDiscoveryTask();
94 void MaybePostStopDiscoveryTask();
95
96 InitCallback init_callback_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010097 std::string address_;
98 std::string name_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000099 bool initialized_;
100 bool powered_;
101 DiscoveryStatus discovery_status_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100102 base::hash_set<std::string> discovered_devices_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000103
104 std::vector<std::pair<base::Closure, ErrorCallback> >
105 on_start_discovery_callbacks_;
106 std::vector<base::Closure> on_stop_discovery_callbacks_;
107 size_t num_discovery_listeners_;
108
109 scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
110 scoped_refptr<BluetoothTaskManagerWin> task_manager_;
111
112 base::ThreadChecker thread_checker_;
113
114 // List of observers interested in event notifications from us.
115 ObserverList<BluetoothAdapter::Observer> observers_;
116
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000117 // NOTE: This should remain the last member so it'll be destroyed and
118 // invalidate its weak pointers before any other members are destroyed.
119 base::WeakPtrFactory<BluetoothAdapterWin> weak_ptr_factory_;
120
121 DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterWin);
122};
123
124} // namespace device
125
126#endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WIN_H_