Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4162)

Unified Diff: chrome/browser/extensions/bluetooth_event_router.cc

Issue 11368145: Lazy-creates BluetoothAdapter in ExtensionBluetoothEventRouter (EBEE). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed .get, double assignment, etc Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..d0c7257df583a883e4f4caee6f1b3841501cddb3 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())
- adapter_->RemoveObserver(this);
+ if (adapter_)
+ ReleaseAdapter();
socket_map_.clear();
}
+scoped_refptr<const device::BluetoothAdapter>
+ExtensionBluetoothEventRouter::adapter() {
+ return GetMutableAdapter();
+}
+
+scoped_refptr<device::BluetoothAdapter>
+ExtensionBluetoothEventRouter::GetMutableAdapter() {
+ if (adapter_)
+ return adapter_;
+
+ return GetDefaultAdapter();
+}
+
+void ExtensionBluetoothEventRouter::InitializeAdapter() {
bryeung 2012/11/09 17:46:44 I'd like this renamed to InitializeAdapterIfNeeded
youngki 2012/11/12 23:25:24 Done.
+ adapter_ = GetDefaultAdapter();
bryeung 2012/11/09 17:46:44 Just call GetMutableAdapter here.
youngki 2012/11/12 23:25:24 Done.
+ adapter_->AddObserver(this);
+}
+
+void ExtensionBluetoothEventRouter::ReleaseAdapter() {
bryeung 2012/11/09 17:46:44 I'd like this to renamed MaybeReleaseAdapter and t
youngki 2012/11/12 23:25:24 Done.
+ adapter_->RemoveObserver(this);
+ adapter_ = NULL;
+}
+
+scoped_refptr<device::BluetoothAdapter>
+ExtensionBluetoothEventRouter::GetDefaultAdapter() const {
+ return device::BluetoothAdapterFactory::DefaultAdapter();
bryeung 2012/11/09 17:46:44 this should be moved into GetMutableAdapter
youngki 2012/11/12 23:25:24 Done.
+}
+
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_)
+ 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_ && !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_)
+ InitializeAdapter();
+ }
+}
+
+void ExtensionBluetoothEventRouter::OnEventListenerRemoved(
+ const std::string& event_name) {
+ if (IsBluetoothEvent(event_name)) {
+ num_event_listeners_--;
+ DCHECK(num_event_listeners_ >= 0);
+ if (adapter_ && !IsAdapterNeeded())
+ ReleaseAdapter();
+ }
+}
+
void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
bool responsible) {
responsible_for_discovery_ = responsible;
@@ -103,7 +169,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 +181,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 +193,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 +212,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;
}
« no previous file with comments | « chrome/browser/extensions/bluetooth_event_router.h ('k') | chrome/browser/extensions/bluetooth_event_router_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698