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

Side by Side Diff: chrome/browser/extensions/bluetooth_event_router.cc

Issue 11368145: Lazy-creates BluetoothAdapter in ExtensionBluetoothEventRouter (EBEE). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed .get, double assignment, etc Created 8 years, 1 month 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 | Annotate | Revision Log
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 "chrome/browser/extensions/bluetooth_event_router.h" 5 #include "chrome/browser/extensions/bluetooth_event_router.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string>
8 9
9 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
10 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
12 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h" 14 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h"
14 #include "chrome/browser/extensions/event_names.h" 15 #include "chrome/browser/extensions/event_names.h"
15 #include "chrome/browser/extensions/event_router.h" 16 #include "chrome/browser/extensions/event_router.h"
16 #include "chrome/browser/extensions/extension_system.h" 17 #include "chrome/browser/extensions/extension_system.h"
17 #include "chrome/common/extensions/api/bluetooth.h" 18 #include "chrome/common/extensions/api/bluetooth.h"
18 #include "device/bluetooth/bluetooth_adapter.h" 19 #include "device/bluetooth/bluetooth_adapter.h"
19 #include "device/bluetooth/bluetooth_adapter_factory.h" 20 #include "device/bluetooth/bluetooth_adapter_factory.h"
20 #include "device/bluetooth/bluetooth_device.h" 21 #include "device/bluetooth/bluetooth_device.h"
21 #include "device/bluetooth/bluetooth_socket.h" 22 #include "device/bluetooth/bluetooth_socket.h"
22 23
23 namespace extensions { 24 namespace extensions {
24 25
25 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile) 26 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile)
26 : send_discovery_events_(false), 27 : send_discovery_events_(false),
27 responsible_for_discovery_(false), 28 responsible_for_discovery_(false),
28 profile_(profile), 29 profile_(profile),
29 adapter_(device::BluetoothAdapterFactory::DefaultAdapter()), 30 adapter_(NULL),
31 num_event_listeners_(0),
30 next_socket_id_(1) { 32 next_socket_id_(1) {
31 DCHECK(profile_); 33 DCHECK(profile_);
32 if (adapter_.get())
33 adapter_->AddObserver(this);
34 } 34 }
35 35
36 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { 36 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() {
37 if (adapter_.get()) 37 if (adapter_)
38 adapter_->RemoveObserver(this); 38 ReleaseAdapter();
39 39
40 socket_map_.clear(); 40 socket_map_.clear();
41 } 41 }
42 42
43 scoped_refptr<const device::BluetoothAdapter>
44 ExtensionBluetoothEventRouter::adapter() {
45 return GetMutableAdapter();
46 }
47
48 scoped_refptr<device::BluetoothAdapter>
49 ExtensionBluetoothEventRouter::GetMutableAdapter() {
50 if (adapter_)
51 return adapter_;
52
53 return GetDefaultAdapter();
54 }
55
56 void ExtensionBluetoothEventRouter::InitializeAdapter() {
bryeung 2012/11/09 17:46:44 I'd like this renamed to InitializeAdapterIfNeeded
youngki 2012/11/12 23:25:24 Done.
57 adapter_ = GetDefaultAdapter();
bryeung 2012/11/09 17:46:44 Just call GetMutableAdapter here.
youngki 2012/11/12 23:25:24 Done.
58 adapter_->AddObserver(this);
59 }
60
61 void ExtensionBluetoothEventRouter::ReleaseAdapter() {
bryeung 2012/11/09 17:46:44 I'd like this to renamed MaybeReleaseAdapter and t
youngki 2012/11/12 23:25:24 Done.
62 adapter_->RemoveObserver(this);
63 adapter_ = NULL;
64 }
65
66 scoped_refptr<device::BluetoothAdapter>
67 ExtensionBluetoothEventRouter::GetDefaultAdapter() const {
68 return device::BluetoothAdapterFactory::DefaultAdapter();
bryeung 2012/11/09 17:46:44 this should be moved into GetMutableAdapter
youngki 2012/11/12 23:25:24 Done.
69 }
70
43 int ExtensionBluetoothEventRouter::RegisterSocket( 71 int ExtensionBluetoothEventRouter::RegisterSocket(
44 scoped_refptr<device::BluetoothSocket> socket) { 72 scoped_refptr<device::BluetoothSocket> socket) {
45 // If there is a socket registered with the same fd, just return it's id 73 // If there is a socket registered with the same fd, just return it's id
46 for (SocketMap::const_iterator i = socket_map_.begin(); 74 for (SocketMap::const_iterator i = socket_map_.begin();
47 i != socket_map_.end(); ++i) { 75 i != socket_map_.end(); ++i) {
48 if (i->second->fd() == socket->fd()) { 76 if (i->second->fd() == socket->fd()) {
49 return i->first; 77 return i->first;
50 } 78 }
51 } 79 }
52 int return_id = next_socket_id_++; 80 int return_id = next_socket_id_++;
53 socket_map_[return_id] = socket; 81 socket_map_[return_id] = socket;
82 if (!adapter_)
83 InitializeAdapter();
84
54 return return_id; 85 return return_id;
55 } 86 }
56 87
57 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { 88 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) {
58 SocketMap::iterator socket_entry = socket_map_.find(id); 89 SocketMap::iterator socket_entry = socket_map_.find(id);
59 if (socket_entry == socket_map_.end()) 90 if (socket_entry == socket_map_.end())
60 return false; 91 return false;
61 socket_map_.erase(socket_entry); 92 socket_map_.erase(socket_entry);
93 if (adapter_ && !IsAdapterNeeded())
94 ReleaseAdapter();
95
62 return true; 96 return true;
63 } 97 }
64 98
65 scoped_refptr<device::BluetoothSocket> 99 scoped_refptr<device::BluetoothSocket>
66 ExtensionBluetoothEventRouter::GetSocket(int id) { 100 ExtensionBluetoothEventRouter::GetSocket(int id) {
67 SocketMap::iterator socket_entry = socket_map_.find(id); 101 SocketMap::iterator socket_entry = socket_map_.find(id);
68 if (socket_entry == socket_map_.end()) 102 if (socket_entry == socket_map_.end())
69 return NULL; 103 return NULL;
70 return socket_entry->second; 104 return socket_entry->second;
71 } 105 }
72 106
107 // static
108 bool ExtensionBluetoothEventRouter::IsBluetoothEvent(
109 const std::string& event_name) {
110 return
111 event_name == extensions::event_names::kBluetoothOnAvailabilityChanged ||
112 event_name == extensions::event_names::kBluetoothOnDiscoveringChanged ||
113 event_name == extensions::event_names::kBluetoothOnPowerChanged;
114 }
115
116 bool ExtensionBluetoothEventRouter::IsAdapterNeeded() const {
117 return num_event_listeners_ > 0 || socket_map_.size() > 0;
118 }
119
120 void ExtensionBluetoothEventRouter::OnEventListenerAdded(
121 const std::string& event_name) {
122 if (IsBluetoothEvent(event_name)) {
123 num_event_listeners_++;
124 if (!adapter_)
125 InitializeAdapter();
126 }
127 }
128
129 void ExtensionBluetoothEventRouter::OnEventListenerRemoved(
130 const std::string& event_name) {
131 if (IsBluetoothEvent(event_name)) {
132 num_event_listeners_--;
133 DCHECK(num_event_listeners_ >= 0);
134 if (adapter_ && !IsAdapterNeeded())
135 ReleaseAdapter();
136 }
137 }
138
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( 139 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
74 bool responsible) { 140 bool responsible) {
75 responsible_for_discovery_ = responsible; 141 responsible_for_discovery_ = responsible;
76 } 142 }
77 143
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { 144 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const {
79 return responsible_for_discovery_; 145 return responsible_for_discovery_;
80 } 146 }
81 147
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { 148 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) {
(...skipping 13 matching lines...) Expand all
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 162 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
97 const char* event_name, const extensions::api::bluetooth::Device& device) { 163 const char* event_name, const extensions::api::bluetooth::Device& device) {
98 scoped_ptr<ListValue> args(new ListValue()); 164 scoped_ptr<ListValue> args(new ListValue());
99 args->Append(device.ToValue().release()); 165 args->Append(device.ToValue().release());
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> 166 extensions::ExtensionSystem::Get(profile_)->event_router()->
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 167 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
102 } 168 }
103 169
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 170 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
105 device::BluetoothAdapter* adapter, bool present) { 171 device::BluetoothAdapter* adapter, bool present) {
106 if (adapter != adapter_.get()) { 172 if (adapter != adapter_) {
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 173 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
108 return; 174 return;
109 } 175 }
110 176
111 DispatchBooleanValueEvent( 177 DispatchBooleanValueEvent(
112 extensions::event_names::kBluetoothOnAvailabilityChanged, 178 extensions::event_names::kBluetoothOnAvailabilityChanged,
113 present); 179 present);
114 } 180 }
115 181
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 182 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
117 device::BluetoothAdapter* adapter, bool has_power) { 183 device::BluetoothAdapter* adapter, bool has_power) {
118 if (adapter != adapter_.get()) { 184 if (adapter != adapter_) {
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 185 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
120 return; 186 return;
121 } 187 }
122 188
123 DispatchBooleanValueEvent( 189 DispatchBooleanValueEvent(
124 extensions::event_names::kBluetoothOnPowerChanged, 190 extensions::event_names::kBluetoothOnPowerChanged,
125 has_power); 191 has_power);
126 } 192 }
127 193
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 194 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
129 device::BluetoothAdapter* adapter, bool discovering) { 195 device::BluetoothAdapter* adapter, bool discovering) {
130 if (adapter != adapter_.get()) { 196 if (adapter != adapter_) {
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 197 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
132 return; 198 return;
133 } 199 }
134 200
135 if (!discovering) { 201 if (!discovering) {
136 send_discovery_events_ = false; 202 send_discovery_events_ = false;
137 responsible_for_discovery_ = false; 203 responsible_for_discovery_ = false;
138 discovered_devices_.clear(); 204 discovered_devices_.clear();
139 } 205 }
140 206
141 DispatchBooleanValueEvent( 207 DispatchBooleanValueEvent(
142 extensions::event_names::kBluetoothOnDiscoveringChanged, 208 extensions::event_names::kBluetoothOnDiscoveringChanged,
143 discovering); 209 discovering);
144 } 210 }
145 211
146 void ExtensionBluetoothEventRouter::DeviceAdded( 212 void ExtensionBluetoothEventRouter::DeviceAdded(
147 device::BluetoothAdapter* adapter, 213 device::BluetoothAdapter* adapter,
148 device::BluetoothDevice* device) { 214 device::BluetoothDevice* device) {
149 if (adapter != adapter_.get()) { 215 if (adapter != adapter_) {
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 216 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
151 return; 217 return;
152 } 218 }
153 219
154 extensions::api::bluetooth::Device* extension_device = 220 extensions::api::bluetooth::Device* extension_device =
155 new extensions::api::bluetooth::Device(); 221 new extensions::api::bluetooth::Device();
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( 222 extensions::api::bluetooth::BluetoothDeviceToApiDevice(
157 *device, extension_device); 223 *device, extension_device);
158 discovered_devices_.push_back(extension_device); 224 discovered_devices_.push_back(extension_device);
159 225
160 if (!send_discovery_events_) 226 if (!send_discovery_events_)
161 return; 227 return;
162 228
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, 229 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered,
164 *extension_device); 230 *extension_device);
165 } 231 }
166 232
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( 233 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent(
168 const char* event_name, bool value) { 234 const char* event_name, bool value) {
169 scoped_ptr<ListValue> args(new ListValue()); 235 scoped_ptr<ListValue> args(new ListValue());
170 args->Append(Value::CreateBooleanValue(value)); 236 args->Append(Value::CreateBooleanValue(value));
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> 237 extensions::ExtensionSystem::Get(profile_)->event_router()->
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 238 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
173 } 239 }
174 240
175 } // namespace extensions 241 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/bluetooth_event_router.h ('k') | chrome/browser/extensions/bluetooth_event_router_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698