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

Side by Side Diff: chrome/browser/extensions/api/bluetooth/bluetooth_event_router.cc

Issue 180163009: chrome.bluetooth API improvements. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review feedback, simplify threading model. Created 6 years, 9 months 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
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/api/bluetooth/bluetooth_event_router.h" 5 #include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_vector.h" 14 #include "base/memory/scoped_vector.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/chrome_notification_types.h" 16 #include "chrome/browser/chrome_notification_types.h"
17 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h" 17 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h"
18 #include "chrome/browser/extensions/extension_host.h"
18 #include "chrome/common/extensions/api/bluetooth.h" 19 #include "chrome/common/extensions/api/bluetooth.h"
19 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_details.h"
20 #include "content/public/browser/notification_source.h" 21 #include "content/public/browser/notification_source.h"
21 #include "device/bluetooth/bluetooth_adapter.h" 22 #include "device/bluetooth/bluetooth_adapter.h"
22 #include "device/bluetooth/bluetooth_adapter_factory.h" 23 #include "device/bluetooth/bluetooth_adapter_factory.h"
23 #include "device/bluetooth/bluetooth_device.h" 24 #include "device/bluetooth/bluetooth_device.h"
24 #include "device/bluetooth/bluetooth_discovery_session.h" 25 #include "device/bluetooth/bluetooth_discovery_session.h"
25 #include "device/bluetooth/bluetooth_profile.h" 26 #include "device/bluetooth/bluetooth_profile.h"
26 #include "device/bluetooth/bluetooth_socket.h" 27 #include "device/bluetooth/bluetooth_socket.h"
27 #include "extensions/browser/event_router.h" 28 #include "extensions/browser/event_router.h"
28 #include "extensions/browser/extension_system.h" 29 #include "extensions/browser/extension_system.h"
29 30
30 namespace extensions { 31 namespace extensions {
31 32
32 namespace bluetooth = api::bluetooth; 33 namespace bluetooth = api::bluetooth;
33 34
34 // A struct storing a Bluetooth socket and the extension that added it.
35 struct ExtensionBluetoothSocketRecord {
36 std::string extension_id;
37 scoped_refptr<device::BluetoothSocket> socket;
38 };
39
40 // A struct storing a Bluetooth profile and the extension that added it. 35 // A struct storing a Bluetooth profile and the extension that added it.
41 struct ExtensionBluetoothProfileRecord { 36 struct ExtensionBluetoothProfileRecord {
42 std::string extension_id; 37 std::string extension_id;
43 device::BluetoothProfile* profile; 38 device::BluetoothProfile* profile;
44 }; 39 };
45 40
46 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter( 41 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(
47 content::BrowserContext* context) 42 content::BrowserContext* context)
48 : browser_context_(context), 43 : browser_context_(context),
49 adapter_(NULL), 44 adapter_(NULL),
50 num_event_listeners_(0), 45 num_event_listeners_(0),
51 next_socket_id_(1),
52 weak_ptr_factory_(this) { 46 weak_ptr_factory_(this) {
47 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
53 DCHECK(browser_context_); 48 DCHECK(browser_context_);
54 registrar_.Add(this, 49 registrar_.Add(this,
55 chrome::NOTIFICATION_EXTENSION_UNLOADED, 50 chrome::NOTIFICATION_EXTENSION_UNLOADED,
56 content::Source<content::BrowserContext>(browser_context_)); 51 content::Source<content::BrowserContext>(browser_context_));
52 registrar_.Add(this,
53 chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
54 content::Source<content::BrowserContext>(browser_context_));
57 } 55 }
58 56
59 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { 57 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() {
58 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
60 if (adapter_.get()) { 59 if (adapter_.get()) {
61 adapter_->RemoveObserver(this); 60 adapter_->RemoveObserver(this);
62 adapter_ = NULL; 61 adapter_ = NULL;
63 } 62 }
64 DLOG_IF(WARNING, socket_map_.size() != 0)
65 << "Bluetooth sockets are still open.";
66 socket_map_.clear();
67
68 for (BluetoothProfileMap::iterator iter = bluetooth_profile_map_.begin(); 63 for (BluetoothProfileMap::iterator iter = bluetooth_profile_map_.begin();
69 iter != bluetooth_profile_map_.end(); 64 iter != bluetooth_profile_map_.end();
70 ++iter) { 65 ++iter) {
71 iter->second.profile->Unregister(); 66 iter->second.profile->Unregister();
72 } 67 }
73 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); 68 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin();
74 iter != discovery_session_map_.end(); 69 iter != discovery_session_map_.end();
75 ++iter) { 70 ++iter) {
76 delete iter->second; 71 delete iter->second;
77 } 72 }
(...skipping 18 matching lines...) Expand all
96 num_event_listeners_++; 91 num_event_listeners_++;
97 InitializeAdapterIfNeeded(); 92 InitializeAdapterIfNeeded();
98 } 93 }
99 94
100 void ExtensionBluetoothEventRouter::OnListenerRemoved() { 95 void ExtensionBluetoothEventRouter::OnListenerRemoved() {
101 if (num_event_listeners_ > 0) 96 if (num_event_listeners_ > 0)
102 num_event_listeners_--; 97 num_event_listeners_--;
103 MaybeReleaseAdapter(); 98 MaybeReleaseAdapter();
104 } 99 }
105 100
106 int ExtensionBluetoothEventRouter::RegisterSocket(
107 const std::string& extension_id,
108 scoped_refptr<device::BluetoothSocket> socket) {
109 // If there is a socket registered with the same fd, just return it's id
110 for (SocketMap::const_iterator i = socket_map_.begin();
111 i != socket_map_.end(); ++i) {
112 if (i->second.socket.get() == socket.get())
113 return i->first;
114 }
115 int return_id = next_socket_id_++;
116 ExtensionBluetoothSocketRecord record = { extension_id, socket };
117 socket_map_[return_id] = record;
118 return return_id;
119 }
120
121 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) {
122 SocketMap::iterator socket_entry = socket_map_.find(id);
123 if (socket_entry == socket_map_.end())
124 return false;
125 socket_map_.erase(socket_entry);
126 return true;
127 }
128
129 void ExtensionBluetoothEventRouter::AddProfile( 101 void ExtensionBluetoothEventRouter::AddProfile(
130 const std::string& uuid, 102 const std::string& uuid,
131 const std::string& extension_id, 103 const std::string& extension_id,
132 device::BluetoothProfile* bluetooth_profile) { 104 device::BluetoothProfile* bluetooth_profile) {
105 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
133 DCHECK(!HasProfile(uuid)); 106 DCHECK(!HasProfile(uuid));
134 ExtensionBluetoothProfileRecord record = { extension_id, bluetooth_profile }; 107 ExtensionBluetoothProfileRecord record = { extension_id, bluetooth_profile };
135 bluetooth_profile_map_[uuid] = record; 108 bluetooth_profile_map_[uuid] = record;
136 } 109 }
137 110
138 void ExtensionBluetoothEventRouter::RemoveProfile(const std::string& uuid) { 111 void ExtensionBluetoothEventRouter::RemoveProfile(const std::string& uuid) {
112 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
139 BluetoothProfileMap::iterator iter = bluetooth_profile_map_.find(uuid); 113 BluetoothProfileMap::iterator iter = bluetooth_profile_map_.find(uuid);
140 if (iter != bluetooth_profile_map_.end()) { 114 if (iter != bluetooth_profile_map_.end()) {
141 device::BluetoothProfile* bluetooth_profile = iter->second.profile; 115 device::BluetoothProfile* bluetooth_profile = iter->second.profile;
142 bluetooth_profile_map_.erase(iter); 116 bluetooth_profile_map_.erase(iter);
143 bluetooth_profile->Unregister(); 117 bluetooth_profile->Unregister();
144 } 118 }
145 } 119 }
146 120
147 bool ExtensionBluetoothEventRouter::HasProfile(const std::string& uuid) const { 121 bool ExtensionBluetoothEventRouter::HasProfile(const std::string& uuid) const {
122 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
148 return bluetooth_profile_map_.find(uuid) != bluetooth_profile_map_.end(); 123 return bluetooth_profile_map_.find(uuid) != bluetooth_profile_map_.end();
149 } 124 }
150 125
151 void ExtensionBluetoothEventRouter::StartDiscoverySession( 126 void ExtensionBluetoothEventRouter::StartDiscoverySession(
152 device::BluetoothAdapter* adapter, 127 device::BluetoothAdapter* adapter,
153 const std::string& extension_id, 128 const std::string& extension_id,
154 const base::Closure& callback, 129 const base::Closure& callback,
155 const base::Closure& error_callback) { 130 const base::Closure& error_callback) {
156 if (adapter != adapter_.get()) { 131 if (adapter != adapter_.get()) {
157 error_callback.Run(); 132 error_callback.Run();
(...skipping 29 matching lines...) Expand all
187 DVLOG(1) << "No active discovery session exists for extension."; 162 DVLOG(1) << "No active discovery session exists for extension.";
188 error_callback.Run(); 163 error_callback.Run();
189 return; 164 return;
190 } 165 }
191 device::BluetoothDiscoverySession* session = iter->second; 166 device::BluetoothDiscoverySession* session = iter->second;
192 session->Stop(callback, error_callback); 167 session->Stop(callback, error_callback);
193 } 168 }
194 169
195 device::BluetoothProfile* ExtensionBluetoothEventRouter::GetProfile( 170 device::BluetoothProfile* ExtensionBluetoothEventRouter::GetProfile(
196 const std::string& uuid) const { 171 const std::string& uuid) const {
172 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
197 BluetoothProfileMap::const_iterator iter = bluetooth_profile_map_.find(uuid); 173 BluetoothProfileMap::const_iterator iter = bluetooth_profile_map_.find(uuid);
198 if (iter != bluetooth_profile_map_.end()) 174 if (iter != bluetooth_profile_map_.end())
199 return iter->second.profile; 175 return iter->second.profile;
200 176
201 return NULL; 177 return NULL;
202 } 178 }
203 179
204 scoped_refptr<device::BluetoothSocket>
205 ExtensionBluetoothEventRouter::GetSocket(int id) {
206 SocketMap::iterator socket_entry = socket_map_.find(id);
207 if (socket_entry == socket_map_.end())
208 return NULL;
209 return socket_entry->second.socket;
210 }
211
212 void ExtensionBluetoothEventRouter::DispatchConnectionEvent(
213 const std::string& extension_id,
214 const std::string& uuid,
215 const device::BluetoothDevice* device,
216 scoped_refptr<device::BluetoothSocket> socket) {
217 if (!HasProfile(uuid))
218 return;
219
220 int socket_id = RegisterSocket(extension_id, socket);
221 bluetooth::Socket result_socket;
222 bluetooth::BluetoothDeviceToApiDevice(*device, &result_socket.device);
223 result_socket.profile.uuid = uuid;
224 result_socket.id = socket_id;
225
226 scoped_ptr<base::ListValue> args =
227 bluetooth::OnConnection::Create(result_socket);
228 scoped_ptr<Event> event(new Event(
229 bluetooth::OnConnection::kEventName, args.Pass()));
230 ExtensionSystem::Get(browser_context_)
231 ->event_router()
232 ->DispatchEventToExtension(extension_id, event.Pass());
233 }
234
235 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 180 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
236 device::BluetoothAdapter* adapter, bool present) { 181 device::BluetoothAdapter* adapter, bool present) {
182 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
237 if (adapter != adapter_.get()) { 183 if (adapter != adapter_.get()) {
238 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 184 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
239 return; 185 return;
240 } 186 }
241 DispatchAdapterStateEvent(); 187 DispatchAdapterStateEvent();
242 } 188 }
243 189
244 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 190 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
245 device::BluetoothAdapter* adapter, bool has_power) { 191 device::BluetoothAdapter* adapter, bool has_power) {
192 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
246 if (adapter != adapter_.get()) { 193 if (adapter != adapter_.get()) {
247 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 194 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
248 return; 195 return;
249 } 196 }
250 DispatchAdapterStateEvent(); 197 DispatchAdapterStateEvent();
251 } 198 }
252 199
253 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 200 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
254 device::BluetoothAdapter* adapter, bool discovering) { 201 device::BluetoothAdapter* adapter, bool discovering) {
202 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
255 if (adapter != adapter_.get()) { 203 if (adapter != adapter_.get()) {
256 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 204 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
257 return; 205 return;
258 } 206 }
259 207
260 if (!discovering) { 208 if (!discovering) {
261 // If any discovery sessions are inactive, clean them up. 209 // If any discovery sessions are inactive, clean them up.
262 DiscoverySessionMap active_session_map; 210 DiscoverySessionMap active_session_map;
263 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); 211 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin();
264 iter != discovery_session_map_.end(); 212 iter != discovery_session_map_.end();
265 ++iter) { 213 ++iter) {
266 device::BluetoothDiscoverySession* session = iter->second; 214 device::BluetoothDiscoverySession* session = iter->second;
267 if (session->IsActive()) { 215 if (session->IsActive()) {
268 active_session_map[iter->first] = session; 216 active_session_map[iter->first] = session;
269 continue; 217 continue;
270 } 218 }
271 delete session; 219 delete session;
272 } 220 }
273 discovery_session_map_.swap(active_session_map); 221 discovery_session_map_.swap(active_session_map);
274 } 222 }
275 223
276 DispatchAdapterStateEvent(); 224 DispatchAdapterStateEvent();
277 } 225 }
278 226
279 void ExtensionBluetoothEventRouter::DeviceAdded( 227 void ExtensionBluetoothEventRouter::DeviceAdded(
280 device::BluetoothAdapter* adapter, 228 device::BluetoothAdapter* adapter,
281 device::BluetoothDevice* device) { 229 device::BluetoothDevice* device) {
230 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
282 if (adapter != adapter_.get()) { 231 if (adapter != adapter_.get()) {
283 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 232 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
284 return; 233 return;
285 } 234 }
286 235
287 DispatchDeviceEvent(bluetooth::OnDeviceAdded::kEventName, device); 236 DispatchDeviceEvent(bluetooth::OnDeviceAdded::kEventName, device);
288 } 237 }
289 238
290 void ExtensionBluetoothEventRouter::DeviceChanged( 239 void ExtensionBluetoothEventRouter::DeviceChanged(
291 device::BluetoothAdapter* adapter, 240 device::BluetoothAdapter* adapter,
292 device::BluetoothDevice* device) { 241 device::BluetoothDevice* device) {
242 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
293 if (adapter != adapter_.get()) { 243 if (adapter != adapter_.get()) {
294 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 244 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
295 return; 245 return;
296 } 246 }
297 247
298 DispatchDeviceEvent(bluetooth::OnDeviceChanged::kEventName, device); 248 DispatchDeviceEvent(bluetooth::OnDeviceChanged::kEventName, device);
299 } 249 }
300 250
301 void ExtensionBluetoothEventRouter::DeviceRemoved( 251 void ExtensionBluetoothEventRouter::DeviceRemoved(
302 device::BluetoothAdapter* adapter, 252 device::BluetoothAdapter* adapter,
303 device::BluetoothDevice* device) { 253 device::BluetoothDevice* device) {
254 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
304 if (adapter != adapter_.get()) { 255 if (adapter != adapter_.get()) {
305 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); 256 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress();
306 return; 257 return;
307 } 258 }
308 259
309 DispatchDeviceEvent(bluetooth::OnDeviceRemoved::kEventName, device); 260 DispatchDeviceEvent(bluetooth::OnDeviceRemoved::kEventName, device);
310 } 261 }
311 262
312 void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() { 263 void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() {
264 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
313 if (!adapter_.get()) { 265 if (!adapter_.get()) {
314 GetAdapter(base::Bind(&ExtensionBluetoothEventRouter::InitializeAdapter, 266 GetAdapter(base::Bind(&ExtensionBluetoothEventRouter::InitializeAdapter,
315 weak_ptr_factory_.GetWeakPtr())); 267 weak_ptr_factory_.GetWeakPtr()));
316 } 268 }
317 } 269 }
318 270
319 void ExtensionBluetoothEventRouter::InitializeAdapter( 271 void ExtensionBluetoothEventRouter::InitializeAdapter(
320 scoped_refptr<device::BluetoothAdapter> adapter) { 272 scoped_refptr<device::BluetoothAdapter> adapter) {
321 if (!adapter_.get()) { 273 if (!adapter_.get()) {
322 adapter_ = adapter; 274 adapter_ = adapter;
323 adapter_->AddObserver(this); 275 adapter_->AddObserver(this);
324 } 276 }
325 } 277 }
326 278
327 void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() { 279 void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() {
328 if (adapter_.get() && num_event_listeners_ == 0) { 280 if (adapter_.get() && num_event_listeners_ == 0) {
329 adapter_->RemoveObserver(this); 281 adapter_->RemoveObserver(this);
330 adapter_ = NULL; 282 adapter_ = NULL;
331 } 283 }
332 } 284 }
333 285
334 void ExtensionBluetoothEventRouter::DispatchAdapterStateEvent() { 286 void ExtensionBluetoothEventRouter::DispatchAdapterStateEvent() {
335 bluetooth::AdapterState state; 287 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
288 api::bluetooth::AdapterState state;
336 PopulateAdapterState(*adapter_.get(), &state); 289 PopulateAdapterState(*adapter_.get(), &state);
337 290
338 scoped_ptr<base::ListValue> args = 291 scoped_ptr<base::ListValue> args =
339 bluetooth::OnAdapterStateChanged::Create(state); 292 bluetooth::OnAdapterStateChanged::Create(state);
340 scoped_ptr<Event> event(new Event( 293 scoped_ptr<Event> event(new Event(
341 bluetooth::OnAdapterStateChanged::kEventName, 294 bluetooth::OnAdapterStateChanged::kEventName,
342 args.Pass())); 295 args.Pass()));
343 ExtensionSystem::Get(browser_context_)->event_router()->BroadcastEvent( 296 ExtensionSystem::Get(browser_context_)->event_router()->BroadcastEvent(
344 event.Pass()); 297 event.Pass());
345 } 298 }
346 299
347 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 300 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
348 const std::string& event_name, 301 const std::string& event_name,
349 device::BluetoothDevice* device) { 302 device::BluetoothDevice* device) {
350 bluetooth::Device extension_device; 303 bluetooth::Device extension_device;
351 bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device); 304 bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device);
352 305
353 scoped_ptr<base::ListValue> args = 306 scoped_ptr<base::ListValue> args =
354 bluetooth::OnDeviceAdded::Create(extension_device); 307 bluetooth::OnDeviceAdded::Create(extension_device);
355 scoped_ptr<Event> event(new Event(event_name, args.Pass())); 308 scoped_ptr<Event> event(new Event(event_name, args.Pass()));
356 ExtensionSystem::Get(browser_context_)->event_router()->BroadcastEvent( 309 ExtensionSystem::Get(browser_context_)->event_router()->BroadcastEvent(
357 event.Pass()); 310 event.Pass());
358 } 311 }
359 312
360 void ExtensionBluetoothEventRouter::CleanUpForExtension( 313 void ExtensionBluetoothEventRouter::CleanUpForExtension(
361 const std::string& extension_id) { 314 const std::string& extension_id) {
315 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
362 // Remove all profiles added by the extension. 316 // Remove all profiles added by the extension.
363 BluetoothProfileMap::iterator profile_iter = bluetooth_profile_map_.begin(); 317 BluetoothProfileMap::iterator profile_iter = bluetooth_profile_map_.begin();
364 while (profile_iter != bluetooth_profile_map_.end()) { 318 while (profile_iter != bluetooth_profile_map_.end()) {
365 ExtensionBluetoothProfileRecord record = profile_iter->second; 319 ExtensionBluetoothProfileRecord record = profile_iter->second;
366 if (record.extension_id == extension_id) { 320 if (record.extension_id == extension_id) {
367 bluetooth_profile_map_.erase(profile_iter++); 321 bluetooth_profile_map_.erase(profile_iter++);
368 record.profile->Unregister(); 322 record.profile->Unregister();
369 } else { 323 } else {
370 profile_iter++; 324 profile_iter++;
371 } 325 }
372 } 326 }
373 327
374 // Remove all sockets opened by the extension.
375 SocketMap::iterator socket_iter = socket_map_.begin();
376 while (socket_iter != socket_map_.end()) {
377 int socket_id = socket_iter->first;
378 ExtensionBluetoothSocketRecord record = socket_iter->second;
379 socket_iter++;
380 if (record.extension_id == extension_id) {
381 ReleaseSocket(socket_id);
382 }
383 }
384
385 // Remove any discovery session initiated by the extension. 328 // Remove any discovery session initiated by the extension.
386 DiscoverySessionMap::iterator session_iter = 329 DiscoverySessionMap::iterator session_iter =
387 discovery_session_map_.find(extension_id); 330 discovery_session_map_.find(extension_id);
388 if (session_iter == discovery_session_map_.end()) 331 if (session_iter == discovery_session_map_.end())
389 return; 332 return;
390 delete session_iter->second; 333 delete session_iter->second;
391 discovery_session_map_.erase(session_iter); 334 discovery_session_map_.erase(session_iter);
392 } 335 }
393 336
394 void ExtensionBluetoothEventRouter::OnStartDiscoverySession( 337 void ExtensionBluetoothEventRouter::OnStartDiscoverySession(
395 const std::string& extension_id, 338 const std::string& extension_id,
396 const base::Closure& callback, 339 const base::Closure& callback,
397 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { 340 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) {
398 // Clean up any existing session instance for the extension. 341 // Clean up any existing session instance for the extension.
399 DiscoverySessionMap::iterator iter = 342 DiscoverySessionMap::iterator iter =
400 discovery_session_map_.find(extension_id); 343 discovery_session_map_.find(extension_id);
401 if (iter != discovery_session_map_.end()) 344 if (iter != discovery_session_map_.end())
402 delete iter->second; 345 delete iter->second;
403 discovery_session_map_[extension_id] = discovery_session.release(); 346 discovery_session_map_[extension_id] = discovery_session.release();
404 callback.Run(); 347 callback.Run();
405 } 348 }
406 349
407 void ExtensionBluetoothEventRouter::Observe( 350 void ExtensionBluetoothEventRouter::Observe(
408 int type, 351 int type,
409 const content::NotificationSource& source, 352 const content::NotificationSource& source,
410 const content::NotificationDetails& details) { 353 const content::NotificationDetails& details) {
354 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
411 switch (type) { 355 switch (type) {
412 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { 356 case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
413 extensions::UnloadedExtensionInfo* info = 357 extensions::UnloadedExtensionInfo* info =
414 content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); 358 content::Details<extensions::UnloadedExtensionInfo>(details).ptr();
415 CleanUpForExtension(info->extension->id()); 359 CleanUpForExtension(info->extension->id());
416 break; 360 break;
417 } 361 }
362 case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: {
363 ExtensionHost* host = content::Details<ExtensionHost>(details).ptr();
364 CleanUpForExtension(host->extension_id());
365 break;
366 }
418 } 367 }
419 } 368 }
420 369
421 } // namespace extensions 370 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698