| 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 81% | 
| rename from chrome/browser/extensions/bluetooth_event_router.cc | 
| rename to chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc | 
| index d38db9e8b925a6438b7a199889ee2f576b1ea5dc..b43b6ead707ad82564321f2eda86b5616192e405 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,40 @@ 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); | 
| +  CHECK(socket_map_.size() == 0); | 
| +  CHECK(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::OnListenerAdded() { | 
| +  num_event_listeners_++; | 
| +  InitializeAdapterIfNeeded(); | 
| +} | 
|  | 
| -  socket_map_.clear(); | 
| +void ExtensionBluetoothEventRouter::OnListenerRemoved() { | 
| +  num_event_listeners_--; | 
| +  CHECK(num_event_listeners_ >= 0); | 
| +  MaybeReleaseAdapter(); | 
| } | 
|  | 
| int ExtensionBluetoothEventRouter::RegisterSocket( | 
| @@ -103,7 +126,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 +138,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 +150,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 +169,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; | 
| } | 
| @@ -164,6 +187,20 @@ void ExtensionBluetoothEventRouter::DeviceAdded( | 
| *extension_device); | 
| } | 
|  | 
| +void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() { | 
| +  if (!adapter_) { | 
| +    adapter_ = GetMutableAdapter(); | 
| +    adapter_->AddObserver(this); | 
| +  } | 
| +} | 
| + | 
| +void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() { | 
| +  if (adapter_ && num_event_listeners_ == 0) { | 
| +    adapter_->RemoveObserver(this); | 
| +    adapter_ = NULL; | 
| +  } | 
| +} | 
| + | 
| void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( | 
| const char* event_name, bool value) { | 
| scoped_ptr<ListValue> args(new ListValue()); | 
|  |