Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: device/bluetooth/bluetooth_adapter_factory.cc

Issue 180163009: chrome.bluetooth API improvements. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review feedback. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/bluetooth/bluetooth_adapter_factory.h" 5 #include "device/bluetooth/bluetooth_adapter_factory.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "base/memory/weak_ptr.h" 12 #include "base/memory/weak_ptr.h"
13 #include "device/bluetooth/bluetooth_adapter.h" 13 #include "device/bluetooth/bluetooth_adapter.h"
14 14
15 #if defined(OS_CHROMEOS) 15 #if defined(OS_CHROMEOS)
16 #include "device/bluetooth/bluetooth_adapter_chromeos.h" 16 #include "device/bluetooth/bluetooth_adapter_chromeos.h"
17 #elif defined(OS_WIN) 17 #elif defined(OS_WIN)
18 #include "device/bluetooth/bluetooth_adapter_win.h" 18 #include "device/bluetooth/bluetooth_adapter_win.h"
19 #elif defined(OS_MACOSX) 19 #elif defined(OS_MACOSX)
20 #include "base/mac/mac_util.h" 20 #include "base/mac/mac_util.h"
21 #include "device/bluetooth/bluetooth_adapter_mac.h" 21 #include "device/bluetooth/bluetooth_adapter_mac.h"
22 #endif 22 #endif
23 23
24 namespace { 24 namespace {
25 25
26 using device::BluetoothAdapter; 26 using device::BluetoothAdapter;
27 using device::BluetoothAdapterFactory; 27 using device::BluetoothAdapterFactory;
28 28
29 base::LazyInstance<BluetoothAdapterFactory> adapter_factory =
30 LAZY_INSTANCE_INITIALIZER;
31
29 // Shared default adapter instance, we don't want to keep this class around 32 // Shared default adapter instance, we don't want to keep this class around
30 // if nobody is using it so use a WeakPtr and create the object when needed; 33 // if nobody is using it so use a WeakPtr and create the object when needed;
31 // since Google C++ Style (and clang's static analyzer) forbids us having 34 // since Google C++ Style (and clang's static analyzer) forbids us having
32 // exit-time destructors we use a leaky lazy instance for it. 35 // exit-time destructors we use a leaky lazy instance for it.
33 base::LazyInstance<base::WeakPtr<device::BluetoothAdapter> >::Leaky 36 base::LazyInstance<base::WeakPtr<device::BluetoothAdapter> >::Leaky
34 default_adapter = LAZY_INSTANCE_INITIALIZER; 37 default_adapter = LAZY_INSTANCE_INITIALIZER;
35 38
36 typedef std::vector<BluetoothAdapterFactory::AdapterCallback> 39 typedef std::vector<BluetoothAdapterFactory::AdapterCallback>
37 AdapterCallbackList; 40 AdapterCallbackList;
38 41
(...skipping 15 matching lines...) Expand all
54 } 57 }
55 adapter_callbacks.Get().clear(); 58 adapter_callbacks.Get().clear();
56 } 59 }
57 #endif // defined(OS_WIN) 60 #endif // defined(OS_WIN)
58 61
59 } // namespace 62 } // namespace
60 63
61 namespace device { 64 namespace device {
62 65
63 // static 66 // static
67 void BluetoothAdapterFactory::SetAdapterInitializer(
68 AdapterInitializer initializer) {
69 adapter_factory.Get().adapter_initializer_ = initializer;
keybuk 2014/03/20 01:21:56 This doesn't run the initializer if the adapter is
rpaquay 2014/03/20 18:21:11 The issue is that the "device" layer needs initial
keybuk 2014/03/20 18:38:40 Sure, but the extensions::BluetoothAPI may not be
rpaquay 2014/03/25 20:06:10 These are all good points. After thinking about th
70 }
71
72 // static
64 bool BluetoothAdapterFactory::IsBluetoothAdapterAvailable() { 73 bool BluetoothAdapterFactory::IsBluetoothAdapterAvailable() {
65 #if defined(OS_CHROMEOS) 74 #if defined(OS_CHROMEOS)
66 return true; 75 return true;
67 #elif defined(OS_WIN) 76 #elif defined(OS_WIN)
68 return true; 77 return true;
69 #elif defined(OS_MACOSX) 78 #elif defined(OS_MACOSX)
70 return base::mac::IsOSLionOrLater(); 79 return base::mac::IsOSLionOrLater();
80 #else
81 return false;
71 #endif 82 #endif
72 return false;
73 } 83 }
74 84
75 // static 85 // static
76 void BluetoothAdapterFactory::GetAdapter(const AdapterCallback& callback) { 86 void BluetoothAdapterFactory::GetAdapter(const AdapterCallback& callback) {
77 if (!default_adapter.Get().get()) { 87 if (!default_adapter.Get().get()) {
78 #if defined(OS_CHROMEOS) 88 #if defined(OS_CHROMEOS)
79 chromeos::BluetoothAdapterChromeOS* new_adapter = 89 chromeos::BluetoothAdapterChromeOS* new_adapter =
80 new chromeos::BluetoothAdapterChromeOS(); 90 new chromeos::BluetoothAdapterChromeOS();
91 adapter_factory.Get().adapter_initializer_.Run(new_adapter);
81 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr(); 92 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr();
82 #elif defined(OS_WIN) 93 #elif defined(OS_WIN)
83 BluetoothAdapterWin* new_adapter = new BluetoothAdapterWin( 94 BluetoothAdapterWin* new_adapter = new BluetoothAdapterWin(
84 base::Bind(&RunAdapterCallbacks)); 95 base::Bind(&RunAdapterCallbacks));
85 new_adapter->Init(); 96 new_adapter->Init();
97 adapter_factory.Get().adapter_initializer_.Run(new_adapter);
keybuk 2014/03/20 01:21:56 the adapter might not be initialized yet?
rpaquay 2014/03/20 18:21:11 The initialization callback is intended to be part
keybuk 2014/03/20 18:38:40 Ack
86 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr(); 98 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr();
87 #elif defined(OS_MACOSX) 99 #elif defined(OS_MACOSX)
88 BluetoothAdapterMac* new_adapter = new BluetoothAdapterMac(); 100 BluetoothAdapterMac* new_adapter = new BluetoothAdapterMac();
89 new_adapter->Init(); 101 new_adapter->Init();
102 adapter_factory.Get().adapter_initializer_.Run(new_adapter);
keybuk 2014/03/20 01:21:56 adapter might not be initialized yet
rpaquay 2014/03/20 18:21:11 See Above.
90 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr(); 103 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr();
91 #endif 104 #endif
92 } 105 }
93 106
94 if (default_adapter.Get()->IsInitialized()) { 107 if (default_adapter.Get()->IsInitialized()) {
95 callback.Run(scoped_refptr<BluetoothAdapter>(default_adapter.Get().get())); 108 callback.Run(scoped_refptr<BluetoothAdapter>(default_adapter.Get().get()));
96 } else { 109 } else {
97 adapter_callbacks.Get().push_back(callback); 110 adapter_callbacks.Get().push_back(callback);
98 } 111 }
99 } 112 }
100 113
101 // static 114 // static
102 scoped_refptr<BluetoothAdapter> BluetoothAdapterFactory::MaybeGetAdapter() { 115 scoped_refptr<BluetoothAdapter> BluetoothAdapterFactory::MaybeGetAdapter() {
103 return scoped_refptr<BluetoothAdapter>(default_adapter.Get().get()); 116 return scoped_refptr<BluetoothAdapter>(default_adapter.Get().get());
104 } 117 }
105 118
106 } // namespace device 119 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698