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

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 unnecessary if block 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() {
bryeung 2012/11/13 15:14:43 shouldn't this always release the adapter? Seems
youngki 2012/11/13 16:09:49 Done.
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();
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 if (!IsAdapterNeeded())
bryeung 2012/11/13 15:14:43 this check should be moved to MaybeReleaseAdapter
youngki 2012/11/13 16:09:49 Done.
90 MaybeReleaseAdapter();
62 return true; 91 return true;
63 } 92 }
64 93
65 scoped_refptr<device::BluetoothSocket> 94 scoped_refptr<device::BluetoothSocket>
66 ExtensionBluetoothEventRouter::GetSocket(int id) { 95 ExtensionBluetoothEventRouter::GetSocket(int id) {
67 SocketMap::iterator socket_entry = socket_map_.find(id); 96 SocketMap::iterator socket_entry = socket_map_.find(id);
68 if (socket_entry == socket_map_.end()) 97 if (socket_entry == socket_map_.end())
69 return NULL; 98 return NULL;
70 return socket_entry->second; 99 return socket_entry->second;
71 } 100 }
72 101
102 bool ExtensionBluetoothEventRouter::IsAdapterNeeded() const {
bryeung 2012/11/13 15:14:43 no need for a separate method: roll this code into
youngki 2012/11/13 16:09:49 Done.
103 return num_event_listeners_ > 0 || socket_map_.size() > 0;
bryeung 2012/11/13 15:14:43 Actually: I don't think we need to check the socke
youngki 2012/11/13 16:09:49 Done. I removed the test of creating/removing adap
104 }
105
106 void ExtensionBluetoothEventRouter::OnListenerAdded() {
107 num_event_listeners_++;
108 InitializeAdapterIfNeeded();
109 }
110
111 void ExtensionBluetoothEventRouter::OnListenerRemoved() {
112 num_event_listeners_--;
113 DCHECK(num_event_listeners_ >= 0);
114 if (!IsAdapterNeeded())
115 MaybeReleaseAdapter();
116 }
117
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( 118 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery(
74 bool responsible) { 119 bool responsible) {
75 responsible_for_discovery_ = responsible; 120 responsible_for_discovery_ = responsible;
76 } 121 }
77 122
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { 123 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const {
79 return responsible_for_discovery_; 124 return responsible_for_discovery_;
80 } 125 }
81 126
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { 127 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) {
(...skipping 13 matching lines...) Expand all
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 141 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
97 const char* event_name, const extensions::api::bluetooth::Device& device) { 142 const char* event_name, const extensions::api::bluetooth::Device& device) {
98 scoped_ptr<ListValue> args(new ListValue()); 143 scoped_ptr<ListValue> args(new ListValue());
99 args->Append(device.ToValue().release()); 144 args->Append(device.ToValue().release());
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> 145 extensions::ExtensionSystem::Get(profile_)->event_router()->
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 146 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
102 } 147 }
103 148
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 149 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
105 device::BluetoothAdapter* adapter, bool present) { 150 device::BluetoothAdapter* adapter, bool present) {
106 if (adapter != adapter_.get()) { 151 if (adapter != adapter_) {
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 152 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
108 return; 153 return;
109 } 154 }
110 155
111 DispatchBooleanValueEvent( 156 DispatchBooleanValueEvent(
112 extensions::event_names::kBluetoothOnAvailabilityChanged, 157 extensions::event_names::kBluetoothOnAvailabilityChanged,
113 present); 158 present);
114 } 159 }
115 160
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 161 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
117 device::BluetoothAdapter* adapter, bool has_power) { 162 device::BluetoothAdapter* adapter, bool has_power) {
118 if (adapter != adapter_.get()) { 163 if (adapter != adapter_) {
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 164 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
120 return; 165 return;
121 } 166 }
122 167
123 DispatchBooleanValueEvent( 168 DispatchBooleanValueEvent(
124 extensions::event_names::kBluetoothOnPowerChanged, 169 extensions::event_names::kBluetoothOnPowerChanged,
125 has_power); 170 has_power);
126 } 171 }
127 172
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 173 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
129 device::BluetoothAdapter* adapter, bool discovering) { 174 device::BluetoothAdapter* adapter, bool discovering) {
130 if (adapter != adapter_.get()) { 175 if (adapter != adapter_) {
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 176 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
132 return; 177 return;
133 } 178 }
134 179
135 if (!discovering) { 180 if (!discovering) {
136 send_discovery_events_ = false; 181 send_discovery_events_ = false;
137 responsible_for_discovery_ = false; 182 responsible_for_discovery_ = false;
138 discovered_devices_.clear(); 183 discovered_devices_.clear();
139 } 184 }
140 185
141 DispatchBooleanValueEvent( 186 DispatchBooleanValueEvent(
142 extensions::event_names::kBluetoothOnDiscoveringChanged, 187 extensions::event_names::kBluetoothOnDiscoveringChanged,
143 discovering); 188 discovering);
144 } 189 }
145 190
146 void ExtensionBluetoothEventRouter::DeviceAdded( 191 void ExtensionBluetoothEventRouter::DeviceAdded(
147 device::BluetoothAdapter* adapter, 192 device::BluetoothAdapter* adapter,
148 device::BluetoothDevice* device) { 193 device::BluetoothDevice* device) {
149 if (adapter != adapter_.get()) { 194 if (adapter != adapter_) {
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 195 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
151 return; 196 return;
152 } 197 }
153 198
154 extensions::api::bluetooth::Device* extension_device = 199 extensions::api::bluetooth::Device* extension_device =
155 new extensions::api::bluetooth::Device(); 200 new extensions::api::bluetooth::Device();
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( 201 extensions::api::bluetooth::BluetoothDeviceToApiDevice(
157 *device, extension_device); 202 *device, extension_device);
158 discovered_devices_.push_back(extension_device); 203 discovered_devices_.push_back(extension_device);
159 204
160 if (!send_discovery_events_) 205 if (!send_discovery_events_)
161 return; 206 return;
162 207
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, 208 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered,
164 *extension_device); 209 *extension_device);
165 } 210 }
166 211
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( 212 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent(
168 const char* event_name, bool value) { 213 const char* event_name, bool value) {
169 scoped_ptr<ListValue> args(new ListValue()); 214 scoped_ptr<ListValue> args(new ListValue());
170 args->Append(Value::CreateBooleanValue(value)); 215 args->Append(Value::CreateBooleanValue(value));
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> 216 extensions::ExtensionSystem::Get(profile_)->event_router()->
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 217 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
173 } 218 }
174 219
175 } // namespace extensions 220 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698