OLD | NEW |
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/api/bluetooth/bluetooth_api.h" | 5 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 89 |
90 // static | 90 // static |
91 BluetoothAPI* BluetoothAPI::Get(BrowserContext* context) { | 91 BluetoothAPI* BluetoothAPI::Get(BrowserContext* context) { |
92 return GetFactoryInstance()->Get(context); | 92 return GetFactoryInstance()->Get(context); |
93 } | 93 } |
94 | 94 |
95 BluetoothAPI::BluetoothAPI(BrowserContext* context) | 95 BluetoothAPI::BluetoothAPI(BrowserContext* context) |
96 : browser_context_(context) { | 96 : browser_context_(context) { |
97 ExtensionSystem::Get(browser_context_)->event_router()->RegisterObserver( | 97 ExtensionSystem::Get(browser_context_)->event_router()->RegisterObserver( |
98 this, bluetooth::OnAdapterStateChanged::kEventName); | 98 this, bluetooth::OnAdapterStateChanged::kEventName); |
| 99 ExtensionSystem::Get(browser_context_)->event_router()->RegisterObserver( |
| 100 this, bluetooth::OnDeviceAdded::kEventName); |
| 101 ExtensionSystem::Get(browser_context_)->event_router()->RegisterObserver( |
| 102 this, bluetooth::OnDeviceChanged::kEventName); |
| 103 ExtensionSystem::Get(browser_context_)->event_router()->RegisterObserver( |
| 104 this, bluetooth::OnDeviceRemoved::kEventName); |
99 } | 105 } |
100 | 106 |
101 BluetoothAPI::~BluetoothAPI() { | 107 BluetoothAPI::~BluetoothAPI() { |
102 } | 108 } |
103 | 109 |
104 ExtensionBluetoothEventRouter* BluetoothAPI::bluetooth_event_router() { | 110 ExtensionBluetoothEventRouter* BluetoothAPI::bluetooth_event_router() { |
105 if (!bluetooth_event_router_) | 111 if (!bluetooth_event_router_) |
106 bluetooth_event_router_.reset( | 112 bluetooth_event_router_.reset( |
107 new ExtensionBluetoothEventRouter(browser_context_)); | 113 new ExtensionBluetoothEventRouter(browser_context_)); |
108 | 114 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 | 271 |
266 bool BluetoothGetAdapterStateFunction::DoWork( | 272 bool BluetoothGetAdapterStateFunction::DoWork( |
267 scoped_refptr<BluetoothAdapter> adapter) { | 273 scoped_refptr<BluetoothAdapter> adapter) { |
268 bluetooth::AdapterState state; | 274 bluetooth::AdapterState state; |
269 PopulateAdapterState(*adapter.get(), &state); | 275 PopulateAdapterState(*adapter.get(), &state); |
270 SetResult(state.ToValue().release()); | 276 SetResult(state.ToValue().release()); |
271 SendResponse(true); | 277 SendResponse(true); |
272 return true; | 278 return true; |
273 } | 279 } |
274 | 280 |
275 BluetoothGetDevicesFunction::BluetoothGetDevicesFunction() | |
276 : device_events_sent_(0) {} | |
277 | |
278 void BluetoothGetDevicesFunction::DispatchDeviceSearchResult( | |
279 const BluetoothDevice& device) { | |
280 bluetooth::Device extension_device; | |
281 bluetooth::BluetoothDeviceToApiDevice(device, &extension_device); | |
282 GetEventRouter(browser_context())->DispatchDeviceEvent( | |
283 extensions::event_names::kBluetoothOnDeviceSearchResult, | |
284 extension_device); | |
285 | |
286 device_events_sent_++; | |
287 } | |
288 | |
289 void BluetoothGetDevicesFunction::FinishDeviceSearch() { | |
290 scoped_ptr<base::ListValue> args(new base::ListValue()); | |
291 scoped_ptr<base::DictionaryValue> info(new base::DictionaryValue()); | |
292 info->SetInteger("expectedEventCount", device_events_sent_); | |
293 args->Append(info.release()); | |
294 | |
295 scoped_ptr<extensions::Event> event(new extensions::Event( | |
296 extensions::event_names::kBluetoothOnDeviceSearchFinished, args.Pass())); | |
297 extensions::ExtensionSystem::Get(browser_context()) | |
298 ->event_router() | |
299 ->BroadcastEvent(event.Pass()); | |
300 | |
301 SendResponse(true); | |
302 } | |
303 | |
304 bool BluetoothGetDevicesFunction::DoWork( | 281 bool BluetoothGetDevicesFunction::DoWork( |
305 scoped_refptr<BluetoothAdapter> adapter) { | 282 scoped_refptr<BluetoothAdapter> adapter) { |
306 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 283 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
307 | 284 |
308 scoped_ptr<GetDevices::Params> params(GetDevices::Params::Create(*args_)); | 285 base::ListValue* device_list = new base::ListValue; |
309 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); | 286 SetResult(device_list); |
310 const bluetooth::GetDevicesOptions& options = params->options; | |
311 | |
312 std::string uuid; | |
313 if (options.profile.get() != NULL) { | |
314 uuid = options.profile->uuid; | |
315 if (!BluetoothDevice::IsUUIDValid(uuid)) { | |
316 SetError(kInvalidUuid); | |
317 SendResponse(false); | |
318 return false; | |
319 } | |
320 } | |
321 | 287 |
322 BluetoothAdapter::DeviceList devices = adapter->GetDevices(); | 288 BluetoothAdapter::DeviceList devices = adapter->GetDevices(); |
323 for (BluetoothAdapter::DeviceList::const_iterator iter = devices.begin(); | 289 for (BluetoothAdapter::DeviceList::const_iterator iter = devices.begin(); |
324 iter != devices.end(); | 290 iter != devices.end(); |
325 ++iter) { | 291 ++iter) { |
326 const BluetoothDevice* device = *iter; | 292 const BluetoothDevice* device = *iter; |
327 DCHECK(device); | 293 DCHECK(device); |
328 if (uuid.empty() || device->ProvidesServiceWithUUID(uuid)) | 294 |
329 DispatchDeviceSearchResult(*device); | 295 bluetooth::Device extension_device; |
| 296 bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device); |
| 297 |
| 298 device_list->Append(extension_device.ToValue().release()); |
330 } | 299 } |
331 | 300 |
332 FinishDeviceSearch(); | 301 SendResponse(true); |
333 | 302 |
334 return true; | 303 return true; |
335 } | 304 } |
336 | 305 |
337 void BluetoothGetServicesFunction::GetServiceRecordsCallback( | 306 void BluetoothGetServicesFunction::GetServiceRecordsCallback( |
338 base::ListValue* services, | 307 base::ListValue* services, |
339 const BluetoothDevice::ServiceRecordList& records) { | 308 const BluetoothDevice::ServiceRecordList& records) { |
340 for (BluetoothDevice::ServiceRecordList::const_iterator i = records.begin(); | 309 for (BluetoothDevice::ServiceRecordList::const_iterator i = records.begin(); |
341 i != records.end(); ++i) { | 310 i != records.end(); ++i) { |
342 const BluetoothServiceRecord& record = **i; | 311 const BluetoothServiceRecord& record = **i; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 return true; | 599 return true; |
631 } | 600 } |
632 | 601 |
633 void BluetoothStartDiscoveryFunction::OnSuccessCallback() { | 602 void BluetoothStartDiscoveryFunction::OnSuccessCallback() { |
634 SendResponse(true); | 603 SendResponse(true); |
635 } | 604 } |
636 | 605 |
637 void BluetoothStartDiscoveryFunction::OnErrorCallback() { | 606 void BluetoothStartDiscoveryFunction::OnErrorCallback() { |
638 SetError(kStartDiscoveryFailed); | 607 SetError(kStartDiscoveryFailed); |
639 SendResponse(false); | 608 SendResponse(false); |
640 GetEventRouter(browser_context())->OnListenerRemoved(); | |
641 } | 609 } |
642 | 610 |
643 bool BluetoothStartDiscoveryFunction::DoWork( | 611 bool BluetoothStartDiscoveryFunction::DoWork( |
644 scoped_refptr<BluetoothAdapter> adapter) { | 612 scoped_refptr<BluetoothAdapter> adapter) { |
645 GetEventRouter(browser_context())->OnListenerAdded(); | |
646 GetEventRouter(browser_context())->StartDiscoverySession( | 613 GetEventRouter(browser_context())->StartDiscoverySession( |
647 adapter, | 614 adapter, |
648 extension_id(), | 615 extension_id(), |
649 base::Bind(&BluetoothStartDiscoveryFunction::OnSuccessCallback, this), | 616 base::Bind(&BluetoothStartDiscoveryFunction::OnSuccessCallback, this), |
650 base::Bind(&BluetoothStartDiscoveryFunction::OnErrorCallback, this)); | 617 base::Bind(&BluetoothStartDiscoveryFunction::OnErrorCallback, this)); |
651 | 618 |
652 return true; | 619 return true; |
653 } | 620 } |
654 | 621 |
655 void BluetoothStopDiscoveryFunction::OnSuccessCallback() { | 622 void BluetoothStopDiscoveryFunction::OnSuccessCallback() { |
656 SendResponse(true); | 623 SendResponse(true); |
657 GetEventRouter(browser_context())->OnListenerRemoved(); | |
658 } | 624 } |
659 | 625 |
660 void BluetoothStopDiscoveryFunction::OnErrorCallback() { | 626 void BluetoothStopDiscoveryFunction::OnErrorCallback() { |
661 SetError(kStopDiscoveryFailed); | 627 SetError(kStopDiscoveryFailed); |
662 SendResponse(false); | 628 SendResponse(false); |
663 GetEventRouter(browser_context())->OnListenerRemoved(); | |
664 } | 629 } |
665 | 630 |
666 bool BluetoothStopDiscoveryFunction::DoWork( | 631 bool BluetoothStopDiscoveryFunction::DoWork( |
667 scoped_refptr<BluetoothAdapter> adapter) { | 632 scoped_refptr<BluetoothAdapter> adapter) { |
668 GetEventRouter(browser_context())->StopDiscoverySession( | 633 GetEventRouter(browser_context())->StopDiscoverySession( |
669 adapter, | 634 adapter, |
670 extension_id(), | 635 extension_id(), |
671 base::Bind(&BluetoothStopDiscoveryFunction::OnSuccessCallback, this), | 636 base::Bind(&BluetoothStopDiscoveryFunction::OnSuccessCallback, this), |
672 base::Bind(&BluetoothStopDiscoveryFunction::OnErrorCallback, this)); | 637 base::Bind(&BluetoothStopDiscoveryFunction::OnErrorCallback, this)); |
673 | 638 |
674 return true; | 639 return true; |
675 } | 640 } |
676 | 641 |
677 } // namespace api | 642 } // namespace api |
678 } // namespace extensions | 643 } // namespace extensions |
OLD | NEW |