| Index: content/renderer/usb/web_usb_device_impl.cc
|
| diff --git a/content/renderer/usb/web_usb_device_impl.cc b/content/renderer/usb/web_usb_device_impl.cc
|
| index 6c7683873d9d906a566e71255277fa4e8717a49c..e6e4d08a7a5664146409b50644081381e5db60ec 100644
|
| --- a/content/renderer/usb/web_usb_device_impl.cc
|
| +++ b/content/renderer/usb/web_usb_device_impl.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "content/child/mojo/type_converters.h"
|
| #include "content/child/scoped_web_callbacks.h"
|
| #include "content/renderer/usb/type_converters.h"
|
| #include "device/devices_app/public/cpp/constants.h"
|
| @@ -113,44 +114,105 @@ void HandlePassFailDeviceOperation(
|
| }
|
|
|
| void OnTransferIn(
|
| - ScopedWebCallbacks<blink::WebUSBDeviceControlTransferCallbacks> callbacks,
|
| + ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks,
|
| device::usb::TransferStatus status,
|
| mojo::Array<uint8_t> data) {
|
| auto scoped_callbacks = callbacks.PassCallbacks();
|
| - if (status != device::usb::TransferStatus::COMPLETED) {
|
| - RejectWithTransferError(std::move(scoped_callbacks));
|
| - return;
|
| + blink::WebUSBTransferInfo::Status web_status;
|
| + switch (status) {
|
| + case device::usb::TransferStatus::COMPLETED:
|
| + web_status = blink::WebUSBTransferInfo::Status::Ok;
|
| + break;
|
| + case device::usb::TransferStatus::STALLED:
|
| + web_status = blink::WebUSBTransferInfo::Status::Stall;
|
| + break;
|
| + case device::usb::TransferStatus::BABBLE:
|
| + web_status = blink::WebUSBTransferInfo::Status::Babble;
|
| + break;
|
| + default:
|
| + RejectWithTransferError(std::move(scoped_callbacks));
|
| + return;
|
| }
|
| scoped_ptr<blink::WebUSBTransferInfo> info(new blink::WebUSBTransferInfo());
|
| - info->status = blink::WebUSBTransferInfo::Status::Ok;
|
| + info->status.assign(
|
| + std::vector<blink::WebUSBTransferInfo::Status>(1, web_status));
|
| info->data.assign(data);
|
| scoped_callbacks->onSuccess(adoptWebPtr(info.release()));
|
| }
|
|
|
| void OnTransferOut(
|
| - ScopedWebCallbacks<blink::WebUSBDeviceControlTransferCallbacks> callbacks,
|
| + ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks,
|
| size_t bytes_written,
|
| device::usb::TransferStatus status) {
|
| auto scoped_callbacks = callbacks.PassCallbacks();
|
| - scoped_ptr<blink::WebUSBTransferInfo> info(new blink::WebUSBTransferInfo());
|
| + blink::WebUSBTransferInfo::Status web_status;
|
| switch (status) {
|
| case device::usb::TransferStatus::COMPLETED:
|
| - info->status = blink::WebUSBTransferInfo::Status::Ok;
|
| + web_status = blink::WebUSBTransferInfo::Status::Ok;
|
| break;
|
| case device::usb::TransferStatus::STALLED:
|
| - info->status = blink::WebUSBTransferInfo::Status::Stall;
|
| - break;
|
| - case device::usb::TransferStatus::BABBLE:
|
| - info->status = blink::WebUSBTransferInfo::Status::Babble;
|
| + web_status = blink::WebUSBTransferInfo::Status::Stall;
|
| break;
|
| default:
|
| RejectWithTransferError(std::move(scoped_callbacks));
|
| return;
|
| }
|
| -
|
| // TODO(rockot): Device::ControlTransferOut should expose the number of bytes
|
| // actually transferred so we can send it from here.
|
| - info->bytesWritten = bytes_written;
|
| + scoped_ptr<blink::WebUSBTransferInfo> info(new blink::WebUSBTransferInfo());
|
| + info->status.assign(
|
| + std::vector<blink::WebUSBTransferInfo::Status>(1, web_status));
|
| + info->bytesTransferred.assign(std::vector<uint32_t>(1, bytes_written));
|
| + scoped_callbacks->onSuccess(adoptWebPtr(info.release()));
|
| +}
|
| +
|
| +void OnIsochronousTransferIn(
|
| + ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks,
|
| + mojo::Array<uint8_t> data,
|
| + mojo::Array<device::usb::IsochronousPacketPtr> packets) {
|
| + auto scoped_callbacks = callbacks.PassCallbacks();
|
| + scoped_ptr<blink::WebUSBTransferInfo> info(new blink::WebUSBTransferInfo());
|
| + info->data.assign(data);
|
| + for (size_t i = 0; i < packets.size(); ++i) {
|
| + switch (packets[i]->status) {
|
| + case device::usb::TransferStatus::COMPLETED:
|
| + info->status[i] = blink::WebUSBTransferInfo::Status::Ok;
|
| + break;
|
| + case device::usb::TransferStatus::STALLED:
|
| + info->status[i] = blink::WebUSBTransferInfo::Status::Stall;
|
| + break;
|
| + case device::usb::TransferStatus::BABBLE:
|
| + info->status[i] = blink::WebUSBTransferInfo::Status::Babble;
|
| + break;
|
| + default:
|
| + RejectWithTransferError(std::move(scoped_callbacks));
|
| + return;
|
| + }
|
| + info->packetLength[i] = packets[i]->length;
|
| + info->bytesTransferred[i] = packets[i]->transferred_length;
|
| + }
|
| + scoped_callbacks->onSuccess(adoptWebPtr(info.release()));
|
| +}
|
| +
|
| +void OnIsochronousTransferOut(
|
| + ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks,
|
| + mojo::Array<device::usb::IsochronousPacketPtr> packets) {
|
| + auto scoped_callbacks = callbacks.PassCallbacks();
|
| + scoped_ptr<blink::WebUSBTransferInfo> info(new blink::WebUSBTransferInfo());
|
| + for (size_t i = 0; i < packets.size(); ++i) {
|
| + switch (packets[i]->status) {
|
| + case device::usb::TransferStatus::COMPLETED:
|
| + info->status[i] = blink::WebUSBTransferInfo::Status::Ok;
|
| + break;
|
| + case device::usb::TransferStatus::STALLED:
|
| + info->status[i] = blink::WebUSBTransferInfo::Status::Stall;
|
| + break;
|
| + default:
|
| + RejectWithTransferError(std::move(scoped_callbacks));
|
| + return;
|
| + }
|
| + info->bytesTransferred[i] = packets[i]->transferred_length;
|
| + }
|
| scoped_callbacks->onSuccess(adoptWebPtr(info.release()));
|
| }
|
|
|
| @@ -241,7 +303,7 @@ void WebUSBDeviceImpl::controlTransfer(
|
| uint8_t* data,
|
| size_t data_size,
|
| unsigned int timeout,
|
| - blink::WebUSBDeviceControlTransferCallbacks* callbacks) {
|
| + blink::WebUSBDeviceTransferCallbacks* callbacks) {
|
| auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks);
|
| device::usb::ControlTransferParamsPtr params =
|
| device::usb::ControlTransferParams::From(parameters);
|
| @@ -274,7 +336,7 @@ void WebUSBDeviceImpl::transfer(
|
| uint8_t* data,
|
| size_t data_size,
|
| unsigned int timeout,
|
| - blink::WebUSBDeviceBulkTransferCallbacks* callbacks) {
|
| + blink::WebUSBDeviceTransferCallbacks* callbacks) {
|
| auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks);
|
| switch (direction) {
|
| case WebUSBDevice::TransferDirection::In:
|
| @@ -299,6 +361,40 @@ void WebUSBDeviceImpl::transfer(
|
| }
|
| }
|
|
|
| +void WebUSBDeviceImpl::isochronousTransfer(
|
| + blink::WebUSBDevice::TransferDirection direction,
|
| + uint8_t endpoint_number,
|
| + uint8_t* data,
|
| + size_t data_size,
|
| + blink::WebVector<uint32_t> packet_lengths,
|
| + unsigned int timeout,
|
| + blink::WebUSBDeviceTransferCallbacks* callbacks) {
|
| + auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks);
|
| + switch (direction) {
|
| + case WebUSBDevice::TransferDirection::In:
|
| + device_->IsochronousTransferIn(
|
| + endpoint_number, mojo::Array<uint32_t>::From(packet_lengths), timeout,
|
| + base::Bind(&OnIsochronousTransferIn,
|
| + base::Passed(&scoped_callbacks)));
|
| + break;
|
| + case WebUSBDevice::TransferDirection::Out: {
|
| + std::vector<uint8_t> bytes;
|
| + if (data)
|
| + bytes.assign(data, data + data_size);
|
| + mojo::Array<uint8_t> mojo_bytes;
|
| + mojo_bytes.Swap(&bytes);
|
| + device_->IsochronousTransferOut(
|
| + endpoint_number, std::move(mojo_bytes),
|
| + mojo::Array<uint32_t>::From(packet_lengths), timeout,
|
| + base::Bind(&OnIsochronousTransferOut,
|
| + base::Passed(&scoped_callbacks)));
|
| + break;
|
| + }
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| void WebUSBDeviceImpl::reset(blink::WebUSBDeviceResetCallbacks* callbacks) {
|
| auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks);
|
| device_->Reset(base::Bind(&HandlePassFailDeviceOperation,
|
|
|