Index: chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
diff --git a/chrome/browser/extensions/bluetooth_event_router.cc b/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
similarity index 80% |
rename from chrome/browser/extensions/bluetooth_event_router.cc |
rename to chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
index d38db9e8b925a6438b7a199889ee2f576b1ea5dc..b101f76816069993d224e97a6589b040633e6587 100644 |
--- a/chrome/browser/extensions/bluetooth_event_router.cc |
+++ b/chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc |
@@ -2,9 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/extensions/bluetooth_event_router.h" |
+#include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h" |
#include <map> |
+#include <string> |
#include "base/json/json_writer.h" |
#include "base/memory/ref_counted.h" |
@@ -26,18 +27,43 @@ ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile) |
: send_discovery_events_(false), |
responsible_for_discovery_(false), |
profile_(profile), |
- adapter_(device::BluetoothAdapterFactory::DefaultAdapter()), |
+ adapter_(NULL), |
+ num_event_listeners_(0), |
next_socket_id_(1) { |
DCHECK(profile_); |
- if (adapter_.get()) |
- adapter_->AddObserver(this); |
} |
ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { |
- if (adapter_.get()) |
- adapter_->RemoveObserver(this); |
+ DCHECK(socket_map_.size() == 0); |
bryeung
2012/11/13 16:16:15
CHECK, not DCHECK please
youngki
2012/11/13 17:01:30
Done.
|
+ DCHECK(num_event_listeners_ == 0); |
+ MaybeReleaseAdapter(); |
+} |
+ |
+scoped_refptr<const device::BluetoothAdapter> |
+ExtensionBluetoothEventRouter::adapter() { |
+ return GetMutableAdapter(); |
+} |
+ |
+scoped_refptr<device::BluetoothAdapter> |
+ExtensionBluetoothEventRouter::GetMutableAdapter() { |
+ if (adapter_) |
+ return adapter_; |
+ |
+ return device::BluetoothAdapterFactory::DefaultAdapter(); |
+} |
+ |
+void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() { |
bryeung
2012/11/13 16:16:15
re-order methods to match header please
youngki
2012/11/13 17:01:30
Done.
|
+ if (!adapter_) { |
+ adapter_ = GetMutableAdapter(); |
+ adapter_->AddObserver(this); |
+ } |
+} |
- socket_map_.clear(); |
+void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() { |
+ if (adapter_ && num_event_listeners_ == 0) { |
+ adapter_->RemoveObserver(this); |
+ adapter_ = NULL; |
+ } |
} |
int ExtensionBluetoothEventRouter::RegisterSocket( |
@@ -51,6 +77,7 @@ int ExtensionBluetoothEventRouter::RegisterSocket( |
} |
int return_id = next_socket_id_++; |
socket_map_[return_id] = socket; |
+ InitializeAdapterIfNeeded(); |
bryeung
2012/11/13 16:16:15
we shouldn't be holding the adapter for sockets
youngki
2012/11/13 17:01:30
Done.
|
return return_id; |
} |
@@ -59,6 +86,7 @@ bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { |
if (socket_entry == socket_map_.end()) |
return false; |
socket_map_.erase(socket_entry); |
+ MaybeReleaseAdapter(); |
bryeung
2012/11/13 16:16:15
don't need this for sockets
youngki
2012/11/13 17:01:30
Done.
|
return true; |
} |
@@ -70,6 +98,17 @@ ExtensionBluetoothEventRouter::GetSocket(int id) { |
return socket_entry->second; |
} |
+void ExtensionBluetoothEventRouter::OnListenerAdded() { |
+ num_event_listeners_++; |
+ InitializeAdapterIfNeeded(); |
+} |
+ |
+void ExtensionBluetoothEventRouter::OnListenerRemoved() { |
+ num_event_listeners_--; |
+ DCHECK(num_event_listeners_ >= 0); |
bryeung
2012/11/13 16:16:15
CHECK (since we'll leak the adapter if this goes b
youngki
2012/11/13 17:01:30
Done.
|
+ MaybeReleaseAdapter(); |
+} |
+ |
void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( |
bool responsible) { |
responsible_for_discovery_ = responsible; |
@@ -103,7 +142,7 @@ void ExtensionBluetoothEventRouter::DispatchDeviceEvent( |
void ExtensionBluetoothEventRouter::AdapterPresentChanged( |
device::BluetoothAdapter* adapter, bool present) { |
- if (adapter != adapter_.get()) { |
+ if (adapter != adapter_) { |
DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
return; |
} |
@@ -115,7 +154,7 @@ void ExtensionBluetoothEventRouter::AdapterPresentChanged( |
void ExtensionBluetoothEventRouter::AdapterPoweredChanged( |
device::BluetoothAdapter* adapter, bool has_power) { |
- if (adapter != adapter_.get()) { |
+ if (adapter != adapter_) { |
DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
return; |
} |
@@ -127,7 +166,7 @@ void ExtensionBluetoothEventRouter::AdapterPoweredChanged( |
void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
device::BluetoothAdapter* adapter, bool discovering) { |
- if (adapter != adapter_.get()) { |
+ if (adapter != adapter_) { |
DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
return; |
} |
@@ -146,7 +185,7 @@ void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
void ExtensionBluetoothEventRouter::DeviceAdded( |
device::BluetoothAdapter* adapter, |
device::BluetoothDevice* device) { |
- if (adapter != adapter_.get()) { |
+ if (adapter != adapter_) { |
DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
return; |
} |