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

Side by Side 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: Use GetMutableAdapter 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/bluetooth_event_router.h" 5 #include "chrome/browser/extensions/bluetooth_event_router.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string>
8 9
9 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
10 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
12 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h" 14 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h"
14 #include "chrome/browser/extensions/event_names.h" 15 #include "chrome/browser/extensions/event_names.h"
15 #include "chrome/browser/extensions/event_router.h" 16 #include "chrome/browser/extensions/event_router.h"
16 #include "chrome/browser/extensions/extension_system.h" 17 #include "chrome/browser/extensions/extension_system.h"
17 #include "chrome/common/extensions/api/bluetooth.h" 18 #include "chrome/common/extensions/api/bluetooth.h"
18 #include "device/bluetooth/bluetooth_adapter.h" 19 #include "device/bluetooth/bluetooth_adapter.h"
19 #include "device/bluetooth/bluetooth_adapter_factory.h" 20 #include "device/bluetooth/bluetooth_adapter_factory.h"
20 #include "device/bluetooth/bluetooth_device.h" 21 #include "device/bluetooth/bluetooth_device.h"
21 #include "device/bluetooth/bluetooth_socket.h" 22 #include "device/bluetooth/bluetooth_socket.h"
22 23
23 namespace extensions { 24 namespace extensions {
24 25
25 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile) 26 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile)
26 : send_discovery_events_(false), 27 : send_discovery_events_(false),
27 responsible_for_discovery_(false), 28 responsible_for_discovery_(false),
28 profile_(profile), 29 profile_(profile),
29 adapter_(device::BluetoothAdapterFactory::DefaultAdapter()), 30 adapter_(NULL),
31 num_event_listeners_(0),
30 next_socket_id_(1) { 32 next_socket_id_(1) {
31 DCHECK(profile_); 33 DCHECK(profile_);
32 if (adapter_.get())
33 adapter_->AddObserver(this);
34 } 34 }
35 35
36 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { 36 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() {
37 if (adapter_.get()) 37 MaybeReleaseAdapter();
38 adapter_->RemoveObserver(this);
39 38
40 socket_map_.clear(); 39 socket_map_.clear();
41 } 40 }
42 41
42 scoped_refptr<const device::BluetoothAdapter>
43 ExtensionBluetoothEventRouter::adapter() {
44 return GetMutableAdapter();
45 }
46
47 scoped_refptr<device::BluetoothAdapter>
48 ExtensionBluetoothEventRouter::GetMutableAdapter() {
49 if (adapter_)
50 return adapter_;
51
52 return device::BluetoothAdapterFactory::DefaultAdapter();
53 }
54
55 void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() {
56 if (!adapter_) {
57 adapter_ = GetMutableAdapter();
58 adapter_->AddObserver(this);
59 }
60 }
61
62 void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() {
63 if (adapter_) {
64 adapter_->RemoveObserver(this);
65 adapter_ = NULL;
66 }
67 }
68
43 int ExtensionBluetoothEventRouter::RegisterSocket( 69 int ExtensionBluetoothEventRouter::RegisterSocket(
44 scoped_refptr<device::BluetoothSocket> socket) { 70 scoped_refptr<device::BluetoothSocket> socket) {
45 // If there is a socket registered with the same fd, just return it's id 71 // If there is a socket registered with the same fd, just return it's id
46 for (SocketMap::const_iterator i = socket_map_.begin(); 72 for (SocketMap::const_iterator i = socket_map_.begin();
47 i != socket_map_.end(); ++i) { 73 i != socket_map_.end(); ++i) {
48 if (i->second->fd() == socket->fd()) { 74 if (i->second->fd() == socket->fd()) {
49 return i->first; 75 return i->first;
50 } 76 }
51 } 77 }
52 int return_id = next_socket_id_++; 78 int return_id = next_socket_id_++;
53 socket_map_[return_id] = socket; 79 socket_map_[return_id] = socket;
80 InitializeAdapterIfNeeded();
81
54 return return_id; 82 return return_id;
55 } 83 }
56 84
57 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { 85 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) {
58 SocketMap::iterator socket_entry = socket_map_.find(id); 86 SocketMap::iterator socket_entry = socket_map_.find(id);
59 if (socket_entry == socket_map_.end()) 87 if (socket_entry == socket_map_.end())
60 return false; 88 return false;
61 socket_map_.erase(socket_entry); 89 socket_map_.erase(socket_entry);
90 if (!IsAdapterNeeded())
91 MaybeReleaseAdapter();
92
62 return true; 93 return true;
63 } 94 }
64 95
65 scoped_refptr<device::BluetoothSocket> 96 scoped_refptr<device::BluetoothSocket>
66 ExtensionBluetoothEventRouter::GetSocket(int id) { 97 ExtensionBluetoothEventRouter::GetSocket(int id) {
67 SocketMap::iterator socket_entry = socket_map_.find(id); 98 SocketMap::iterator socket_entry = socket_map_.find(id);
68 if (socket_entry == socket_map_.end()) 99 if (socket_entry == socket_map_.end())
69 return NULL; 100 return NULL;
70 return socket_entry->second; 101 return socket_entry->second;
71 } 102 }
72 103
104 // static
105 bool ExtensionBluetoothEventRouter::IsBluetoothEvent(
106 const std::string& event_name) {
107 return
108 event_name == extensions::event_names::kBluetoothOnAvailabilityChanged ||
109 event_name == extensions::event_names::kBluetoothOnDiscoveringChanged ||
110 event_name == extensions::event_names::kBluetoothOnPowerChanged;
111 }
112
113 bool ExtensionBluetoothEventRouter::IsAdapterNeeded() const {
114 return num_event_listeners_ > 0 || socket_map_.size() > 0;
115 }
116
117 void ExtensionBluetoothEventRouter::OnEventListenerAdded(
118 const std::string& event_name) {
119 if (IsBluetoothEvent(event_name)) {
120 num_event_listeners_++;
121 InitializeAdapterIfNeeded();
122 }
123 }
124
125 void ExtensionBluetoothEventRouter::OnEventListenerRemoved(
126 const std::string& event_name) {
127 if (IsBluetoothEvent(event_name)) {
128 num_event_listeners_--;
129 DCHECK(num_event_listeners_ >= 0);
130 if (!IsAdapterNeeded())
131 MaybeReleaseAdapter();
132 }
133 }
134
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( 135 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
74 bool responsible) { 136 bool responsible) {
75 responsible_for_discovery_ = responsible; 137 responsible_for_discovery_ = responsible;
76 } 138 }
77 139
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { 140 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const {
79 return responsible_for_discovery_; 141 return responsible_for_discovery_;
80 } 142 }
81 143
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { 144 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) {
(...skipping 13 matching lines...) Expand all
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 158 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
97 const char* event_name, const extensions::api::bluetooth::Device& device) { 159 const char* event_name, const extensions::api::bluetooth::Device& device) {
98 scoped_ptr<ListValue> args(new ListValue()); 160 scoped_ptr<ListValue> args(new ListValue());
99 args->Append(device.ToValue().release()); 161 args->Append(device.ToValue().release());
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> 162 extensions::ExtensionSystem::Get(profile_)->event_router()->
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 163 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
102 } 164 }
103 165
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 166 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
105 device::BluetoothAdapter* adapter, bool present) { 167 device::BluetoothAdapter* adapter, bool present) {
106 if (adapter != adapter_.get()) { 168 if (adapter != adapter_) {
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 169 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
108 return; 170 return;
109 } 171 }
110 172
111 DispatchBooleanValueEvent( 173 DispatchBooleanValueEvent(
112 extensions::event_names::kBluetoothOnAvailabilityChanged, 174 extensions::event_names::kBluetoothOnAvailabilityChanged,
113 present); 175 present);
114 } 176 }
115 177
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 178 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
117 device::BluetoothAdapter* adapter, bool has_power) { 179 device::BluetoothAdapter* adapter, bool has_power) {
118 if (adapter != adapter_.get()) { 180 if (adapter != adapter_) {
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 181 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
120 return; 182 return;
121 } 183 }
122 184
123 DispatchBooleanValueEvent( 185 DispatchBooleanValueEvent(
124 extensions::event_names::kBluetoothOnPowerChanged, 186 extensions::event_names::kBluetoothOnPowerChanged,
125 has_power); 187 has_power);
126 } 188 }
127 189
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 190 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
129 device::BluetoothAdapter* adapter, bool discovering) { 191 device::BluetoothAdapter* adapter, bool discovering) {
130 if (adapter != adapter_.get()) { 192 if (adapter != adapter_) {
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 193 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
132 return; 194 return;
133 } 195 }
134 196
135 if (!discovering) { 197 if (!discovering) {
136 send_discovery_events_ = false; 198 send_discovery_events_ = false;
137 responsible_for_discovery_ = false; 199 responsible_for_discovery_ = false;
138 discovered_devices_.clear(); 200 discovered_devices_.clear();
139 } 201 }
140 202
141 DispatchBooleanValueEvent( 203 DispatchBooleanValueEvent(
142 extensions::event_names::kBluetoothOnDiscoveringChanged, 204 extensions::event_names::kBluetoothOnDiscoveringChanged,
143 discovering); 205 discovering);
144 } 206 }
145 207
146 void ExtensionBluetoothEventRouter::DeviceAdded( 208 void ExtensionBluetoothEventRouter::DeviceAdded(
147 device::BluetoothAdapter* adapter, 209 device::BluetoothAdapter* adapter,
148 device::BluetoothDevice* device) { 210 device::BluetoothDevice* device) {
149 if (adapter != adapter_.get()) { 211 if (adapter != adapter_) {
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 212 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
151 return; 213 return;
152 } 214 }
153 215
154 extensions::api::bluetooth::Device* extension_device = 216 extensions::api::bluetooth::Device* extension_device =
155 new extensions::api::bluetooth::Device(); 217 new extensions::api::bluetooth::Device();
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( 218 extensions::api::bluetooth::BluetoothDeviceToApiDevice(
157 *device, extension_device); 219 *device, extension_device);
158 discovered_devices_.push_back(extension_device); 220 discovered_devices_.push_back(extension_device);
159 221
160 if (!send_discovery_events_) 222 if (!send_discovery_events_)
161 return; 223 return;
162 224
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, 225 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered,
164 *extension_device); 226 *extension_device);
165 } 227 }
166 228
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( 229 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent(
168 const char* event_name, bool value) { 230 const char* event_name, bool value) {
169 scoped_ptr<ListValue> args(new ListValue()); 231 scoped_ptr<ListValue> args(new ListValue());
170 args->Append(Value::CreateBooleanValue(value)); 232 args->Append(Value::CreateBooleanValue(value));
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> 233 extensions::ExtensionSystem::Get(profile_)->event_router()->
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 234 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
173 } 235 }
174 236
175 } // namespace extensions 237 } // namespace extensions
OLDNEW
« 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