OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/extensions/bluetooth_event_router.h" | |
6 | |
7 #include <map> | |
8 | |
9 #include "base/json/json_writer.h" | |
10 #include "base/memory/ref_counted.h" | |
11 #include "base/memory/scoped_vector.h" | |
12 #include "base/utf_string_conversions.h" | |
13 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h" | |
14 #include "chrome/browser/extensions/event_names.h" | |
15 #include "chrome/browser/extensions/event_router.h" | |
16 #include "chrome/browser/extensions/extension_system.h" | |
17 #include "chrome/common/extensions/api/bluetooth.h" | |
18 #include "device/bluetooth/bluetooth_adapter.h" | |
19 #include "device/bluetooth/bluetooth_adapter_factory.h" | |
20 #include "device/bluetooth/bluetooth_device.h" | |
21 #include "device/bluetooth/bluetooth_socket.h" | |
22 | |
23 namespace extensions { | |
24 | |
25 ExtensionBluetoothEventRouter::ExtensionBluetoothEventRouter(Profile* profile) | |
26 : send_discovery_events_(false), | |
27 responsible_for_discovery_(false), | |
28 profile_(profile), | |
29 adapter_(device::BluetoothAdapterFactory::DefaultAdapter()), | |
30 next_socket_id_(1) { | |
31 DCHECK(profile_); | |
32 if (adapter_.get()) | |
33 adapter_->AddObserver(this); | |
34 } | |
35 | |
36 ExtensionBluetoothEventRouter::~ExtensionBluetoothEventRouter() { | |
37 if (adapter_.get()) | |
38 adapter_->RemoveObserver(this); | |
39 | |
40 socket_map_.clear(); | |
41 } | |
42 | |
43 int ExtensionBluetoothEventRouter::RegisterSocket( | |
44 scoped_refptr<device::BluetoothSocket> socket) { | |
45 // If there is a socket registered with the same fd, just return it's id | |
46 for (SocketMap::const_iterator i = socket_map_.begin(); | |
47 i != socket_map_.end(); ++i) { | |
48 if (i->second->fd() == socket->fd()) { | |
49 return i->first; | |
50 } | |
51 } | |
52 int return_id = next_socket_id_++; | |
53 socket_map_[return_id] = socket; | |
54 return return_id; | |
55 } | |
56 | |
57 bool ExtensionBluetoothEventRouter::ReleaseSocket(int id) { | |
58 SocketMap::iterator socket_entry = socket_map_.find(id); | |
59 if (socket_entry == socket_map_.end()) | |
60 return false; | |
61 socket_map_.erase(socket_entry); | |
62 return true; | |
63 } | |
64 | |
65 scoped_refptr<device::BluetoothSocket> | |
66 ExtensionBluetoothEventRouter::GetSocket(int id) { | |
67 SocketMap::iterator socket_entry = socket_map_.find(id); | |
68 if (socket_entry == socket_map_.end()) | |
69 return NULL; | |
70 return socket_entry->second; | |
71 } | |
72 | |
73 void ExtensionBluetoothEventRouter::SetResponsibleForDiscovery( | |
74 bool responsible) { | |
75 responsible_for_discovery_ = responsible; | |
76 } | |
77 | |
78 bool ExtensionBluetoothEventRouter::IsResponsibleForDiscovery() const { | |
79 return responsible_for_discovery_; | |
80 } | |
81 | |
82 void ExtensionBluetoothEventRouter::SetSendDiscoveryEvents(bool should_send) { | |
83 // At the transition into sending devices, also send past devices that | |
84 // were discovered as they will not be discovered again. | |
85 if (should_send && !send_discovery_events_) { | |
86 for (DeviceList::const_iterator i = discovered_devices_.begin(); | |
87 i != discovered_devices_.end(); ++i) { | |
88 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, | |
89 **i); | |
90 } | |
91 } | |
92 | |
93 send_discovery_events_ = should_send; | |
94 } | |
95 | |
96 void ExtensionBluetoothEventRouter::DispatchDeviceEvent( | |
97 const char* event_name, const extensions::api::bluetooth::Device& device) { | |
98 scoped_ptr<ListValue> args(new ListValue()); | |
99 args->Append(device.ToValue().release()); | |
100 extensions::ExtensionSystem::Get(profile_)->event_router()-> | |
101 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); | |
102 } | |
103 | |
104 void ExtensionBluetoothEventRouter::AdapterPresentChanged( | |
105 device::BluetoothAdapter* adapter, bool present) { | |
106 if (adapter != adapter_.get()) { | |
107 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | |
108 return; | |
109 } | |
110 | |
111 DispatchBooleanValueEvent( | |
112 extensions::event_names::kBluetoothOnAvailabilityChanged, | |
113 present); | |
114 } | |
115 | |
116 void ExtensionBluetoothEventRouter::AdapterPoweredChanged( | |
117 device::BluetoothAdapter* adapter, bool has_power) { | |
118 if (adapter != adapter_.get()) { | |
119 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | |
120 return; | |
121 } | |
122 | |
123 DispatchBooleanValueEvent( | |
124 extensions::event_names::kBluetoothOnPowerChanged, | |
125 has_power); | |
126 } | |
127 | |
128 void ExtensionBluetoothEventRouter::AdapterDiscoveringChanged( | |
129 device::BluetoothAdapter* adapter, bool discovering) { | |
130 if (adapter != adapter_.get()) { | |
131 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | |
132 return; | |
133 } | |
134 | |
135 if (!discovering) { | |
136 send_discovery_events_ = false; | |
137 responsible_for_discovery_ = false; | |
138 discovered_devices_.clear(); | |
139 } | |
140 | |
141 DispatchBooleanValueEvent( | |
142 extensions::event_names::kBluetoothOnDiscoveringChanged, | |
143 discovering); | |
144 } | |
145 | |
146 void ExtensionBluetoothEventRouter::DeviceAdded( | |
147 device::BluetoothAdapter* adapter, | |
148 device::BluetoothDevice* device) { | |
149 if (adapter != adapter_.get()) { | |
150 DVLOG(1) << "Ignoring event for adapter " << adapter->address(); | |
151 return; | |
152 } | |
153 | |
154 extensions::api::bluetooth::Device* extension_device = | |
155 new extensions::api::bluetooth::Device(); | |
156 extensions::api::bluetooth::BluetoothDeviceToApiDevice( | |
157 *device, extension_device); | |
158 discovered_devices_.push_back(extension_device); | |
159 | |
160 if (!send_discovery_events_) | |
161 return; | |
162 | |
163 DispatchDeviceEvent(extensions::event_names::kBluetoothOnDeviceDiscovered, | |
164 *extension_device); | |
165 } | |
166 | |
167 void ExtensionBluetoothEventRouter::DispatchBooleanValueEvent( | |
168 const char* event_name, bool value) { | |
169 scoped_ptr<ListValue> args(new ListValue()); | |
170 args->Append(Value::CreateBooleanValue(value)); | |
171 extensions::ExtensionSystem::Get(profile_)->event_router()-> | |
172 DispatchEventToRenderers(event_name, args.Pass(), NULL, GURL()); | |
173 } | |
174 | |
175 } // namespace extensions | |
OLD | NEW |