Index: chrome/browser/extensions/bluetooth_event_router.cc |
diff --git a/chrome/browser/extensions/bluetooth_event_router.cc b/chrome/browser/extensions/bluetooth_event_router.cc |
index d38db9e8b925a6438b7a199889ee2f576b1ea5dc..1df24a8bf4762e0600109f8cee35e8cc75df46e1 100644 |
--- a/chrome/browser/extensions/bluetooth_event_router.cc |
+++ b/chrome/browser/extensions/bluetooth_event_router.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/extensions/bluetooth_event_router.h" |
#include <map> |
+#include <string> |
#include "base/json/json_writer.h" |
#include "base/memory/ref_counted.h" |
@@ -26,20 +27,47 @@ 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()) |
bryeung
2012/11/08 19:24:02
I think the .get is actually not necessary
youngki
2012/11/09 05:12:52
Done.
|
- adapter_->RemoveObserver(this); |
+ ReleaseAdapter(); |
socket_map_.clear(); |
} |
+scoped_refptr<const device::BluetoothAdapter> |
+ExtensionBluetoothEventRouter::adapter() { |
+ return GetMutableAdapter(); |
+} |
+ |
+scoped_refptr<device::BluetoothAdapter> |
+ExtensionBluetoothEventRouter::GetMutableAdapter() { |
+ if (adapter_.get()) |
bryeung
2012/11/08 19:24:02
I don't think you need the .get()
I'll stop repea
youngki
2012/11/09 05:12:52
Done.
|
+ return adapter_; |
+ |
+ return GetDefaultAdapter(); |
bryeung
2012/11/08 19:24:02
shouldn't this be initializing the adapter?
youngki
2012/11/09 05:12:52
Maybe I am thinking too specifically on Windows Bl
|
+} |
+ |
+void ExtensionBluetoothEventRouter::InitializeAdapter() { |
bryeung
2012/11/08 19:24:02
is there a use case for having an adapter that has
youngki
2012/11/09 05:12:52
This is actually an helper method to not repeat th
|
+ adapter_ = GetDefaultAdapter(); |
+ adapter_->AddObserver(this); |
+} |
+ |
+void ExtensionBluetoothEventRouter::ReleaseAdapter() { |
+ adapter_->RemoveObserver(this); |
+ adapter_ = NULL; |
+} |
+ |
+scoped_refptr<device::BluetoothAdapter> |
+ExtensionBluetoothEventRouter::GetDefaultAdapter() const { |
+ return device::BluetoothAdapterFactory::DefaultAdapter(); |
bryeung
2012/11/08 19:24:02
why not put this inside of GetMutableAdapter and u
youngki
2012/11/09 05:12:52
This is for unittest purpose. I want to override t
|
+} |
+ |
int ExtensionBluetoothEventRouter::RegisterSocket( |
scoped_refptr<device::BluetoothSocket> socket) { |
// If there is a socket registered with the same fd, just return it's id |
@@ -51,6 +79,9 @@ int ExtensionBluetoothEventRouter::RegisterSocket( |
} |
int return_id = next_socket_id_++; |
socket_map_[return_id] = socket; |
+ if (!adapter_.get()) |
+ InitializeAdapter(); |
+ |
return return_id; |
} |
@@ -59,6 +90,9 @@ bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { |
if (socket_entry == socket_map_.end()) |
return false; |
socket_map_.erase(socket_entry); |
+ if (adapter_.get() && !IsAdapterNeeded()) |
+ ReleaseAdapter(); |
+ |
return true; |
} |
@@ -70,6 +104,38 @@ ExtensionBluetoothEventRouter::GetSocket(int id) { |
return socket_entry->second; |
} |
+// static |
+bool ExtensionBluetoothEventRouter::IsBluetoothEvent( |
+ const std::string& event_name) { |
+ return |
+ event_name == extensions::event_names::kBluetoothOnAvailabilityChanged || |
+ event_name == extensions::event_names::kBluetoothOnDiscoveringChanged || |
+ event_name == extensions::event_names::kBluetoothOnPowerChanged; |
+} |
+ |
+bool ExtensionBluetoothEventRouter::IsAdapterNeeded() const { |
+ return num_event_listeners_ > 0 || socket_map_.size() > 0; |
+} |
+ |
+void ExtensionBluetoothEventRouter::OnEventListenerAdded( |
+ const std::string& event_name) { |
+ if (IsBluetoothEvent(event_name)) { |
+ num_event_listeners_++; |
+ if (!adapter_.get()) |
+ InitializeAdapter(); |
+ } |
+} |
+ |
+void ExtensionBluetoothEventRouter::OnEventListenerRemoved( |
+ const std::string& event_name) { |
+ if (IsBluetoothEvent(event_name)) { |
+ num_event_listeners_--; |
+ DCHECK(num_event_listeners_ >= 0); |
+ if (adapter_.get() && !IsAdapterNeeded()) |
+ ReleaseAdapter(); |
+ } |
+} |
+ |
void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( |
bool responsible) { |
responsible_for_discovery_ = responsible; |