diff options
author | gdk@chromium.org <gdk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-25 18:16:33 +0000 |
---|---|---|
committer | gdk@chromium.org <gdk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-25 18:16:33 +0000 |
commit | 1a2e71bed8096f59f1a6319a48b1155addc75cd1 (patch) | |
tree | ea86e0f7dc50838e2ca85ef7c3162da793cd9530 /chrome/browser/usb | |
parent | ce576fe29effdf478823cfca4856b4b6e6fcf784 (diff) | |
download | chromium_src-1a2e71bed8096f59f1a6319a48b1155addc75cd1.zip chromium_src-1a2e71bed8096f59f1a6319a48b1155addc75cd1.tar.gz chromium_src-1a2e71bed8096f59f1a6319a48b1155addc75cd1.tar.bz2 |
Changing USB API buffer ownership.
This change changes the ownership of the buffer used in the final
transfer callback to the UsbDevice itself instead of having the USB API
keep a reference to its own buffer.
BUG=151987
TEST=manual
Review URL: https://chromiumcodereview.appspot.com/10972018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@158608 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/usb')
-rw-r--r-- | chrome/browser/usb/usb_device.cc | 36 | ||||
-rw-r--r-- | chrome/browser/usb/usb_device.h | 10 |
2 files changed, 34 insertions, 12 deletions
diff --git a/chrome/browser/usb/usb_device.cc b/chrome/browser/usb/usb_device.cc index c06d01f..d288aea 100644 --- a/chrome/browser/usb/usb_device.cc +++ b/chrome/browser/usb/usb_device.cc @@ -115,10 +115,22 @@ void UsbDevice::TransferComplete(PlatformUsbTransferHandle handle) { // TODO(gdk): Handle device disconnect. DCHECK(ContainsKey(transfers_, handle)) << "Missing transfer completed"; Transfer* const transfer = &transfers_[handle]; - if (transfer->buffer.get()) { - transfer->callback.Run(ConvertTransferStatus(handle->status)); + + // If the transfer is a control transfer we do not expose the control transfer + // setup header to the caller, this logic strips off the header from the + // buffer before invoking the callback provided with the transfer with it. + scoped_refptr<net::IOBuffer> buffer = transfer->buffer; + if (transfer->control_transfer) { + scoped_refptr<net::IOBuffer> resized_buffer = new net::IOBuffer( + handle->actual_length - LIBUSB_CONTROL_SETUP_SIZE); + memcpy(resized_buffer->data(), buffer->data() + LIBUSB_CONTROL_SETUP_SIZE, + handle->actual_length - LIBUSB_CONTROL_SETUP_SIZE); + buffer = resized_buffer; } + transfer->callback.Run(ConvertTransferStatus(handle->status), buffer, + handle->actual_length); + transfers_.erase(handle); libusb_free_transfer(handle); } @@ -130,8 +142,9 @@ void UsbDevice::ControlTransfer(const TransferDirection direction, const UsbTransferCallback& callback) { CheckDevice(); + const size_t resized_length = LIBUSB_CONTROL_SETUP_SIZE + length; scoped_refptr<net::IOBuffer> resized_buffer(new net::IOBufferWithSize( - LIBUSB_CONTROL_SETUP_SIZE + length)); + resized_length)); memcpy(resized_buffer->data() + LIBUSB_CONTROL_SETUP_SIZE, buffer->data(), length); @@ -143,7 +156,7 @@ void UsbDevice::ControlTransfer(const TransferDirection direction, libusb_fill_control_transfer(transfer, handle_, reinterpret_cast<uint8*>( resized_buffer->data()), reinterpret_cast<libusb_transfer_cb_fn>( &HandleTransferCompletion), this, timeout); - SubmitTransfer(transfer, resized_buffer, callback); + SubmitTransfer(transfer, true, resized_buffer, resized_length, callback); } void UsbDevice::BulkTransfer(const TransferDirection direction, @@ -157,7 +170,7 @@ void UsbDevice::BulkTransfer(const TransferDirection direction, reinterpret_cast<uint8*>(buffer->data()), length, reinterpret_cast<libusb_transfer_cb_fn>(&HandleTransferCompletion), this, timeout); - SubmitTransfer(transfer, buffer, callback); + SubmitTransfer(transfer, false, buffer, length, callback); } void UsbDevice::InterruptTransfer(const TransferDirection direction, @@ -171,7 +184,7 @@ void UsbDevice::InterruptTransfer(const TransferDirection direction, reinterpret_cast<uint8*>(buffer->data()), length, reinterpret_cast<libusb_transfer_cb_fn>(&HandleTransferCompletion), this, timeout); - SubmitTransfer(transfer, buffer, callback); + SubmitTransfer(transfer, false, buffer, length, callback); } void UsbDevice::IsochronousTransfer(const TransferDirection direction, @@ -182,7 +195,7 @@ void UsbDevice::IsochronousTransfer(const TransferDirection direction, const uint64 total_length = packets * packet_length; if (total_length > length) { - callback.Run(USB_TRANSFER_LENGTH_SHORT); + callback.Run(USB_TRANSFER_LENGTH_SHORT, NULL, 0); return; } @@ -194,7 +207,7 @@ void UsbDevice::IsochronousTransfer(const TransferDirection direction, timeout); libusb_set_iso_packet_lengths(transfer, packet_length); - SubmitTransfer(transfer, buffer, callback); + SubmitTransfer(transfer, false, buffer, length, callback); } void UsbDevice::CheckDevice() { @@ -202,16 +215,19 @@ void UsbDevice::CheckDevice() { } void UsbDevice::SubmitTransfer(PlatformUsbTransferHandle handle, + bool control_transfer, net::IOBuffer* buffer, + const size_t length, const UsbTransferCallback& callback) { - libusb_submit_transfer(handle); - Transfer transfer; + transfer.control_transfer = control_transfer; transfer.buffer = buffer; + transfer.length = length; transfer.callback = callback; { base::AutoLock lock(lock_); transfers_[handle] = transfer; + libusb_submit_transfer(handle); } } diff --git a/chrome/browser/usb/usb_device.h b/chrome/browser/usb/usb_device.h index 2ed5087..cc58134 100644 --- a/chrome/browser/usb/usb_device.h +++ b/chrome/browser/usb/usb_device.h @@ -37,7 +37,8 @@ enum UsbTransferStatus { USB_TRANSFER_LENGTH_SHORT, }; -typedef base::Callback<void(UsbTransferStatus)> UsbTransferCallback; +typedef base::Callback<void(UsbTransferStatus, scoped_refptr<net::IOBuffer>, + size_t)> UsbTransferCallback; // A UsbDevice wraps the platform's underlying representation of what a USB // device actually is, and provides accessors for performing many of the @@ -110,7 +111,9 @@ class UsbDevice : public base::RefCounted<UsbDevice> { Transfer(); ~Transfer(); + bool control_transfer; scoped_refptr<net::IOBuffer> buffer; + size_t length; UsbTransferCallback callback; }; @@ -120,7 +123,10 @@ class UsbDevice : public base::RefCounted<UsbDevice> { // Submits a transfer and starts tracking it. Retains the buffer and copies // the completion callback until the transfer finishes, whereupon it invokes // the callback then releases the buffer. - void SubmitTransfer(PlatformUsbTransferHandle handle, net::IOBuffer* buffer, + void SubmitTransfer(PlatformUsbTransferHandle handle, + bool control_transfer, + net::IOBuffer* buffer, + const size_t length, const UsbTransferCallback& callback); // The UsbService isn't referenced here to prevent a dependency cycle between |