Chromium Code Reviews| Index: chrome/browser/chromeos/extensions/bluetooth_event_router.cc |
| diff --git a/chrome/browser/chromeos/extensions/bluetooth_event_router.cc b/chrome/browser/chromeos/extensions/bluetooth_event_router.cc |
| index 8cd0b0c61442555914aec47feb195201aec83228..2b4e774420162ab3529c66e5a20f3d69cbbd14b8 100644 |
| --- a/chrome/browser/chromeos/extensions/bluetooth_event_router.cc |
| +++ b/chrome/browser/chromeos/extensions/bluetooth_event_router.cc |
| @@ -7,6 +7,7 @@ |
| #include <map> |
| #include "base/json/json_writer.h" |
| +#include "base/memory/linked_ptr.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/chromeos/bluetooth/bluetooth_adapter.h" |
| @@ -17,6 +18,8 @@ |
| #include "chrome/browser/extensions/event_router.h" |
| #include "chrome/common/extensions/api/experimental_bluetooth.h" |
| +namespace experimental_bluetooth = extensions::api::experimental_bluetooth; |
| + |
| namespace chromeos { |
| ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile) |
| @@ -63,7 +66,25 @@ scoped_refptr<BluetoothSocket> ExtensionBluetoothEventRouter::GetSocket( |
| return socket_entry->second; |
| } |
| +void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( |
| + bool responsible) { |
| + responsible_for_discovery_ = responsible; |
| +} |
| + |
| +bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { |
| + return responsible_for_discovery_; |
| +} |
| + |
| void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { |
| + // At the transition into sending devices, also send past devices that |
| + // were discovered as they will not be discovered again. |
| + if (should_send && !send_discovery_events_) { |
| + for (DeviceList::const_iterator i = discovered_devices_.begin(); |
| + i != discovered_devices_.end(); ++i) { |
| + DispatchDeviceEvent(**i); |
| + } |
| + } |
| + |
| send_discovery_events_ = should_send; |
| } |
| @@ -98,6 +119,13 @@ void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
| return; |
| } |
| + if (!discovering) { |
| + send_discovery_events_ = false; |
| + responsible_for_discovery_ = false; |
| + |
| + STLClearObject(&discovered_devices_); |
| + } |
| + |
| DispatchBooleanValueEvent( |
| extensions::event_names::kBluetoothOnDiscoveringChanged, |
| discovering); |
| @@ -105,38 +133,45 @@ void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
| void ExtensionBluetoothEventRouter::DeviceAdded( |
| chromeos::BluetoothAdapter* adapter, chromeos::BluetoothDevice* device) { |
| - if (!send_discovery_events_) |
| + if (adapter != adapter_.get()) { |
| + DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
| return; |
| + } |
| - DCHECK(adapter == adapter_.get()); |
| + experimental_bluetooth::Device* extension_device = |
| + new experimental_bluetooth::Device(); |
| + experimental_bluetooth::BluetoothDeviceToApiDevice(*device, extension_device); |
| + discovered_devices_.push_back(make_linked_ptr(extension_device)); |
| - extensions::api::experimental_bluetooth::Device extension_device; |
| - extensions::api::experimental_bluetooth::BluetoothDeviceToApiDevice( |
| - *device, &extension_device); |
| + if (!send_discovery_events_) |
| + return; |
| + DispatchDeviceEvent(*extension_device); |
| +} |
| + |
| +void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( |
| + const char* event_name, bool value) { |
| ListValue args; |
| - args.Append(extension_device.ToValue().release()); |
| + args.Append(Value::CreateBooleanValue(value)); |
| std::string json_args; |
| base::JSONWriter::Write(&args, &json_args); |
| profile_->GetExtensionEventRouter()->DispatchEventToRenderers( |
| - extensions::event_names::kBluetoothOnDeviceDiscovered, |
| - json_args, |
| - NULL, |
| - GURL()); |
| + event_name, json_args, NULL, GURL()); |
| } |
| -void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( |
| - const char* event_name, bool value) { |
| +void ExtensionBluetoothEventRouter::DispatchDeviceEvent( |
| + const experimental_bluetooth::Device& device) { |
|
asargent_no_longer_on_chrome
2012/08/03 23:35:23
Can you call HasEventListener on the extension eve
bryeung
2012/08/07 14:22:12
I'd prefer to leave it out, if you don't mind.
Th
asargent_no_longer_on_chrome
2012/08/07 15:32:48
Ok, no problem.
|
| ListValue args; |
| - args.Append(Value::CreateBooleanValue(value)); |
| + args.Append(device.ToValue().release()); |
| std::string json_args; |
| base::JSONWriter::Write(&args, &json_args); |
| - // TODO(bryeung): only dispatch the event to interested renderers |
| - // crbug.com/133179 |
| profile_->GetExtensionEventRouter()->DispatchEventToRenderers( |
| - event_name, json_args, NULL, GURL()); |
| + extensions::event_names::kBluetoothOnDeviceDiscovered, |
| + json_args, |
| + NULL, |
| + GURL()); |
| } |
| } // namespace chromeos |