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

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

Issue 11360200: Decouple bluetooth_event_router from extension_system. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Removed socket checks from creating and removing adapters. 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
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/api/bluetooth/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 DCHECK(socket_map_.size() == 0);
bryeung 2012/11/13 16:16:15 CHECK, not DCHECK please
youngki 2012/11/13 17:01:30 Done.
38 DCHECK(num_event_listeners_ == 0);
39 MaybeReleaseAdapter();
40 }
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() {
bryeung 2012/11/13 16:16:15 re-order methods to match header please
youngki 2012/11/13 17:01:30 Done.
56 if (!adapter_) {
57 adapter_ = GetMutableAdapter();
58 adapter_->AddObserver(this);
59 }
60 }
61
62 void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() {
63 if (adapter_ && num_event_listeners_ == 0) {
38 adapter_->RemoveObserver(this); 64 adapter_->RemoveObserver(this);
39 65 adapter_ = NULL;
40 socket_map_.clear(); 66 }
41 } 67 }
42 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();
bryeung 2012/11/13 16:16:15 we shouldn't be holding the adapter for sockets
youngki 2012/11/13 17:01:30 Done.
54 return return_id; 81 return return_id;
55 } 82 }
56 83
57 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { 84 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) {
58 SocketMap::iterator socket_entry = socket_map_.find(id); 85 SocketMap::iterator socket_entry = socket_map_.find(id);
59 if (socket_entry == socket_map_.end()) 86 if (socket_entry == socket_map_.end())
60 return false; 87 return false;
61 socket_map_.erase(socket_entry); 88 socket_map_.erase(socket_entry);
89 MaybeReleaseAdapter();
bryeung 2012/11/13 16:16:15 don't need this for sockets
youngki 2012/11/13 17:01:30 Done.
62 return true; 90 return true;
63 } 91 }
64 92
65 scoped_refptr<device::BluetoothSocket> 93 scoped_refptr<device::BluetoothSocket>
66 ExtensionBluetoothEventRouter::GetSocket(int id) { 94 ExtensionBluetoothEventRouter::GetSocket(int id) {
67 SocketMap::iterator socket_entry = socket_map_.find(id); 95 SocketMap::iterator socket_entry = socket_map_.find(id);
68 if (socket_entry == socket_map_.end()) 96 if (socket_entry == socket_map_.end())
69 return NULL; 97 return NULL;
70 return socket_entry->second; 98 return socket_entry->second;
71 } 99 }
72 100
101 void ExtensionBluetoothEventRouter::OnListenerAdded() {
102 num_event_listeners_++;
103 InitializeAdapterIfNeeded();
104 }
105
106 void ExtensionBluetoothEventRouter::OnListenerRemoved() {
107 num_event_listeners_--;
108 DCHECK(num_event_listeners_ >= 0);
bryeung 2012/11/13 16:16:15 CHECK (since we'll leak the adapter if this goes b
youngki 2012/11/13 17:01:30 Done.
109 MaybeReleaseAdapter();
110 }
111
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( 112 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
74 bool responsible) { 113 bool responsible) {
75 responsible_for_discovery_ = responsible; 114 responsible_for_discovery_ = responsible;
76 } 115 }
77 116
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { 117 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const {
79 return responsible_for_discovery_; 118 return responsible_for_discovery_;
80 } 119 }
81 120
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { 121 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) {
(...skipping 13 matching lines...) Expand all
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 135 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
97 const char* event_name, const extensions::api::bluetooth::Device& device) { 136 const char* event_name, const extensions::api::bluetooth::Device& device) {
98 scoped_ptr<ListValue> args(new ListValue()); 137 scoped_ptr<ListValue> args(new ListValue());
99 args->Append(device.ToValue().release()); 138 args->Append(device.ToValue().release());
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> 139 extensions::ExtensionSystem::Get(profile_)->event_router()->
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 140 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
102 } 141 }
103 142
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 143 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
105 device::BluetoothAdapter* adapter, bool present) { 144 device::BluetoothAdapter* adapter, bool present) {
106 if (adapter != adapter_.get()) { 145 if (adapter != adapter_) {
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 146 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
108 return; 147 return;
109 } 148 }
110 149
111 DispatchBooleanValueEvent( 150 DispatchBooleanValueEvent(
112 extensions::event_names::kBluetoothOnAvailabilityChanged, 151 extensions::event_names::kBluetoothOnAvailabilityChanged,
113 present); 152 present);
114 } 153 }
115 154
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 155 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
117 device::BluetoothAdapter* adapter, bool has_power) { 156 device::BluetoothAdapter* adapter, bool has_power) {
118 if (adapter != adapter_.get()) { 157 if (adapter != adapter_) {
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 158 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
120 return; 159 return;
121 } 160 }
122 161
123 DispatchBooleanValueEvent( 162 DispatchBooleanValueEvent(
124 extensions::event_names::kBluetoothOnPowerChanged, 163 extensions::event_names::kBluetoothOnPowerChanged,
125 has_power); 164 has_power);
126 } 165 }
127 166
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 167 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
129 device::BluetoothAdapter* adapter, bool discovering) { 168 device::BluetoothAdapter* adapter, bool discovering) {
130 if (adapter != adapter_.get()) { 169 if (adapter != adapter_) {
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 170 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
132 return; 171 return;
133 } 172 }
134 173
135 if (!discovering) { 174 if (!discovering) {
136 send_discovery_events_ = false; 175 send_discovery_events_ = false;
137 responsible_for_discovery_ = false; 176 responsible_for_discovery_ = false;
138 discovered_devices_.clear(); 177 discovered_devices_.clear();
139 } 178 }
140 179
141 DispatchBooleanValueEvent( 180 DispatchBooleanValueEvent(
142 extensions::event_names::kBluetoothOnDiscoveringChanged, 181 extensions::event_names::kBluetoothOnDiscoveringChanged,
143 discovering); 182 discovering);
144 } 183 }
145 184
146 void ExtensionBluetoothEventRouter::DeviceAdded( 185 void ExtensionBluetoothEventRouter::DeviceAdded(
147 device::BluetoothAdapter* adapter, 186 device::BluetoothAdapter* adapter,
148 device::BluetoothDevice* device) { 187 device::BluetoothDevice* device) {
149 if (adapter != adapter_.get()) { 188 if (adapter != adapter_) {
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 189 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
151 return; 190 return;
152 } 191 }
153 192
154 extensions::api::bluetooth::Device* extension_device = 193 extensions::api::bluetooth::Device* extension_device =
155 new extensions::api::bluetooth::Device(); 194 new extensions::api::bluetooth::Device();
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( 195 extensions::api::bluetooth::BluetoothDeviceToApiDevice(
157 *device, extension_device); 196 *device, extension_device);
158 discovered_devices_.push_back(extension_device); 197 discovered_devices_.push_back(extension_device);
159 198
160 if (!send_discovery_events_) 199 if (!send_discovery_events_)
161 return; 200 return;
162 201
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, 202 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered,
164 *extension_device); 203 *extension_device);
165 } 204 }
166 205
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( 206 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent(
168 const char* event_name, bool value) { 207 const char* event_name, bool value) {
169 scoped_ptr<ListValue> args(new ListValue()); 208 scoped_ptr<ListValue> args(new ListValue());
170 args->Append(Value::CreateBooleanValue(value)); 209 args->Append(Value::CreateBooleanValue(value));
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> 210 extensions::ExtensionSystem::Get(profile_)->event_router()->
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 211 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
173 } 212 }
174 213
175 } // namespace extensions 214 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698