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 24 matching lines...) Expand all Loading... |
57 const char kErrorNotNotifying[] = "Not notifying"; | 63 const char kErrorNotNotifying[] = "Not notifying"; |
58 const char kErrorOffsetInvalid[] = "Offset invalid"; | 64 const char kErrorOffsetInvalid[] = "Offset invalid"; |
59 const char kErrorOperationFailed[] = "Operation failed"; | 65 const char kErrorOperationFailed[] = "Operation failed"; |
60 const char kErrorPermissionDenied[] = "Permission denied"; | 66 const char kErrorPermissionDenied[] = "Permission denied"; |
61 const char kErrorPlatformNotSupported[] = | 67 const char kErrorPlatformNotSupported[] = |
62 "This operation is not supported on the current platform"; | 68 "This operation is not supported on the current platform"; |
63 const char kErrorRequestNotSupported[] = "Request not supported"; | 69 const char kErrorRequestNotSupported[] = "Request not supported"; |
64 const char kErrorTimeout[] = "Operation timed out"; | 70 const char kErrorTimeout[] = "Operation timed out"; |
65 const char kErrorUnsupportedDevice[] = | 71 const char kErrorUnsupportedDevice[] = |
66 "This device is not supported on the current platform"; | 72 "This device is not supported on the current platform"; |
| 73 const char kErrorInvalidServiceId[] = "The service ID doesn't exist."; |
| 74 const char kErrorInvalidCharacteristicId[] = |
| 75 "The characteristic ID doesn't exist."; |
67 const char kStatusAdvertisementAlreadyExists[] = | 76 const char kStatusAdvertisementAlreadyExists[] = |
68 "An advertisement is already advertising"; | 77 "An advertisement is already advertising"; |
69 const char kStatusAdvertisementDoesNotExist[] = | 78 const char kStatusAdvertisementDoesNotExist[] = |
70 "This advertisement does not exist"; | 79 "This advertisement does not exist"; |
71 | 80 |
72 // Returns the correct error string based on error status |status|. This is used | 81 // Returns the correct error string based on error status |status|. This is used |
73 // to set the value of |chrome.runtime.lastError.message| and should not be | 82 // to set the value of |chrome.runtime.lastError.message| and should not be |
74 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. | 83 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. |
75 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { | 84 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { |
76 switch (status) { | 85 switch (status) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 &DoWorkCallback<bool>, | 227 &DoWorkCallback<bool>, |
219 base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork, | 228 base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork, |
220 this)))) { | 229 this)))) { |
221 SetError(kErrorAdapterNotInitialized); | 230 SetError(kErrorAdapterNotInitialized); |
222 return false; | 231 return false; |
223 } | 232 } |
224 | 233 |
225 return true; | 234 return true; |
226 } | 235 } |
227 | 236 |
228 BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction() {} | 237 BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction() |
| 238 : event_router_(nullptr) {} |
229 | 239 |
230 BluetoothLowEnergyExtensionFunction::~BluetoothLowEnergyExtensionFunction() {} | 240 BluetoothLowEnergyExtensionFunction::~BluetoothLowEnergyExtensionFunction() {} |
231 | 241 |
232 ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() { | 242 ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() { |
233 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 243 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
234 | 244 |
235 if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) | 245 if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) |
236 return RespondNow(Error(kErrorPermissionDenied)); | 246 return RespondNow(Error(kErrorPermissionDenied)); |
237 | 247 |
238 BluetoothLowEnergyEventRouter* event_router = | 248 event_router_ = GetEventRouter(browser_context()); |
239 GetEventRouter(browser_context()); | 249 if (!event_router_->IsBluetoothSupported()) |
240 if (!event_router->IsBluetoothSupported()) | |
241 return RespondNow(Error(kErrorPlatformNotSupported)); | 250 return RespondNow(Error(kErrorPlatformNotSupported)); |
242 | 251 |
243 // It is safe to pass |this| here as ExtensionFunction is refcounted. | 252 // It is safe to pass |this| here as ExtensionFunction is refcounted. |
244 if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind( | 253 if (!event_router_->InitializeAdapterAndInvokeCallback(base::Bind( |
245 &DoWorkCallback<void>, | 254 &DoWorkCallback<void>, |
246 base::Bind(&BluetoothLowEnergyExtensionFunction::DoWork, this)))) { | 255 base::Bind(&BluetoothLowEnergyExtensionFunction::PreDoWork, this)))) { |
247 // DoWork will respond when the adapter gets initialized. | 256 // DoWork will respond when the adapter gets initialized. |
248 return RespondNow(Error(kErrorAdapterNotInitialized)); | 257 return RespondNow(Error(kErrorAdapterNotInitialized)); |
249 } | 258 } |
250 | 259 |
251 return RespondLater(); | 260 return RespondLater(); |
252 } | 261 } |
253 | 262 |
| 263 void BluetoothLowEnergyExtensionFunction::PreDoWork() { |
| 264 // The adapter must be initialized at this point, but return an error instead |
| 265 // of asserting. |
| 266 if (!event_router_->HasAdapter()) { |
| 267 Respond(Error(kErrorAdapterNotInitialized)); |
| 268 return; |
| 269 } |
| 270 DoWork(); |
| 271 } |
| 272 |
254 template <typename Params> | 273 template <typename Params> |
255 BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {} | 274 BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {} |
256 | 275 |
257 template <typename Params> | 276 template <typename Params> |
258 BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {} | 277 BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {} |
259 | 278 |
260 template <typename Params> | 279 template <typename Params> |
261 ExtensionFunction::ResponseAction | 280 ExtensionFunction::ResponseAction |
262 BLEPeripheralExtensionFunction<Params>::Run() { | 281 BLEPeripheralExtensionFunction<Params>::Run() { |
| 282 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 283 |
| 284 // Check permissions in manifest. |
| 285 if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) |
| 286 return RespondNow(Error(kErrorPermissionDenied)); |
| 287 |
263 // Causes link error on Windows. API will never be on Windows, so #ifdefing. | 288 // Causes link error on Windows. API will never be on Windows, so #ifdefing. |
264 #if !defined(OS_WIN) | 289 #if !defined(OS_WIN) |
265 params_ = Params::Create(*args_); | 290 params_ = Params::Create(*args_); |
266 EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL); | 291 EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL); |
267 #endif | 292 #endif |
268 | 293 |
269 return BluetoothLowEnergyExtensionFunction::Run(); | 294 return BluetoothLowEnergyExtensionFunction::Run(); |
270 } | 295 } |
271 | 296 |
272 bool BluetoothLowEnergyConnectFunction::DoWork() { | 297 bool BluetoothLowEnergyConnectFunction::DoWork() { |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 | 1140 |
1116 template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>; | 1141 template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>; |
1117 | 1142 |
1118 void BluetoothLowEnergyCreateServiceFunction::DoWork() { | 1143 void BluetoothLowEnergyCreateServiceFunction::DoWork() { |
1119 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1144 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1120 // Causes link error on Windows. API will never be on Windows, so #ifdefing. | 1145 // Causes link error on Windows. API will never be on Windows, so #ifdefing. |
1121 // TODO: Ideally this should be handled by our feature system, so that this | 1146 // TODO: Ideally this should be handled by our feature system, so that this |
1122 // code doesn't even compile on OSes it isn't being used on, but currently this | 1147 // code doesn't even compile on OSes it isn't being used on, but currently this |
1123 // is not possible. | 1148 // is not possible. |
1124 #if !defined(OS_WIN) | 1149 #if !defined(OS_WIN) |
1125 Respond(ArgumentList(apibtle::CreateService::Results::Create(std::string()))); | 1150 base::WeakPtr<device::BluetoothLocalGattService> service = |
| 1151 device::BluetoothLocalGattService::Create( |
| 1152 event_router_->adapter(), |
| 1153 device::BluetoothUUID(params_->service.uuid), |
| 1154 params_->service.is_primary, nullptr, nullptr); |
| 1155 |
| 1156 Respond(ArgumentList( |
| 1157 apibtle::CreateService::Results::Create(service->GetIdentifier()))); |
1126 #else | 1158 #else |
1127 Respond(Error(kErrorPlatformNotSupported)); | 1159 Respond(Error(kErrorPlatformNotSupported)); |
1128 #endif | 1160 #endif |
1129 } | 1161 } |
1130 | 1162 |
1131 template class BLEPeripheralExtensionFunction< | 1163 template class BLEPeripheralExtensionFunction< |
1132 apibtle::CreateCharacteristic::Params>; | 1164 apibtle::CreateCharacteristic::Params>; |
1133 | 1165 |
1134 void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() { | 1166 void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() { |
1135 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1167 device::BluetoothLocalGattService* service = |
1136 Respond(ArgumentList( | 1168 event_router_->adapter()->GetGattService(params_->service_id); |
1137 apibtle::CreateCharacteristic::Results::Create(std::string()))); | 1169 if (!service) { |
| 1170 Respond(Error(kErrorInvalidServiceId)); |
| 1171 return; |
| 1172 } |
| 1173 |
| 1174 base::WeakPtr<device::BluetoothLocalGattCharacteristic> characteristic = |
| 1175 device::BluetoothLocalGattCharacteristic::Create( |
| 1176 device::BluetoothUUID(params_->characteristic.uuid), |
| 1177 device::BluetoothGattCharacteristic::Properties(), |
| 1178 device::BluetoothGattCharacteristic::Permissions(), service); |
| 1179 |
| 1180 // Keep a track of this characteristic so we can look it up later if a |
| 1181 // descriptor lists it as its parent. |
| 1182 event_router_->AddLocalCharacteristic(characteristic->GetIdentifier(), |
| 1183 service->GetIdentifier()); |
| 1184 |
| 1185 Respond(ArgumentList(apibtle::CreateCharacteristic::Results::Create( |
| 1186 characteristic->GetIdentifier()))); |
1138 } | 1187 } |
1139 | 1188 |
1140 template class BLEPeripheralExtensionFunction< | 1189 template class BLEPeripheralExtensionFunction< |
1141 apibtle::CreateDescriptor::Params>; | 1190 apibtle::CreateDescriptor::Params>; |
1142 | 1191 |
1143 void BluetoothLowEnergyCreateDescriptorFunction::DoWork() { | 1192 void BluetoothLowEnergyCreateDescriptorFunction::DoWork() { |
1144 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1193 device::BluetoothLocalGattCharacteristic* characteristic = |
1145 Respond( | 1194 event_router_->GetLocalCharacteristic(params_->characteristic_id); |
1146 ArgumentList(apibtle::CreateDescriptor::Results::Create(std::string()))); | 1195 if (!characteristic) { |
| 1196 Respond(Error(kErrorInvalidCharacteristicId)); |
| 1197 return; |
| 1198 } |
| 1199 |
| 1200 base::WeakPtr<device::BluetoothLocalGattDescriptor> descriptor = |
| 1201 device::BluetoothLocalGattDescriptor::Create( |
| 1202 device::BluetoothUUID(params_->descriptor.uuid), |
| 1203 device::BluetoothGattCharacteristic::Permissions(), characteristic); |
| 1204 |
| 1205 Respond(ArgumentList( |
| 1206 apibtle::CreateDescriptor::Results::Create(descriptor->GetIdentifier()))); |
1147 } | 1207 } |
1148 | 1208 |
1149 template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>; | 1209 template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>; |
1150 | 1210 |
1151 void BluetoothLowEnergyRegisterServiceFunction::DoWork() { | 1211 void BluetoothLowEnergyRegisterServiceFunction::DoWork() { |
1152 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1212 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1153 Respond(ArgumentList(apibtle::RegisterService::Results::Create( | 1213 Respond(ArgumentList(apibtle::RegisterService::Results::Create( |
1154 apibtle::SERVICE_RESULT_SUCCESS))); | 1214 apibtle::SERVICE_RESULT_SUCCESS))); |
1155 } | 1215 } |
1156 | 1216 |
1157 template class BLEPeripheralExtensionFunction< | 1217 template class BLEPeripheralExtensionFunction< |
1158 apibtle::UnregisterService::Params>; | 1218 apibtle::UnregisterService::Params>; |
1159 | 1219 |
1160 void BluetoothLowEnergyUnregisterServiceFunction::DoWork() { | 1220 void BluetoothLowEnergyUnregisterServiceFunction::DoWork() { |
1161 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1221 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1162 Respond(ArgumentList(apibtle::UnregisterService::Results::Create( | 1222 Respond(ArgumentList(apibtle::UnregisterService::Results::Create( |
1163 apibtle::SERVICE_RESULT_SUCCESS))); | 1223 apibtle::SERVICE_RESULT_SUCCESS))); |
1164 } | 1224 } |
1165 | 1225 |
1166 template class BLEPeripheralExtensionFunction< | 1226 template class BLEPeripheralExtensionFunction< |
1167 apibtle::SendRequestResponse::Params>; | 1227 apibtle::SendRequestResponse::Params>; |
1168 | 1228 |
1169 void BluetoothLowEnergySendRequestResponseFunction::DoWork() { | 1229 void BluetoothLowEnergySendRequestResponseFunction::DoWork() { |
1170 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1230 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1171 Respond(NoArguments()); | 1231 Respond(NoArguments()); |
1172 } | 1232 } |
1173 | 1233 |
1174 } // namespace api | 1234 } // namespace api |
1175 } // namespace extensions | 1235 } // namespace extensions |
OLD | NEW |