summaryrefslogtreecommitdiffstats
path: root/chrome/browser/usb
diff options
context:
space:
mode:
authorgdk@chromium.org <gdk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-25 18:16:33 +0000
committergdk@chromium.org <gdk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-25 18:16:33 +0000
commit1a2e71bed8096f59f1a6319a48b1155addc75cd1 (patch)
treeea86e0f7dc50838e2ca85ef7c3162da793cd9530 /chrome/browser/usb
parentce576fe29effdf478823cfca4856b4b6e6fcf784 (diff)
downloadchromium_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.cc36
-rw-r--r--chrome/browser/usb/usb_device.h10
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