Index: chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
diff --git a/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc b/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
index 908a792ce6b4d6be18b5e32c8e783a8edec04d4d..12034b90f93b8ffeaa9b6ec4fe264cf81ffc1a6f 100644 |
--- a/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
+++ b/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
@@ -22,6 +22,7 @@ |
#include "device/bluetooth/bluetooth_adapter.h" |
#include "device/bluetooth/bluetooth_adapter_factory.h" |
#include "device/bluetooth/bluetooth_device.h" |
+#include "device/bluetooth/bluetooth_discovery_session.h" |
#include "device/bluetooth/bluetooth_profile.h" |
#include "device/bluetooth/bluetooth_socket.h" |
#include "extensions/browser/event_router.h" |
@@ -45,9 +46,7 @@ struct ExtensionBluetoothProfileRecord { |
ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter( |
content::BrowserContext* context) |
- : send_discovery_events_(false), |
- responsible_for_discovery_(false), |
- browser_context_(context), |
+ : browser_context_(context), |
adapter_(NULL), |
num_event_listeners_(0), |
next_socket_id_(1), |
@@ -72,6 +71,11 @@ ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { |
++iter) { |
iter->second.profile->Unregister(); |
} |
+ for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); |
+ iter != discovery_session_map_.end(); |
+ ++iter) { |
+ delete iter->second; |
+ } |
} |
bool ExtensionBluetoothEventRouter::IsBluetoothSupported() const { |
@@ -145,6 +149,50 @@ bool ExtensionBluetoothEventRouter::HasProfile(const std::string& uuid) const { |
return bluetooth_profile_map_.find(uuid) != bluetooth_profile_map_.end(); |
} |
+void ExtensionBluetoothEventRouter::StartDiscoverySession( |
+ device::BluetoothAdapter* adapter, |
+ const std::string& extension_id, |
+ const base::Closure& callback, |
+ const base::Closure& error_callback) { |
+ if (adapter != adapter_.get()) { |
+ error_callback.Run(); |
+ return; |
+ } |
+ DiscoverySessionMap::iterator iter = |
+ discovery_session_map_.find(extension_id); |
+ if (iter != discovery_session_map_.end() && iter->second->IsActive()) { |
+ DVLOG(1) << "An active discovery session exists for extension."; |
+ error_callback.Run(); |
+ return; |
+ } |
+ adapter->StartDiscoverySession( |
+ base::Bind(&ExtensionBluetoothEventRouter::OnStartDiscoverySession, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ extension_id, |
+ callback), |
+ error_callback); |
+} |
+ |
+void ExtensionBluetoothEventRouter::StopDiscoverySession( |
+ device::BluetoothAdapter* adapter, |
+ const std::string& extension_id, |
+ const base::Closure& callback, |
+ const base::Closure& error_callback) { |
+ if (adapter != adapter_.get()) { |
+ error_callback.Run(); |
+ return; |
+ } |
+ DiscoverySessionMap::iterator iter = |
+ discovery_session_map_.find(extension_id); |
+ if (iter == discovery_session_map_.end() || !iter->second->IsActive()) { |
+ DVLOG(1) << "No active discovery session exists for extension."; |
+ error_callback.Run(); |
+ return; |
+ } |
+ device::BluetoothDiscoverySession* session = iter->second; |
+ session->Stop(callback, error_callback); |
+} |
+ |
device::BluetoothProfile* ExtensionBluetoothEventRouter::GetProfile( |
const std::string& uuid) const { |
BluetoothProfileMap::const_iterator iter = bluetooth_profile_map_.find(uuid); |
@@ -162,29 +210,6 @@ ExtensionBluetoothEventRouter::GetSocket(int id) { |
return socket_entry->second.socket; |
} |
-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(extensions::event_names::kBluetoothOnDeviceDiscovered, |
- **i); |
- } |
- } |
- |
- send_discovery_events_ = should_send; |
-} |
- |
void ExtensionBluetoothEventRouter::DispatchDeviceEvent( |
const std::string& event_name, const bluetooth::Device& device) { |
scoped_ptr<base::ListValue> args(new base::ListValue()); |
@@ -243,9 +268,19 @@ void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
} |
if (!discovering) { |
- send_discovery_events_ = false; |
- responsible_for_discovery_ = false; |
- discovered_devices_.clear(); |
+ // If any discovery sessions are inactive, clean them up. |
+ DiscoverySessionMap active_session_map; |
+ for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); |
+ iter != discovery_session_map_.end(); |
+ ++iter) { |
+ device::BluetoothDiscoverySession* session = iter->second; |
+ if (session->IsActive()) { |
+ active_session_map[iter->first] = session; |
+ continue; |
+ } |
+ delete session; |
+ } |
+ discovery_session_map_.swap(active_session_map); |
} |
DispatchAdapterStateEvent(); |
@@ -259,17 +294,11 @@ void ExtensionBluetoothEventRouter::DeviceAdded( |
return; |
} |
- bluetooth::Device* extension_device = |
- new bluetooth::Device(); |
- bluetooth::BluetoothDeviceToApiDevice( |
- *device, extension_device); |
- discovered_devices_.push_back(extension_device); |
- |
- if (!send_discovery_events_) |
- return; |
+ bluetooth::Device extension_device; |
+ bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device); |
DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, |
- *extension_device); |
+ extension_device); |
} |
void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() { |
@@ -331,6 +360,27 @@ void ExtensionBluetoothEventRouter::CleanUpForExtension( |
ReleaseSocket(socket_id); |
} |
} |
+ |
+ // Remove any discovery session initiated by the extension. |
+ DiscoverySessionMap::iterator session_iter = |
+ discovery_session_map_.find(extension_id); |
+ if (session_iter == discovery_session_map_.end()) |
+ return; |
+ delete session_iter->second; |
+ discovery_session_map_.erase(session_iter); |
+} |
+ |
+void ExtensionBluetoothEventRouter::OnStartDiscoverySession( |
+ const std::string& extension_id, |
+ const base::Closure& callback, |
+ scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { |
+ // Clean up any existing session instance for the extension. |
+ DiscoverySessionMap::iterator iter = |
+ discovery_session_map_.find(extension_id); |
+ if (iter != discovery_session_map_.end()) |
+ delete iter->second; |
+ discovery_session_map_[extension_id] = discovery_session.release(); |
+ callback.Run(); |
} |
void ExtensionBluetoothEventRouter::Observe( |