OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/api/bluetooth_low_energy/bluetooth_low_energ
y_api.h" | 5 #include "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energ
y_api.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <iterator> | 9 #include <iterator> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/callback_forward.h" | 14 #include "base/callback_forward.h" |
15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
16 #include "base/lazy_instance.h" | 16 #include "base/lazy_instance.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/memory/weak_ptr.h" |
18 #include "base/values.h" | 19 #include "base/values.h" |
19 #include "chrome/browser/extensions/api/bluetooth_low_energy/utils.h" | 20 #include "chrome/browser/extensions/api/bluetooth_low_energy/utils.h" |
20 #include "chrome/common/extensions/api/bluetooth_low_energy.h" | 21 #include "chrome/common/extensions/api/bluetooth_low_energy.h" |
21 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
22 #include "device/bluetooth/bluetooth_adapter.h" | 23 #include "device/bluetooth/bluetooth_adapter.h" |
| 24 #include "device/bluetooth/bluetooth_gatt_characteristic.h" |
| 25 #include "device/bluetooth/bluetooth_local_gatt_characteristic.h" |
| 26 #include "device/bluetooth/bluetooth_local_gatt_descriptor.h" |
| 27 #include "device/bluetooth/bluetooth_local_gatt_service.h" |
| 28 #include "device/bluetooth/bluetooth_uuid.h" |
23 #include "extensions/common/api/bluetooth/bluetooth_manifest_data.h" | 29 #include "extensions/common/api/bluetooth/bluetooth_manifest_data.h" |
24 #include "extensions/common/extension.h" | 30 #include "extensions/common/extension.h" |
25 #include "extensions/common/switches.h" | 31 #include "extensions/common/switches.h" |
26 | 32 |
27 #if defined(OS_CHROMEOS) | 33 #if defined(OS_CHROMEOS) |
28 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" | 34 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
29 #endif | 35 #endif |
30 | 36 |
31 using content::BrowserContext; | 37 using content::BrowserContext; |
32 using content::BrowserThread; | 38 using content::BrowserThread; |
(...skipping 22 matching lines...) Expand all Loading... |
55 const char kErrorNotNotifying[] = "Not notifying"; | 61 const char kErrorNotNotifying[] = "Not notifying"; |
56 const char kErrorOffsetInvalid[] = "Offset invalid"; | 62 const char kErrorOffsetInvalid[] = "Offset invalid"; |
57 const char kErrorOperationFailed[] = "Operation failed"; | 63 const char kErrorOperationFailed[] = "Operation failed"; |
58 const char kErrorPermissionDenied[] = "Permission denied"; | 64 const char kErrorPermissionDenied[] = "Permission denied"; |
59 const char kErrorPlatformNotSupported[] = | 65 const char kErrorPlatformNotSupported[] = |
60 "This operation is not supported on the current platform"; | 66 "This operation is not supported on the current platform"; |
61 const char kErrorRequestNotSupported[] = "Request not supported"; | 67 const char kErrorRequestNotSupported[] = "Request not supported"; |
62 const char kErrorTimeout[] = "Operation timed out"; | 68 const char kErrorTimeout[] = "Operation timed out"; |
63 const char kErrorUnsupportedDevice[] = | 69 const char kErrorUnsupportedDevice[] = |
64 "This device is not supported on the current platform"; | 70 "This device is not supported on the current platform"; |
| 71 const char kErrorInvalidServiceId[] = "The service ID doesn't exist."; |
| 72 const char kErrorInvalidCharacteristicId[] = |
| 73 "The characteristic ID doesn't exist."; |
65 const char kStatusAdvertisementAlreadyExists[] = | 74 const char kStatusAdvertisementAlreadyExists[] = |
66 "An advertisement is already advertising"; | 75 "An advertisement is already advertising"; |
67 const char kStatusAdvertisementDoesNotExist[] = | 76 const char kStatusAdvertisementDoesNotExist[] = |
68 "This advertisement does not exist"; | 77 "This advertisement does not exist"; |
69 | 78 |
70 // Returns the correct error string based on error status |status|. This is used | 79 // Returns the correct error string based on error status |status|. This is used |
71 // to set the value of |chrome.runtime.lastError.message| and should not be | 80 // to set the value of |chrome.runtime.lastError.message| and should not be |
72 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. | 81 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. |
73 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { | 82 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { |
74 switch (status) { | 83 switch (status) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 &DoWorkCallback<bool>, | 225 &DoWorkCallback<bool>, |
217 base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork, | 226 base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork, |
218 this)))) { | 227 this)))) { |
219 SetError(kErrorAdapterNotInitialized); | 228 SetError(kErrorAdapterNotInitialized); |
220 return false; | 229 return false; |
221 } | 230 } |
222 | 231 |
223 return true; | 232 return true; |
224 } | 233 } |
225 | 234 |
226 BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction() {} | 235 BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction() |
| 236 : event_router_(nullptr) {} |
227 | 237 |
228 BluetoothLowEnergyExtensionFunction::~BluetoothLowEnergyExtensionFunction() {} | 238 BluetoothLowEnergyExtensionFunction::~BluetoothLowEnergyExtensionFunction() {} |
229 | 239 |
230 ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() { | 240 ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() { |
231 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 241 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
232 | 242 |
233 if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) | 243 if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) |
234 return RespondNow(Error(kErrorPermissionDenied)); | 244 return RespondNow(Error(kErrorPermissionDenied)); |
235 | 245 |
236 BluetoothLowEnergyEventRouter* event_router = | 246 event_router_ = GetEventRouter(browser_context()); |
237 GetEventRouter(browser_context()); | 247 if (!event_router_->IsBluetoothSupported()) |
238 if (!event_router->IsBluetoothSupported()) | |
239 return RespondNow(Error(kErrorPlatformNotSupported)); | 248 return RespondNow(Error(kErrorPlatformNotSupported)); |
240 | 249 |
241 // It is safe to pass |this| here as ExtensionFunction is refcounted. | 250 // It is safe to pass |this| here as ExtensionFunction is refcounted. |
242 if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind( | 251 if (!event_router_->InitializeAdapterAndInvokeCallback(base::Bind( |
243 &DoWorkCallback<void>, | 252 &DoWorkCallback<void>, |
244 base::Bind(&BluetoothLowEnergyExtensionFunction::DoWork, this)))) { | 253 base::Bind(&BluetoothLowEnergyExtensionFunction::PreDoWork, this)))) { |
245 // DoWork will respond when the adapter gets initialized. | 254 // DoWork will respond when the adapter gets initialized. |
246 return RespondNow(Error(kErrorAdapterNotInitialized)); | 255 return RespondNow(Error(kErrorAdapterNotInitialized)); |
247 } | 256 } |
248 | 257 |
249 return RespondLater(); | 258 return RespondLater(); |
250 } | 259 } |
251 | 260 |
| 261 void BluetoothLowEnergyExtensionFunction::PreDoWork() { |
| 262 // The adapter must be initialized at this point, but return an error instead |
| 263 // of asserting. |
| 264 if (!event_router_->HasAdapter()) { |
| 265 Respond(Error(kErrorAdapterNotInitialized)); |
| 266 return; |
| 267 } |
| 268 DoWork(); |
| 269 } |
| 270 |
252 template <typename Params> | 271 template <typename Params> |
253 BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {} | 272 BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {} |
254 | 273 |
255 template <typename Params> | 274 template <typename Params> |
256 BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {} | 275 BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {} |
257 | 276 |
258 template <typename Params> | 277 template <typename Params> |
259 ExtensionFunction::ResponseAction | 278 ExtensionFunction::ResponseAction |
260 BLEPeripheralExtensionFunction<Params>::Run() { | 279 BLEPeripheralExtensionFunction<Params>::Run() { |
| 280 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 281 |
261 // Check permissions in manifest. | 282 // Check permissions in manifest. |
262 if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) | 283 if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) |
263 return RespondNow(Error(kErrorPermissionDenied)); | 284 return RespondNow(Error(kErrorPermissionDenied)); |
264 | 285 |
265 params_ = Params::Create(*args_); | 286 params_ = Params::Create(*args_); |
266 EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL); | 287 EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL); |
267 | 288 |
268 return BluetoothLowEnergyExtensionFunction::Run(); | 289 return BluetoothLowEnergyExtensionFunction::Run(); |
269 } | 290 } |
270 | 291 |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 | 1135 |
1115 template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>; | 1136 template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>; |
1116 | 1137 |
1117 void BluetoothLowEnergyCreateServiceFunction::DoWork() { | 1138 void BluetoothLowEnergyCreateServiceFunction::DoWork() { |
1118 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1139 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1119 // Using apibtle::CreateService::Results::Create causes a link error on | 1140 // Using apibtle::CreateService::Results::Create causes a link error on |
1120 // Windows for some reason, despite it being almost identical to its | 1141 // Windows for some reason, despite it being almost identical to its |
1121 // characteristic and descriptor counterparts. Since there is no plan to | 1142 // characteristic and descriptor counterparts. Since there is no plan to |
1122 // provide this API on Windows, ifdef'ing this out is fine. | 1143 // provide this API on Windows, ifdef'ing this out is fine. |
1123 #if !defined(OS_WIN) | 1144 #if !defined(OS_WIN) |
1124 Respond(ArgumentList(apibtle::CreateService::Results::Create(std::string()))); | 1145 base::WeakPtr<device::BluetoothLocalGattService> service = |
| 1146 device::BluetoothLocalGattService::Create( |
| 1147 event_router_->adapter(), |
| 1148 device::BluetoothUUID(params_->service.uuid), |
| 1149 params_->service.is_primary, nullptr, nullptr); |
| 1150 |
| 1151 Respond(ArgumentList( |
| 1152 apibtle::CreateService::Results::Create(service->GetIdentifier()))); |
1125 #else | 1153 #else |
1126 Respond(Error(kErrorPlatformNotSupported)); | 1154 Respond(Error(kErrorPlatformNotSupported)); |
1127 #endif | 1155 #endif |
1128 } | 1156 } |
1129 | 1157 |
1130 template class BLEPeripheralExtensionFunction< | 1158 template class BLEPeripheralExtensionFunction< |
1131 apibtle::CreateCharacteristic::Params>; | 1159 apibtle::CreateCharacteristic::Params>; |
1132 | 1160 |
1133 void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() { | 1161 void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() { |
1134 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1162 device::BluetoothLocalGattService* service = |
1135 Respond(ArgumentList( | 1163 event_router_->adapter()->GetGattService(params_->service_id); |
1136 apibtle::CreateCharacteristic::Results::Create(std::string()))); | 1164 if (!service) { |
| 1165 Respond(Error(kErrorInvalidServiceId)); |
| 1166 return; |
| 1167 } |
| 1168 |
| 1169 base::WeakPtr<device::BluetoothLocalGattCharacteristic> characteristic = |
| 1170 device::BluetoothLocalGattCharacteristic::Create( |
| 1171 device::BluetoothUUID(params_->characteristic.uuid), |
| 1172 device::BluetoothGattCharacteristic::Properties(), |
| 1173 device::BluetoothGattCharacteristic::Permissions(), service); |
| 1174 |
| 1175 // Keep a track of this characteristic so we can look it up later if a |
| 1176 // descriptor lists it as its parent. |
| 1177 event_router_->AddLocalCharacteristic(characteristic->GetIdentifier(), |
| 1178 service->GetIdentifier()); |
| 1179 |
| 1180 Respond(ArgumentList(apibtle::CreateCharacteristic::Results::Create( |
| 1181 characteristic->GetIdentifier()))); |
1137 } | 1182 } |
1138 | 1183 |
1139 template class BLEPeripheralExtensionFunction< | 1184 template class BLEPeripheralExtensionFunction< |
1140 apibtle::CreateDescriptor::Params>; | 1185 apibtle::CreateDescriptor::Params>; |
1141 | 1186 |
1142 void BluetoothLowEnergyCreateDescriptorFunction::DoWork() { | 1187 void BluetoothLowEnergyCreateDescriptorFunction::DoWork() { |
1143 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1188 device::BluetoothLocalGattCharacteristic* characteristic = |
1144 Respond( | 1189 event_router_->GetLocalCharacteristic(params_->characteristic_id); |
1145 ArgumentList(apibtle::CreateDescriptor::Results::Create(std::string()))); | 1190 if (!characteristic) { |
| 1191 Respond(Error(kErrorInvalidCharacteristicId)); |
| 1192 return; |
| 1193 } |
| 1194 |
| 1195 base::WeakPtr<device::BluetoothLocalGattDescriptor> descriptor = |
| 1196 device::BluetoothLocalGattDescriptor::Create( |
| 1197 device::BluetoothUUID(params_->descriptor.uuid), |
| 1198 device::BluetoothGattCharacteristic::Permissions(), characteristic); |
| 1199 |
| 1200 Respond(ArgumentList( |
| 1201 apibtle::CreateDescriptor::Results::Create(descriptor->GetIdentifier()))); |
1146 } | 1202 } |
1147 | 1203 |
1148 template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>; | 1204 template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>; |
1149 | 1205 |
1150 void BluetoothLowEnergyRegisterServiceFunction::DoWork() { | 1206 void BluetoothLowEnergyRegisterServiceFunction::DoWork() { |
1151 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1207 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1152 Respond(ArgumentList(apibtle::RegisterService::Results::Create( | 1208 Respond(ArgumentList(apibtle::RegisterService::Results::Create( |
1153 apibtle::SERVICE_RESULT_SUCCESS))); | 1209 apibtle::SERVICE_RESULT_SUCCESS))); |
1154 } | 1210 } |
1155 | 1211 |
1156 template class BLEPeripheralExtensionFunction< | 1212 template class BLEPeripheralExtensionFunction< |
1157 apibtle::UnregisterService::Params>; | 1213 apibtle::UnregisterService::Params>; |
1158 | 1214 |
1159 void BluetoothLowEnergyUnregisterServiceFunction::DoWork() { | 1215 void BluetoothLowEnergyUnregisterServiceFunction::DoWork() { |
1160 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1216 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1161 Respond(ArgumentList(apibtle::UnregisterService::Results::Create( | 1217 Respond(ArgumentList(apibtle::UnregisterService::Results::Create( |
1162 apibtle::SERVICE_RESULT_SUCCESS))); | 1218 apibtle::SERVICE_RESULT_SUCCESS))); |
1163 } | 1219 } |
1164 | 1220 |
1165 template class BLEPeripheralExtensionFunction< | 1221 template class BLEPeripheralExtensionFunction< |
1166 apibtle::SendRequestResponse::Params>; | 1222 apibtle::SendRequestResponse::Params>; |
1167 | 1223 |
1168 void BluetoothLowEnergySendRequestResponseFunction::DoWork() { | 1224 void BluetoothLowEnergySendRequestResponseFunction::DoWork() { |
1169 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1225 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1170 Respond(NoArguments()); | 1226 Respond(NoArguments()); |
1171 } | 1227 } |
1172 | 1228 |
1173 } // namespace api | 1229 } // namespace api |
1174 } // namespace extensions | 1230 } // namespace extensions |
OLD | NEW |