Index: trunk/src/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
=================================================================== |
--- trunk/src/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc (revision 255369) |
+++ trunk/src/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc (working copy) |
@@ -22,7 +22,6 @@ |
#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" |
@@ -46,7 +45,9 @@ |
ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter( |
content::BrowserContext* context) |
- : browser_context_(context), |
+ : send_discovery_events_(false), |
+ responsible_for_discovery_(false), |
+ browser_context_(context), |
adapter_(NULL), |
num_event_listeners_(0), |
next_socket_id_(1), |
@@ -71,11 +72,6 @@ |
++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 { |
@@ -149,50 +145,6 @@ |
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); |
@@ -210,6 +162,29 @@ |
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()); |
@@ -268,19 +243,9 @@ |
} |
if (!discovering) { |
- // 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); |
+ send_discovery_events_ = false; |
+ responsible_for_discovery_ = false; |
+ discovered_devices_.clear(); |
} |
DispatchAdapterStateEvent(); |
@@ -298,7 +263,11 @@ |
new bluetooth::Device(); |
bluetooth::BluetoothDeviceToApiDevice( |
*device, extension_device); |
+ discovered_devices_.push_back(extension_device); |
+ if (!send_discovery_events_) |
+ return; |
+ |
DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, |
*extension_device); |
} |
@@ -362,29 +331,8 @@ |
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( |
int type, |
const content::NotificationSource& source, |