| 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..44e6f8742757a3c75190bd60b50e2e707e57eaf9 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,45 @@ 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);
|
| + MaybeReleaseAdapter();
|
|
|
| socket_map_.clear();
|
| }
|
|
|
| +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() {
|
| + if (!adapter_) {
|
| + adapter_ = GetMutableAdapter();
|
| + adapter_->AddObserver(this);
|
| + }
|
| +}
|
| +
|
| +void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() {
|
| + if (adapter_) {
|
| + adapter_->RemoveObserver(this);
|
| + adapter_ = NULL;
|
| + }
|
| +}
|
| +
|
| 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 +77,8 @@ int ExtensionBluetoothEventRouter::RegisterSocket(
|
| }
|
| int return_id = next_socket_id_++;
|
| socket_map_[return_id] = socket;
|
| + InitializeAdapterIfNeeded();
|
| +
|
| return return_id;
|
| }
|
|
|
| @@ -59,6 +87,9 @@ bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) {
|
| if (socket_entry == socket_map_.end())
|
| return false;
|
| socket_map_.erase(socket_entry);
|
| + if (!IsAdapterNeeded())
|
| + MaybeReleaseAdapter();
|
| +
|
| return true;
|
| }
|
|
|
| @@ -70,6 +101,37 @@ 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_++;
|
| + InitializeAdapterIfNeeded();
|
| + }
|
| +}
|
| +
|
| +void ExtensionBluetoothEventRouter::OnEventListenerRemoved(
|
| + const std::string& event_name) {
|
| + if (IsBluetoothEvent(event_name)) {
|
| + num_event_listeners_--;
|
| + DCHECK(num_event_listeners_ >= 0);
|
| + if (!IsAdapterNeeded())
|
| + MaybeReleaseAdapter();
|
| + }
|
| +}
|
| +
|
| void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
|
| bool responsible) {
|
| responsible_for_discovery_ = responsible;
|
| @@ -103,7 +165,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 +177,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 +189,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 +208,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;
|
| }
|
|
|