OLD | NEW |
---|---|
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 if (adapter_) |
38 adapter_->RemoveObserver(this); | 38 ReleaseAdapter(); |
39 | 39 |
40 socket_map_.clear(); | 40 socket_map_.clear(); |
41 } | 41 } |
42 | 42 |
43 scoped_refptr<const device::BluetoothAdapter> | |
44 ExtensionBluetoothEventRouter::adapter() { | |
45 return GetMutableAdapter(); | |
46 } | |
47 | |
48 scoped_refptr<device::BluetoothAdapter> | |
49 ExtensionBluetoothEventRouter::GetMutableAdapter() { | |
50 if (adapter_) | |
51 return adapter_; | |
52 | |
53 return GetDefaultAdapter(); | |
54 } | |
55 | |
56 void ExtensionBluetoothEventRouter::InitializeAdapter() { | |
bryeung
2012/11/09 17:46:44
I'd like this renamed to InitializeAdapterIfNeeded
youngki
2012/11/12 23:25:24
Done.
| |
57 adapter_ = GetDefaultAdapter(); | |
bryeung
2012/11/09 17:46:44
Just call GetMutableAdapter here.
youngki
2012/11/12 23:25:24
Done.
| |
58 adapter_->AddObserver(this); | |
59 } | |
60 | |
61 void ExtensionBluetoothEventRouter::ReleaseAdapter() { | |
bryeung
2012/11/09 17:46:44
I'd like this to renamed MaybeReleaseAdapter and t
youngki
2012/11/12 23:25:24
Done.
| |
62 adapter_->RemoveObserver(this); | |
63 adapter_ = NULL; | |
64 } | |
65 | |
66 scoped_refptr<device::BluetoothAdapter> | |
67 ExtensionBluetoothEventRouter::GetDefaultAdapter() const { | |
68 return device::BluetoothAdapterFactory::DefaultAdapter(); | |
bryeung
2012/11/09 17:46:44
this should be moved into GetMutableAdapter
youngki
2012/11/12 23:25:24
Done.
| |
69 } | |
70 | |
43 int ExtensionBluetoothEventRouter::RegisterSocket( | 71 int ExtensionBluetoothEventRouter::RegisterSocket( |
44 scoped_refptr<device::BluetoothSocket> socket) { | 72 scoped_refptr<device::BluetoothSocket> socket) { |
45 // If there is a socket registered with the same fd, just return it's id | 73 // If there is a socket registered with the same fd, just return it's id |
46 for (SocketMap::const_iterator i = socket_map_.begin(); | 74 for (SocketMap::const_iterator i = socket_map_.begin(); |
47 i != socket_map_.end(); ++i) { | 75 i != socket_map_.end(); ++i) { |
48 if (i->second->fd() == socket->fd()) { | 76 if (i->second->fd() == socket->fd()) { |
49 return i->first; | 77 return i->first; |
50 } | 78 } |
51 } | 79 } |
52 int return_id = next_socket_id_++; | 80 int return_id = next_socket_id_++; |
53 socket_map_[return_id] = socket; | 81 socket_map_[return_id] = socket; |
82 if (!adapter_) | |
83 InitializeAdapter(); | |
84 | |
54 return return_id; | 85 return return_id; |
55 } | 86 } |
56 | 87 |
57 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { | 88 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { |
58 SocketMap::iterator socket_entry = socket_map_.find(id); | 89 SocketMap::iterator socket_entry = socket_map_.find(id); |
59 if (socket_entry == socket_map_.end()) | 90 if (socket_entry == socket_map_.end()) |
60 return false; | 91 return false; |
61 socket_map_.erase(socket_entry); | 92 socket_map_.erase(socket_entry); |
93 if (adapter_ && !IsAdapterNeeded()) | |
94 ReleaseAdapter(); | |
95 | |
62 return true; | 96 return true; |
63 } | 97 } |
64 | 98 |
65 scoped_refptr<device::BluetoothSocket> | 99 scoped_refptr<device::BluetoothSocket> |
66 ExtensionBluetoothEventRouter::GetSocket(int id) { | 100 ExtensionBluetoothEventRouter::GetSocket(int id) { |
67 SocketMap::iterator socket_entry = socket_map_.find(id); | 101 SocketMap::iterator socket_entry = socket_map_.find(id); |
68 if (socket_entry == socket_map_.end()) | 102 if (socket_entry == socket_map_.end()) |
69 return NULL; | 103 return NULL; |
70 return socket_entry->second; | 104 return socket_entry->second; |
71 } | 105 } |
72 | 106 |
107 // static | |
108 bool ExtensionBluetoothEventRouter::IsBluetoothEvent( | |
109 const std::string& event_name) { | |
110 return | |
111 event_name == extensions::event_names::kBluetoothOnAvailabilityChanged || | |
112 event_name == extensions::event_names::kBluetoothOnDiscoveringChanged || | |
113 event_name == extensions::event_names::kBluetoothOnPowerChanged; | |
114 } | |
115 | |
116 bool ExtensionBluetoothEventRouter::IsAdapterNeeded() const { | |
117 return num_event_listeners_ > 0 || socket_map_.size() > 0; | |
118 } | |
119 | |
120 void ExtensionBluetoothEventRouter::OnEventListenerAdded( | |
121 const std::string& event_name) { | |
122 if (IsBluetoothEvent(event_name)) { | |
123 num_event_listeners_++; | |
124 if (!adapter_) | |
125 InitializeAdapter(); | |
126 } | |
127 } | |
128 | |
129 void ExtensionBluetoothEventRouter::OnEventListenerRemoved( | |
130 const std::string& event_name) { | |
131 if (IsBluetoothEvent(event_name)) { | |
132 num_event_listeners_--; | |
133 DCHECK(num_event_listeners_ >= 0); | |
134 if (adapter_ && !IsAdapterNeeded()) | |
135 ReleaseAdapter(); | |
136 } | |
137 } | |
138 | |
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( | 139 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( |
74 bool responsible) { | 140 bool responsible) { |
75 responsible_for_discovery_ = responsible; | 141 responsible_for_discovery_ = responsible; |
76 } | 142 } |
77 | 143 |
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { | 144 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { |
79 return responsible_for_discovery_; | 145 return responsible_for_discovery_; |
80 } | 146 } |
81 | 147 |
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { | 148 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { |
(...skipping 13 matching lines...) Expand all Loading... | |
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( | 162 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( |
97 const char* event_name, const extensions::api::bluetooth::Device& device) { | 163 const char* event_name, const extensions::api::bluetooth::Device& device) { |
98 scoped_ptr<ListValue> args(new ListValue()); | 164 scoped_ptr<ListValue> args(new ListValue()); |
99 args->Append(device.ToValue().release()); | 165 args->Append(device.ToValue().release()); |
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> | 166 extensions::ExtensionSystem::Get(profile_)->event_router()-> |
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); | 167 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); |
102 } | 168 } |
103 | 169 |
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( | 170 void ExtensionBluetoothEventRouter::AdapterPresentChanged( |
105 device::BluetoothAdapter* adapter, bool present) { | 171 device::BluetoothAdapter* adapter, bool present) { |
106 if (adapter != adapter_.get()) { | 172 if (adapter != adapter_) { |
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | 173 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
108 return; | 174 return; |
109 } | 175 } |
110 | 176 |
111 DispatchBooleanValueEvent( | 177 DispatchBooleanValueEvent( |
112 extensions::event_names::kBluetoothOnAvailabilityChanged, | 178 extensions::event_names::kBluetoothOnAvailabilityChanged, |
113 present); | 179 present); |
114 } | 180 } |
115 | 181 |
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( | 182 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( |
117 device::BluetoothAdapter* adapter, bool has_power) { | 183 device::BluetoothAdapter* adapter, bool has_power) { |
118 if (adapter != adapter_.get()) { | 184 if (adapter != adapter_) { |
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | 185 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
120 return; | 186 return; |
121 } | 187 } |
122 | 188 |
123 DispatchBooleanValueEvent( | 189 DispatchBooleanValueEvent( |
124 extensions::event_names::kBluetoothOnPowerChanged, | 190 extensions::event_names::kBluetoothOnPowerChanged, |
125 has_power); | 191 has_power); |
126 } | 192 } |
127 | 193 |
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( | 194 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( |
129 device::BluetoothAdapter* adapter, bool discovering) { | 195 device::BluetoothAdapter* adapter, bool discovering) { |
130 if (adapter != adapter_.get()) { | 196 if (adapter != adapter_) { |
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | 197 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
132 return; | 198 return; |
133 } | 199 } |
134 | 200 |
135 if (!discovering) { | 201 if (!discovering) { |
136 send_discovery_events_ = false; | 202 send_discovery_events_ = false; |
137 responsible_for_discovery_ = false; | 203 responsible_for_discovery_ = false; |
138 discovered_devices_.clear(); | 204 discovered_devices_.clear(); |
139 } | 205 } |
140 | 206 |
141 DispatchBooleanValueEvent( | 207 DispatchBooleanValueEvent( |
142 extensions::event_names::kBluetoothOnDiscoveringChanged, | 208 extensions::event_names::kBluetoothOnDiscoveringChanged, |
143 discovering); | 209 discovering); |
144 } | 210 } |
145 | 211 |
146 void ExtensionBluetoothEventRouter::DeviceAdded( | 212 void ExtensionBluetoothEventRouter::DeviceAdded( |
147 device::BluetoothAdapter* adapter, | 213 device::BluetoothAdapter* adapter, |
148 device::BluetoothDevice* device) { | 214 device::BluetoothDevice* device) { |
149 if (adapter != adapter_.get()) { | 215 if (adapter != adapter_) { |
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | 216 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); |
151 return; | 217 return; |
152 } | 218 } |
153 | 219 |
154 extensions::api::bluetooth::Device* extension_device = | 220 extensions::api::bluetooth::Device* extension_device = |
155 new extensions::api::bluetooth::Device(); | 221 new extensions::api::bluetooth::Device(); |
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( | 222 extensions::api::bluetooth::BluetoothDeviceToApiDevice( |
157 *device, extension_device); | 223 *device, extension_device); |
158 discovered_devices_.push_back(extension_device); | 224 discovered_devices_.push_back(extension_device); |
159 | 225 |
160 if (!send_discovery_events_) | 226 if (!send_discovery_events_) |
161 return; | 227 return; |
162 | 228 |
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, | 229 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, |
164 *extension_device); | 230 *extension_device); |
165 } | 231 } |
166 | 232 |
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( | 233 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( |
168 const char* event_name, bool value) { | 234 const char* event_name, bool value) { |
169 scoped_ptr<ListValue> args(new ListValue()); | 235 scoped_ptr<ListValue> args(new ListValue()); |
170 args->Append(Value::CreateBooleanValue(value)); | 236 args->Append(Value::CreateBooleanValue(value)); |
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> | 237 extensions::ExtensionSystem::Get(profile_)->event_router()-> |
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); | 238 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); |
173 } | 239 } |
174 | 240 |
175 } // namespace extensions | 241 } // namespace extensions |
OLD | NEW |