Chromium Code Reviews| 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 "content/renderer/bluetooth/web_bluetooth_impl.h" | 5 #include "content/renderer/bluetooth/web_bluetooth_impl.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 const blink::WebString& characteristic_instance_id, | 163 const blink::WebString& characteristic_instance_id, |
| 164 blink::WebBluetoothRemoteGATTCharacteristic* characteristic) { | 164 blink::WebBluetoothRemoteGATTCharacteristic* characteristic) { |
| 165 // TODO(ortuno): After the Bluetooth Tree is implemented, there will | 165 // TODO(ortuno): After the Bluetooth Tree is implemented, there will |
| 166 // only be one object per characteristic. But for now we replace | 166 // only be one object per characteristic. But for now we replace |
| 167 // the previous object. | 167 // the previous object. |
| 168 // https://crbug.com/495270 | 168 // https://crbug.com/495270 |
| 169 active_characteristics_[characteristic_instance_id.utf8()] = characteristic; | 169 active_characteristics_[characteristic_instance_id.utf8()] = characteristic; |
| 170 } | 170 } |
| 171 | 171 |
| 172 void WebBluetoothImpl::RemoteCharacteristicValueChanged( | 172 void WebBluetoothImpl::RemoteCharacteristicValueChanged( |
| 173 const mojo::String& characteristic_instance_id, | 173 const std::string& characteristic_instance_id, |
| 174 mojo::Array<uint8_t> value) { | 174 const std::vector<uint8_t>& value) { |
| 175 // We post a task so that the event is fired after any pending promises have | 175 // We post a task so that the event is fired after any pending promises have |
| 176 // resolved. | 176 // resolved. |
| 177 base::ThreadTaskRunnerHandle::Get()->PostTask( | 177 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 178 FROM_HERE, | 178 FROM_HERE, |
| 179 base::Bind(&WebBluetoothImpl::DispatchCharacteristicValueChanged, | 179 base::Bind(&WebBluetoothImpl::DispatchCharacteristicValueChanged, |
| 180 base::Unretained(this), characteristic_instance_id, | 180 base::Unretained(this), characteristic_instance_id, value)); |
| 181 value.PassStorage())); | |
| 182 } | 181 } |
| 183 | 182 |
| 184 void WebBluetoothImpl::OnRequestDeviceComplete( | 183 void WebBluetoothImpl::OnRequestDeviceComplete( |
| 185 std::unique_ptr<blink::WebBluetoothRequestDeviceCallbacks> callbacks, | 184 std::unique_ptr<blink::WebBluetoothRequestDeviceCallbacks> callbacks, |
| 186 const blink::mojom::WebBluetoothResult result, | 185 const blink::mojom::WebBluetoothResult result, |
| 187 blink::mojom::WebBluetoothDevicePtr device) { | 186 blink::mojom::WebBluetoothDevicePtr device) { |
| 188 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { | 187 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { |
| 189 callbacks->onSuccess(base::MakeUnique<blink::WebBluetoothDeviceInit>( | 188 callbacks->onSuccess(base::MakeUnique<blink::WebBluetoothDeviceInit>( |
| 190 blink::WebString::fromUTF8(device->id.str()), | 189 blink::WebString::fromUTF8(device->id.str()), |
| 191 device->name.is_null() ? blink::WebString() | 190 device->name ? blink::WebString::fromUTF8(device->name.value().c_str()) |
| 192 : blink::WebString::fromUTF8(device->name))); | 191 : blink::WebString())); |
| 193 } else { | 192 } else { |
| 194 callbacks->onError(ToInt32(result)); | 193 callbacks->onError(ToInt32(result)); |
| 195 } | 194 } |
| 196 } | 195 } |
| 197 | 196 |
| 198 void WebBluetoothImpl::GattServerDisconnected( | 197 void WebBluetoothImpl::GattServerDisconnected( |
| 199 const WebBluetoothDeviceId& device_id) { | 198 const WebBluetoothDeviceId& device_id) { |
| 200 auto device_iter = connected_devices_.find(device_id); | 199 auto device_iter = connected_devices_.find(device_id); |
| 201 if (device_iter != connected_devices_.end()) { | 200 if (device_iter != connected_devices_.end()) { |
| 202 // Remove device from the map before calling dispatchGattServerDisconnected | 201 // Remove device from the map before calling dispatchGattServerDisconnected |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 216 callbacks->onSuccess(); | 215 callbacks->onSuccess(); |
| 217 } else { | 216 } else { |
| 218 callbacks->onError(ToInt32(result)); | 217 callbacks->onError(ToInt32(result)); |
| 219 } | 218 } |
| 220 } | 219 } |
| 221 | 220 |
| 222 void WebBluetoothImpl::OnGetPrimaryServicesComplete( | 221 void WebBluetoothImpl::OnGetPrimaryServicesComplete( |
| 223 const blink::WebString& device_id, | 222 const blink::WebString& device_id, |
| 224 std::unique_ptr<blink::WebBluetoothGetPrimaryServicesCallbacks> callbacks, | 223 std::unique_ptr<blink::WebBluetoothGetPrimaryServicesCallbacks> callbacks, |
| 225 blink::mojom::WebBluetoothResult result, | 224 blink::mojom::WebBluetoothResult result, |
| 226 mojo::Array<blink::mojom::WebBluetoothRemoteGATTServicePtr> services) { | 225 base::Optional<std::vector<blink::mojom::WebBluetoothRemoteGATTServicePtr>> |
| 226 services) { | |
| 227 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { | 227 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { |
| 228 // TODO(dcheng): This WebVector should use smart pointers. | 228 // TODO(dcheng): This WebVector should use smart pointers. |
| 229 blink::WebVector<blink::WebBluetoothRemoteGATTService*> promise_services( | 229 blink::WebVector<blink::WebBluetoothRemoteGATTService*> promise_services; |
| 230 services.size()); | 230 if (services) { |
|
ortuno
2016/11/21 04:42:31
Just DCHECK. If result == SUCCESS then we are guar
juncai
2016/11/21 21:27:05
Done.
| |
| 231 | 231 blink::WebVector<blink::WebBluetoothRemoteGATTService*> tmp( |
| 232 for (size_t i = 0; i < services.size(); i++) { | 232 services->size()); |
| 233 promise_services[i] = new blink::WebBluetoothRemoteGATTService( | 233 promise_services.swap(tmp); |
| 234 blink::WebString::fromUTF8(services[i]->instance_id), | 234 for (size_t i = 0; i < services->size(); i++) { |
| 235 blink::WebString::fromUTF8(services[i]->uuid), true /* isPrimary */, | 235 promise_services[i] = new blink::WebBluetoothRemoteGATTService( |
| 236 device_id); | 236 blink::WebString::fromUTF8(services.value()[i]->instance_id), |
| 237 blink::WebString::fromUTF8(services.value()[i]->uuid), | |
| 238 true /* isPrimary */, device_id); | |
| 239 } | |
| 237 } | 240 } |
| 238 callbacks->onSuccess(promise_services); | 241 callbacks->onSuccess(promise_services); |
| 239 } else { | 242 } else { |
| 240 callbacks->onError(ToInt32(result)); | 243 callbacks->onError(ToInt32(result)); |
| 241 } | 244 } |
| 242 } | 245 } |
| 243 | 246 |
| 244 void WebBluetoothImpl::OnGetCharacteristicsComplete( | 247 void WebBluetoothImpl::OnGetCharacteristicsComplete( |
| 245 const blink::WebString& service_instance_id, | 248 const blink::WebString& service_instance_id, |
| 246 std::unique_ptr<blink::WebBluetoothGetCharacteristicsCallbacks> callbacks, | 249 std::unique_ptr<blink::WebBluetoothGetCharacteristicsCallbacks> callbacks, |
| 247 blink::mojom::WebBluetoothResult result, | 250 blink::mojom::WebBluetoothResult result, |
| 248 mojo::Array<blink::mojom::WebBluetoothRemoteGATTCharacteristicPtr> | 251 base::Optional< |
| 252 std::vector<blink::mojom::WebBluetoothRemoteGATTCharacteristicPtr>> | |
| 249 characteristics) { | 253 characteristics) { |
| 250 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { | 254 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { |
| 251 // TODO(dcheng): This WebVector should use smart pointers. | 255 // TODO(dcheng): This WebVector should use smart pointers. |
| 252 blink::WebVector<blink::WebBluetoothRemoteGATTCharacteristicInit*> | 256 blink::WebVector<blink::WebBluetoothRemoteGATTCharacteristicInit*> |
| 253 promise_characteristics(characteristics.size()); | 257 promise_characteristics; |
| 254 | 258 if (characteristics) { |
|
ortuno
2016/11/21 04:42:31
Same here. Just DCHECK.
juncai
2016/11/21 21:27:05
Done.
| |
| 255 for (size_t i = 0; i < characteristics.size(); i++) { | 259 blink::WebVector<blink::WebBluetoothRemoteGATTCharacteristicInit*> tmp( |
| 256 promise_characteristics[i] = | 260 characteristics->size()); |
| 257 new blink::WebBluetoothRemoteGATTCharacteristicInit( | 261 promise_characteristics.swap(tmp); |
| 258 service_instance_id, | 262 for (size_t i = 0; i < characteristics->size(); i++) { |
| 259 blink::WebString::fromUTF8(characteristics[i]->instance_id), | 263 promise_characteristics[i] = |
| 260 blink::WebString::fromUTF8(characteristics[i]->uuid), | 264 new blink::WebBluetoothRemoteGATTCharacteristicInit( |
| 261 characteristics[i]->properties); | 265 service_instance_id, |
| 266 blink::WebString::fromUTF8( | |
| 267 characteristics.value()[i]->instance_id), | |
| 268 blink::WebString::fromUTF8(characteristics.value()[i]->uuid), | |
| 269 characteristics.value()[i]->properties); | |
| 270 } | |
| 262 } | 271 } |
| 263 callbacks->onSuccess(promise_characteristics); | 272 callbacks->onSuccess(promise_characteristics); |
| 264 } else { | 273 } else { |
| 265 callbacks->onError(ToInt32(result)); | 274 callbacks->onError(ToInt32(result)); |
| 266 } | 275 } |
| 267 } | 276 } |
| 268 | 277 |
| 269 void WebBluetoothImpl::OnReadValueComplete( | 278 void WebBluetoothImpl::OnReadValueComplete( |
| 270 std::unique_ptr<blink::WebBluetoothReadValueCallbacks> callbacks, | 279 std::unique_ptr<blink::WebBluetoothReadValueCallbacks> callbacks, |
| 271 blink::mojom::WebBluetoothResult result, | 280 blink::mojom::WebBluetoothResult result, |
| 272 mojo::Array<uint8_t> value) { | 281 const base::Optional<std::vector<uint8_t>>& value) { |
| 273 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { | 282 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { |
| 274 callbacks->onSuccess(value.PassStorage()); | 283 callbacks->onSuccess(value ? value.value() : std::vector<uint8_t>()); |
|
ortuno
2016/11/21 04:42:31
And here as well. Just DCHECK. Also does it make s
juncai
2016/11/21 21:27:05
Done.
| |
| 275 } else { | 284 } else { |
| 276 callbacks->onError(ToInt32(result)); | 285 callbacks->onError(ToInt32(result)); |
| 277 } | 286 } |
| 278 } | 287 } |
| 279 | 288 |
| 280 void WebBluetoothImpl::OnWriteValueComplete( | 289 void WebBluetoothImpl::OnWriteValueComplete( |
| 281 const blink::WebVector<uint8_t>& value, | 290 const blink::WebVector<uint8_t>& value, |
| 282 std::unique_ptr<blink::WebBluetoothWriteValueCallbacks> callbacks, | 291 std::unique_ptr<blink::WebBluetoothWriteValueCallbacks> callbacks, |
| 283 blink::mojom::WebBluetoothResult result) { | 292 blink::mojom::WebBluetoothResult result) { |
| 284 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { | 293 if (result == blink::mojom::WebBluetoothResult::SUCCESS) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 // Create an associated interface ptr and pass it to the WebBluetoothService | 327 // Create an associated interface ptr and pass it to the WebBluetoothService |
| 319 // so that it can send us events without us prompting. | 328 // so that it can send us events without us prompting. |
| 320 blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo ptr_info; | 329 blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo ptr_info; |
| 321 binding_.Bind(&ptr_info, web_bluetooth_service_.associated_group()); | 330 binding_.Bind(&ptr_info, web_bluetooth_service_.associated_group()); |
| 322 web_bluetooth_service_->SetClient(std::move(ptr_info)); | 331 web_bluetooth_service_->SetClient(std::move(ptr_info)); |
| 323 } | 332 } |
| 324 return *web_bluetooth_service_; | 333 return *web_bluetooth_service_; |
| 325 } | 334 } |
| 326 | 335 |
| 327 } // namespace content | 336 } // namespace content |
| OLD | NEW |