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

Side by Side Diff: extensions/browser/api/bluetooth/bluetooth_event_router.cc

Issue 1412493002: Bluetooth extension api fixes for WebUI (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@issue_543294_bluetooth_idl
Patch Set: Feedback Created 5 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
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 "extensions/browser/api/bluetooth/bluetooth_event_router.h" 5 #include "extensions/browser/api/bluetooth/bluetooth_event_router.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 19 matching lines...) Expand all
30 #include "extensions/common/api/bluetooth.h" 30 #include "extensions/common/api/bluetooth.h"
31 #include "extensions/common/api/bluetooth_private.h" 31 #include "extensions/common/api/bluetooth_private.h"
32 32
33 namespace extensions { 33 namespace extensions {
34 34
35 namespace bluetooth = api::bluetooth; 35 namespace bluetooth = api::bluetooth;
36 namespace bt_private = api::bluetooth_private; 36 namespace bt_private = api::bluetooth_private;
37 37
38 BluetoothEventRouter::BluetoothEventRouter(content::BrowserContext* context) 38 BluetoothEventRouter::BluetoothEventRouter(content::BrowserContext* context)
39 : browser_context_(context), 39 : browser_context_(context),
40 adapter_(NULL), 40 adapter_(nullptr),
41 num_event_listeners_(0), 41 num_event_listeners_(0),
42 extension_registry_observer_(this), 42 extension_registry_observer_(this),
43 weak_ptr_factory_(this) { 43 weak_ptr_factory_(this) {
44 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 44 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
45 DCHECK(browser_context_); 45 DCHECK(browser_context_);
46 registrar_.Add(this, 46 registrar_.Add(this,
47 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, 47 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED,
48 content::Source<content::BrowserContext>(browser_context_)); 48 content::Source<content::BrowserContext>(browser_context_));
49 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); 49 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
50 } 50 }
51 51
52 BluetoothEventRouter::~BluetoothEventRouter() { 52 BluetoothEventRouter::~BluetoothEventRouter() {
53 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 53 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
54 if (adapter_.get()) { 54 if (adapter_.get()) {
55 adapter_->RemoveObserver(this); 55 adapter_->RemoveObserver(this);
56 adapter_ = NULL; 56 adapter_ = nullptr;
57 } 57 }
58 CleanUpAllExtensions(); 58 CleanUpAllExtensions();
59 } 59 }
60 60
61 bool BluetoothEventRouter::IsBluetoothSupported() const { 61 bool BluetoothEventRouter::IsBluetoothSupported() const {
62 return adapter_.get() || 62 return adapter_.get() ||
63 device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable(); 63 device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable();
64 } 64 }
65 65
66 void BluetoothEventRouter::GetAdapter( 66 void BluetoothEventRouter::GetAdapter(
67 const device::BluetoothAdapterFactory::AdapterCallback& callback) { 67 const device::BluetoothAdapterFactory::AdapterCallback& callback) {
68 if (adapter_.get()) { 68 if (adapter_.get()) {
69 callback.Run(scoped_refptr<device::BluetoothAdapter>(adapter_)); 69 callback.Run(scoped_refptr<device::BluetoothAdapter>(adapter_));
70 return; 70 return;
71 } 71 }
72 72
73 device::BluetoothAdapterFactory::GetAdapter(callback); 73 device::BluetoothAdapterFactory::GetAdapter(callback);
74 } 74 }
75 75
76 void BluetoothEventRouter::StartDiscoverySession( 76 void BluetoothEventRouter::StartDiscoverySession(
77 device::BluetoothAdapter* adapter, 77 device::BluetoothAdapter* adapter,
78 const std::string& extension_id, 78 const std::string& extension_id,
79 const base::Closure& callback, 79 const base::Closure& callback,
80 const base::Closure& error_callback) { 80 const base::Closure& error_callback) {
81 if (adapter != adapter_.get()) { 81 if (!adapter_.get() && IsBluetoothSupported()) {
82 // If |adapter_| isn't set yet, call GetAdapter() which will synchronously
83 // invoke the callback (StartDiscoverySessionImpl).
84 GetAdapter(base::Bind(
85 &BluetoothEventRouter::OnAdapterInitialized,
86 weak_ptr_factory_.GetWeakPtr(),
87 base::Bind(&BluetoothEventRouter::StartDiscoverySessionImpl,
88 weak_ptr_factory_.GetWeakPtr(), make_scoped_refptr(adapter),
89 extension_id, callback, error_callback)));
90 return;
91 }
92 StartDiscoverySessionImpl(adapter, extension_id, callback, error_callback);
93 }
94
95 void BluetoothEventRouter::StartDiscoverySessionImpl(
96 device::BluetoothAdapter* adapter,
97 const std::string& extension_id,
98 const base::Closure& callback,
99 const base::Closure& error_callback) {
100 if (!adapter_.get()) {
101 LOG(ERROR) << "Unable to get Bluetooth adapter.";
82 error_callback.Run(); 102 error_callback.Run();
83 return; 103 return;
84 } 104 }
105 if (adapter != adapter_.get()) {
106 LOG(ERROR) << "Bluetooth adapter mismatch.";
107 error_callback.Run();
108 return;
109 }
85 DiscoverySessionMap::iterator iter = 110 DiscoverySessionMap::iterator iter =
86 discovery_session_map_.find(extension_id); 111 discovery_session_map_.find(extension_id);
87 if (iter != discovery_session_map_.end() && iter->second->IsActive()) { 112 if (iter != discovery_session_map_.end() && iter->second->IsActive()) {
88 DVLOG(1) << "An active discovery session exists for extension."; 113 DVLOG(1) << "An active discovery session exists for extension.";
89 error_callback.Run(); 114 error_callback.Run();
90 return; 115 return;
91 } 116 }
92 117
93 // Check whether user pre set discovery filter by calling SetDiscoveryFilter 118 // Check whether user pre set discovery filter by calling SetDiscoveryFilter
94 // before. If the user has set a discovery filter then start a filtered 119 // before. If the user has set a discovery filter then start a filtered
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 179
155 // extension is already running discovery, update it's discovery filter 180 // extension is already running discovery, update it's discovery filter
156 iter->second->SetDiscoveryFilter(discovery_filter.Pass(), callback, 181 iter->second->SetDiscoveryFilter(discovery_filter.Pass(), callback,
157 error_callback); 182 error_callback);
158 } 183 }
159 184
160 BluetoothApiPairingDelegate* BluetoothEventRouter::GetPairingDelegate( 185 BluetoothApiPairingDelegate* BluetoothEventRouter::GetPairingDelegate(
161 const std::string& extension_id) { 186 const std::string& extension_id) {
162 return ContainsKey(pairing_delegate_map_, extension_id) 187 return ContainsKey(pairing_delegate_map_, extension_id)
163 ? pairing_delegate_map_[extension_id] 188 ? pairing_delegate_map_[extension_id]
164 : NULL; 189 : nullptr;
165 } 190 }
166 191
167 void BluetoothEventRouter::OnAdapterInitialized( 192 void BluetoothEventRouter::OnAdapterInitialized(
168 const base::Closure& callback, 193 const base::Closure& callback,
169 scoped_refptr<device::BluetoothAdapter> adapter) { 194 scoped_refptr<device::BluetoothAdapter> adapter) {
170 if (!adapter_.get()) { 195 if (!adapter_.get()) {
171 adapter_ = adapter; 196 adapter_ = adapter;
172 adapter_->AddObserver(this); 197 adapter_->AddObserver(this);
173 } 198 }
174 199
175 callback.Run(); 200 callback.Run();
176 } 201 }
177 202
178 void BluetoothEventRouter::MaybeReleaseAdapter() { 203 void BluetoothEventRouter::MaybeReleaseAdapter() {
179 if (adapter_.get() && num_event_listeners_ == 0 && 204 if (adapter_.get() && num_event_listeners_ == 0 &&
180 pairing_delegate_map_.empty()) { 205 pairing_delegate_map_.empty()) {
206 VLOG(1) << "Releasing Adapter.";
181 adapter_->RemoveObserver(this); 207 adapter_->RemoveObserver(this);
182 adapter_ = NULL; 208 adapter_ = nullptr;
183 } 209 }
184 } 210 }
185 211
186 void BluetoothEventRouter::AddPairingDelegate(const std::string& extension_id) { 212 void BluetoothEventRouter::AddPairingDelegate(const std::string& extension_id) {
187 if (!adapter_.get()) { 213 if (!adapter_.get() && IsBluetoothSupported()) {
188 base::Closure self_callback = 214 GetAdapter(
189 base::Bind(&BluetoothEventRouter::AddPairingDelegate, 215 base::Bind(&BluetoothEventRouter::OnAdapterInitialized,
190 weak_ptr_factory_.GetWeakPtr(), 216 weak_ptr_factory_.GetWeakPtr(),
191 extension_id); 217 base::Bind(&BluetoothEventRouter::AddPairingDelegateImpl,
192 GetAdapter(base::Bind(&BluetoothEventRouter::OnAdapterInitialized, 218 weak_ptr_factory_.GetWeakPtr(), extension_id)));
193 weak_ptr_factory_.GetWeakPtr(),
194 self_callback));
195 return; 219 return;
196 } 220 }
221 AddPairingDelegateImpl(extension_id);
222 }
197 223
224 void BluetoothEventRouter::AddPairingDelegateImpl(
225 const std::string& extension_id) {
226 if (!adapter_.get()) {
227 LOG(ERROR) << "Unable to get adatper.";
228 return;
229 }
198 if (!ContainsKey(pairing_delegate_map_, extension_id)) { 230 if (!ContainsKey(pairing_delegate_map_, extension_id)) {
199 BluetoothApiPairingDelegate* delegate = 231 BluetoothApiPairingDelegate* delegate =
200 new BluetoothApiPairingDelegate(extension_id, browser_context_); 232 new BluetoothApiPairingDelegate(extension_id, browser_context_);
201 DCHECK(adapter_.get()); 233 DCHECK(adapter_.get());
202 adapter_->AddPairingDelegate( 234 adapter_->AddPairingDelegate(
203 delegate, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH); 235 delegate, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH);
204 pairing_delegate_map_[extension_id] = delegate; 236 pairing_delegate_map_[extension_id] = delegate;
205 } else { 237 } else {
206 LOG(ERROR) << "Pairing delegate already exists for extension. " 238 LOG(ERROR) << "Pairing delegate already exists for extension. "
207 << "There should be at most one onPairing listener."; 239 << "There should be at most one onPairing listener.";
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 iter != discovery_session_map_.end(); 291 iter != discovery_session_map_.end();
260 ++iter) { 292 ++iter) {
261 device::BluetoothDiscoverySession* session = iter->second; 293 device::BluetoothDiscoverySession* session = iter->second;
262 if (session->IsActive()) { 294 if (session->IsActive()) {
263 active_session_map[iter->first] = session; 295 active_session_map[iter->first] = session;
264 continue; 296 continue;
265 } 297 }
266 delete session; 298 delete session;
267 } 299 }
268 discovery_session_map_.swap(active_session_map); 300 discovery_session_map_.swap(active_session_map);
269 MaybeReleaseAdapter();
270 } 301 }
271 302
272 DispatchAdapterStateEvent(); 303 DispatchAdapterStateEvent();
304
305 // Release the adapter after dispatching the event.
306 if (!discovering)
307 MaybeReleaseAdapter();
273 } 308 }
274 309
275 void BluetoothEventRouter::DeviceAdded(device::BluetoothAdapter* adapter, 310 void BluetoothEventRouter::DeviceAdded(device::BluetoothAdapter* adapter,
276 device::BluetoothDevice* device) { 311 device::BluetoothDevice* device) {
277 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 312 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
278 if (adapter != adapter_.get()) { 313 if (adapter != adapter_.get()) {
279 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 314 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
280 return; 315 return;
281 } 316 }
282 317
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 355
321 void BluetoothEventRouter::OnListenerRemoved() { 356 void BluetoothEventRouter::OnListenerRemoved() {
322 if (num_event_listeners_ > 0) 357 if (num_event_listeners_ > 0)
323 num_event_listeners_--; 358 num_event_listeners_--;
324 MaybeReleaseAdapter(); 359 MaybeReleaseAdapter();
325 } 360 }
326 361
327 void BluetoothEventRouter::DispatchAdapterStateEvent() { 362 void BluetoothEventRouter::DispatchAdapterStateEvent() {
328 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 363 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
329 api::bluetooth::AdapterState state; 364 api::bluetooth::AdapterState state;
365 CHECK(adapter_.get());
330 PopulateAdapterState(*adapter_.get(), &state); 366 PopulateAdapterState(*adapter_.get(), &state);
331 367
332 scoped_ptr<base::ListValue> args = 368 scoped_ptr<base::ListValue> args =
333 bluetooth::OnAdapterStateChanged::Create(state); 369 bluetooth::OnAdapterStateChanged::Create(state);
334 scoped_ptr<Event> event( 370 scoped_ptr<Event> event(
335 new Event(events::BLUETOOTH_ON_ADAPTER_STATE_CHANGED, 371 new Event(events::BLUETOOTH_ON_ADAPTER_STATE_CHANGED,
336 bluetooth::OnAdapterStateChanged::kEventName, args.Pass())); 372 bluetooth::OnAdapterStateChanged::kEventName, args.Pass()));
337 EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass()); 373 EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
338 } 374 }
339 375
340 void BluetoothEventRouter::DispatchDeviceEvent( 376 void BluetoothEventRouter::DispatchDeviceEvent(
341 events::HistogramValue histogram_value, 377 events::HistogramValue histogram_value,
342 const std::string& event_name, 378 const std::string& event_name,
343 device::BluetoothDevice* device) { 379 device::BluetoothDevice* device) {
344 bluetooth::Device extension_device; 380 bluetooth::Device extension_device;
381 CHECK(device);
345 bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device); 382 bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device);
346 383
347 scoped_ptr<base::ListValue> args = 384 scoped_ptr<base::ListValue> args =
348 bluetooth::OnDeviceAdded::Create(extension_device); 385 bluetooth::OnDeviceAdded::Create(extension_device);
349 scoped_ptr<Event> event(new Event(histogram_value, event_name, args.Pass())); 386 scoped_ptr<Event> event(new Event(histogram_value, event_name, args.Pass()));
350 EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass()); 387 EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
351 } 388 }
352 389
353 void BluetoothEventRouter::CleanUpForExtension( 390 void BluetoothEventRouter::CleanUpForExtension(
354 const std::string& extension_id) { 391 const std::string& extension_id) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 454 }
418 455
419 void BluetoothEventRouter::OnExtensionUnloaded( 456 void BluetoothEventRouter::OnExtensionUnloaded(
420 content::BrowserContext* browser_context, 457 content::BrowserContext* browser_context,
421 const Extension* extension, 458 const Extension* extension,
422 UnloadedExtensionInfo::Reason reason) { 459 UnloadedExtensionInfo::Reason reason) {
423 CleanUpForExtension(extension->id()); 460 CleanUpForExtension(extension->id());
424 } 461 }
425 462
426 } // namespace extensions 463 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698