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 |