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

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 MockBluetoothSocket 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 CHECK(socket_map_.size() == 0);
38 adapter_->RemoveObserver(this); 38 CHECK(num_event_listeners_ == 0);
39 MaybeReleaseAdapter();
40 }
39 41
40 socket_map_.clear(); 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::OnListenerAdded() {
56 num_event_listeners_++;
57 InitializeAdapterIfNeeded();
58 }
59
60 void ExtensionBluetoothEventRouter::OnListenerRemoved() {
61 num_event_listeners_--;
62 CHECK(num_event_listeners_ >= 0);
63 MaybeReleaseAdapter();
41 } 64 }
42 65
43 int ExtensionBluetoothEventRouter::RegisterSocket( 66 int ExtensionBluetoothEventRouter::RegisterSocket(
44 scoped_refptr<device::BluetoothSocket> socket) { 67 scoped_refptr<device::BluetoothSocket> socket) {
45 // If there is a socket registered with the same fd, just return it's id 68 // If there is a socket registered with the same fd, just return it's id
46 for (SocketMap::const_iterator i = socket_map_.begin(); 69 for (SocketMap::const_iterator i = socket_map_.begin();
47 i != socket_map_.end(); ++i) { 70 i != socket_map_.end(); ++i) {
48 if (i->second->fd() == socket->fd()) { 71 if (i->second->fd() == socket->fd()) {
49 return i->first; 72 return i->first;
50 } 73 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( 119 void ExtensionBluetoothEventRouter::DispatchDeviceEvent(
97 const char* event_name, const extensions::api::bluetooth::Device& device) { 120 const char* event_name, const extensions::api::bluetooth::Device& device) {
98 scoped_ptr<ListValue> args(new ListValue()); 121 scoped_ptr<ListValue> args(new ListValue());
99 args->Append(device.ToValue().release()); 122 args->Append(device.ToValue().release());
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> 123 extensions::ExtensionSystem::Get(profile_)->event_router()->
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 124 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
102 } 125 }
103 126
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( 127 void ExtensionBluetoothEventRouter::AdapterPresentChanged(
105 device::BluetoothAdapter* adapter, bool present) { 128 device::BluetoothAdapter* adapter, bool present) {
106 if (adapter != adapter_.get()) { 129 if (adapter != adapter_) {
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 130 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
108 return; 131 return;
109 } 132 }
110 133
111 DispatchBooleanValueEvent( 134 DispatchBooleanValueEvent(
112 extensions::event_names::kBluetoothOnAvailabilityChanged, 135 extensions::event_names::kBluetoothOnAvailabilityChanged,
113 present); 136 present);
114 } 137 }
115 138
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( 139 void ExtensionBluetoothEventRouter::AdapterPoweredChanged(
117 device::BluetoothAdapter* adapter, bool has_power) { 140 device::BluetoothAdapter* adapter, bool has_power) {
118 if (adapter != adapter_.get()) { 141 if (adapter != adapter_) {
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 142 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
120 return; 143 return;
121 } 144 }
122 145
123 DispatchBooleanValueEvent( 146 DispatchBooleanValueEvent(
124 extensions::event_names::kBluetoothOnPowerChanged, 147 extensions::event_names::kBluetoothOnPowerChanged,
125 has_power); 148 has_power);
126 } 149 }
127 150
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( 151 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged(
129 device::BluetoothAdapter* adapter, bool discovering) { 152 device::BluetoothAdapter* adapter, bool discovering) {
130 if (adapter != adapter_.get()) { 153 if (adapter != adapter_) {
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 154 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
132 return; 155 return;
133 } 156 }
134 157
135 if (!discovering) { 158 if (!discovering) {
136 send_discovery_events_ = false; 159 send_discovery_events_ = false;
137 responsible_for_discovery_ = false; 160 responsible_for_discovery_ = false;
138 discovered_devices_.clear(); 161 discovered_devices_.clear();
139 } 162 }
140 163
141 DispatchBooleanValueEvent( 164 DispatchBooleanValueEvent(
142 extensions::event_names::kBluetoothOnDiscoveringChanged, 165 extensions::event_names::kBluetoothOnDiscoveringChanged,
143 discovering); 166 discovering);
144 } 167 }
145 168
146 void ExtensionBluetoothEventRouter::DeviceAdded( 169 void ExtensionBluetoothEventRouter::DeviceAdded(
147 device::BluetoothAdapter* adapter, 170 device::BluetoothAdapter* adapter,
148 device::BluetoothDevice* device) { 171 device::BluetoothDevice* device) {
149 if (adapter != adapter_.get()) { 172 if (adapter != adapter_) {
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); 173 DVLOG(1) << "Ignoring event for adapter " << adapter->address();
151 return; 174 return;
152 } 175 }
153 176
154 extensions::api::bluetooth::Device* extension_device = 177 extensions::api::bluetooth::Device* extension_device =
155 new extensions::api::bluetooth::Device(); 178 new extensions::api::bluetooth::Device();
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( 179 extensions::api::bluetooth::BluetoothDeviceToApiDevice(
157 *device, extension_device); 180 *device, extension_device);
158 discovered_devices_.push_back(extension_device); 181 discovered_devices_.push_back(extension_device);
159 182
160 if (!send_discovery_events_) 183 if (!send_discovery_events_)
161 return; 184 return;
162 185
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, 186 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered,
164 *extension_device); 187 *extension_device);
165 } 188 }
166 189
190 void ExtensionBluetoothEventRouter::InitializeAdapterIfNeeded() {
191 if (!adapter_) {
192 adapter_ = GetMutableAdapter();
193 adapter_->AddObserver(this);
194 }
195 }
196
197 void ExtensionBluetoothEventRouter::MaybeReleaseAdapter() {
198 if (adapter_ && num_event_listeners_ == 0) {
199 adapter_->RemoveObserver(this);
200 adapter_ = NULL;
201 }
202 }
203
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( 204 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent(
168 const char* event_name, bool value) { 205 const char* event_name, bool value) {
169 scoped_ptr<ListValue> args(new ListValue()); 206 scoped_ptr<ListValue> args(new ListValue());
170 args->Append(Value::CreateBooleanValue(value)); 207 args->Append(Value::CreateBooleanValue(value));
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> 208 extensions::ExtensionSystem::Get(profile_)->event_router()->
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); 209 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL());
173 } 210 }
174 211
175 } // namespace extensions 212 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698