Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(750)

Unified Diff: device/usb/usb_device_handle_impl.cc

Issue 601073002: Move string descriptor getters from UsbDeviceHandle to UsbDevice. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix function order. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | device/usb/usb_device_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/usb/usb_device_handle_impl.cc
diff --git a/device/usb/usb_device_handle_impl.cc b/device/usb/usb_device_handle_impl.cc
index 2d8c69018474261eb4440ec55f6b7cfbd2a6c601..50c26092fae1019e9a60d70f5022e9a3b7272357 100644
--- a/device/usb/usb_device_handle_impl.cc
+++ b/device/usb/usb_device_handle_impl.cc
@@ -211,96 +211,6 @@ void UsbDeviceHandleImpl::Close() {
device_->Close(this);
}
-/* static */
-void LIBUSB_CALL UsbDeviceHandleImpl::PlatformTransferCallback(
- PlatformUsbTransferHandle transfer) {
- UsbDeviceHandleImpl* device_handle =
- reinterpret_cast<UsbDeviceHandleImpl*>(transfer->user_data);
- device_handle->task_runner_->PostTask(
- FROM_HERE,
- base::Bind(
- &UsbDeviceHandleImpl::CompleteTransfer, device_handle, transfer));
-}
-
-void UsbDeviceHandleImpl::CompleteTransfer(PlatformUsbTransferHandle handle) {
- DCHECK(ContainsKey(transfers_, handle)) << "Missing transfer completed";
-
- Transfer transfer = transfers_[handle];
- transfers_.erase(handle);
-
- DCHECK_GE(handle->actual_length, 0) << "Negative actual length received";
- size_t actual_length =
- static_cast<size_t>(std::max(handle->actual_length, 0));
-
- DCHECK(transfer.length >= actual_length)
- << "data too big for our buffer (libusb failure?)";
-
- switch (transfer.transfer_type) {
- case USB_TRANSFER_CONTROL:
- // If the transfer is a control transfer we do not expose the control
- // setup header to the caller. This logic strips off the header if
- // present before invoking the callback provided with the transfer.
- if (actual_length > 0) {
- CHECK(transfer.length >= LIBUSB_CONTROL_SETUP_SIZE)
- << "buffer was not correctly set: too small for the control header";
-
- if (transfer.length >= (LIBUSB_CONTROL_SETUP_SIZE + actual_length)) {
- // If the payload is zero bytes long, pad out the allocated buffer
- // size to one byte so that an IOBuffer of that size can be allocated.
- scoped_refptr<net::IOBuffer> resized_buffer =
- new net::IOBuffer(static_cast<int>(
- std::max(actual_length, static_cast<size_t>(1))));
- memcpy(resized_buffer->data(),
- transfer.buffer->data() + LIBUSB_CONTROL_SETUP_SIZE,
- actual_length);
- transfer.buffer = resized_buffer;
- }
- }
- break;
-
- case USB_TRANSFER_ISOCHRONOUS:
- // Isochronous replies might carry data in the different isoc packets even
- // if the transfer actual_data value is zero. Furthermore, not all of the
- // received packets might contain data, so we need to calculate how many
- // data bytes we are effectively providing and pack the results.
- if (actual_length == 0) {
- size_t packet_buffer_start = 0;
- for (int i = 0; i < handle->num_iso_packets; ++i) {
- PlatformUsbIsoPacketDescriptor packet = &handle->iso_packet_desc[i];
- if (packet->actual_length > 0) {
- // We don't need to copy as long as all packets until now provide
- // all the data the packet can hold.
- if (actual_length < packet_buffer_start) {
- CHECK(packet_buffer_start + packet->actual_length <=
- transfer.length);
- memmove(transfer.buffer->data() + actual_length,
- transfer.buffer->data() + packet_buffer_start,
- packet->actual_length);
- }
- actual_length += packet->actual_length;
- }
-
- packet_buffer_start += packet->length;
- }
- }
- break;
-
- case USB_TRANSFER_BULK:
- case USB_TRANSFER_INTERRUPT:
- break;
-
- default:
- NOTREACHED() << "Invalid usb transfer type";
- break;
- }
-
- transfer.Complete(ConvertTransferStatus(handle->status), actual_length);
- libusb_free_transfer(handle);
-
- // Must release interface first before actually delete this.
- transfer.claimed_interface = NULL;
-}
-
bool UsbDeviceHandleImpl::ClaimInterface(const int interface_number) {
DCHECK(thread_checker_.CalledOnValidThread());
if (!device_)
@@ -375,40 +285,6 @@ bool UsbDeviceHandleImpl::ResetDevice() {
return rv == LIBUSB_SUCCESS;
}
-bool UsbDeviceHandleImpl::GetSupportedLanguages() {
- if (!languages_.empty()) {
- return true;
- }
-
- // The 1-byte length field limits the descriptor to 256-bytes (128 uint16s).
- uint16 languages[128];
- int size = libusb_get_string_descriptor(
- handle_,
- 0,
- 0,
- reinterpret_cast<unsigned char*>(&languages[0]),
- sizeof(languages));
- if (size < 0) {
- VLOG(1) << "Failed to get list of supported languages: "
- << ConvertPlatformUsbErrorToString(size);
- return false;
- } else if (size < 2) {
- VLOG(1) << "String descriptor zero has no header.";
- return false;
- // The first 2 bytes of the descriptor are the total length and type tag.
- } else if ((languages[0] & 0xff) != size) {
- VLOG(1) << "String descriptor zero size mismatch: " << (languages[0] & 0xff)
- << " != " << size;
- return false;
- } else if ((languages[0] >> 8) != LIBUSB_DT_STRING) {
- VLOG(1) << "String descriptor zero is not a string descriptor.";
- return false;
- }
-
- languages_.assign(languages[1], languages[(size - 2) / 2]);
- return true;
-}
-
bool UsbDeviceHandleImpl::GetStringDescriptor(uint8 string_id,
base::string16* string) {
if (!GetSupportedLanguages()) {
@@ -459,66 +335,6 @@ bool UsbDeviceHandleImpl::GetStringDescriptor(uint8 string_id,
return false;
}
-bool UsbDeviceHandleImpl::GetManufacturer(base::string16* manufacturer) {
- DCHECK(thread_checker_.CalledOnValidThread());
- PlatformUsbDevice device = libusb_get_device(handle_);
- libusb_device_descriptor desc;
-
- // This is a non-blocking call as libusb has the descriptor in memory.
- const int rv = libusb_get_device_descriptor(device, &desc);
- if (rv != LIBUSB_SUCCESS) {
- VLOG(1) << "Failed to read device descriptor: "
- << ConvertPlatformUsbErrorToString(rv);
- return false;
- }
-
- if (desc.iManufacturer == 0) {
- return false;
- }
-
- return GetStringDescriptor(desc.iManufacturer, manufacturer);
-}
-
-bool UsbDeviceHandleImpl::GetProduct(base::string16* product) {
- DCHECK(thread_checker_.CalledOnValidThread());
- PlatformUsbDevice device = libusb_get_device(handle_);
- libusb_device_descriptor desc;
-
- // This is a non-blocking call as libusb has the descriptor in memory.
- const int rv = libusb_get_device_descriptor(device, &desc);
- if (rv != LIBUSB_SUCCESS) {
- VLOG(1) << "Failed to read device descriptor: "
- << ConvertPlatformUsbErrorToString(rv);
- return false;
- }
-
- if (desc.iProduct == 0) {
- return false;
- }
-
- return GetStringDescriptor(desc.iProduct, product);
-}
-
-bool UsbDeviceHandleImpl::GetSerial(base::string16* serial) {
- DCHECK(thread_checker_.CalledOnValidThread());
- PlatformUsbDevice device = libusb_get_device(handle_);
- libusb_device_descriptor desc;
-
- // This is a non-blocking call as libusb has the descriptor in memory.
- const int rv = libusb_get_device_descriptor(device, &desc);
- if (rv != LIBUSB_SUCCESS) {
- VLOG(1) << "Failed to read device descriptor: "
- << ConvertPlatformUsbErrorToString(rv);
- return false;
- }
-
- if (desc.iSerialNumber == 0) {
- return false;
- }
-
- return GetStringDescriptor(desc.iSerialNumber, serial);
-}
-
void UsbDeviceHandleImpl::ControlTransfer(
const UsbEndpointDirection direction,
const TransferRequestType request_type,
@@ -749,6 +565,130 @@ void UsbDeviceHandleImpl::SubmitTransfer(
}
}
+/* static */
+void LIBUSB_CALL UsbDeviceHandleImpl::PlatformTransferCallback(
+ PlatformUsbTransferHandle transfer) {
+ UsbDeviceHandleImpl* device_handle =
+ reinterpret_cast<UsbDeviceHandleImpl*>(transfer->user_data);
+ device_handle->task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &UsbDeviceHandleImpl::CompleteTransfer, device_handle, transfer));
+}
+
+void UsbDeviceHandleImpl::CompleteTransfer(PlatformUsbTransferHandle handle) {
+ DCHECK(ContainsKey(transfers_, handle)) << "Missing transfer completed";
+
+ Transfer transfer = transfers_[handle];
+ transfers_.erase(handle);
+
+ DCHECK_GE(handle->actual_length, 0) << "Negative actual length received";
+ size_t actual_length =
+ static_cast<size_t>(std::max(handle->actual_length, 0));
+
+ DCHECK(transfer.length >= actual_length)
+ << "data too big for our buffer (libusb failure?)";
+
+ switch (transfer.transfer_type) {
+ case USB_TRANSFER_CONTROL:
+ // If the transfer is a control transfer we do not expose the control
+ // setup header to the caller. This logic strips off the header if
+ // present before invoking the callback provided with the transfer.
+ if (actual_length > 0) {
+ CHECK(transfer.length >= LIBUSB_CONTROL_SETUP_SIZE)
+ << "buffer was not correctly set: too small for the control header";
+
+ if (transfer.length >= (LIBUSB_CONTROL_SETUP_SIZE + actual_length)) {
+ // If the payload is zero bytes long, pad out the allocated buffer
+ // size to one byte so that an IOBuffer of that size can be allocated.
+ scoped_refptr<net::IOBuffer> resized_buffer =
+ new net::IOBuffer(static_cast<int>(
+ std::max(actual_length, static_cast<size_t>(1))));
+ memcpy(resized_buffer->data(),
+ transfer.buffer->data() + LIBUSB_CONTROL_SETUP_SIZE,
+ actual_length);
+ transfer.buffer = resized_buffer;
+ }
+ }
+ break;
+
+ case USB_TRANSFER_ISOCHRONOUS:
+ // Isochronous replies might carry data in the different isoc packets even
+ // if the transfer actual_data value is zero. Furthermore, not all of the
+ // received packets might contain data, so we need to calculate how many
+ // data bytes we are effectively providing and pack the results.
+ if (actual_length == 0) {
+ size_t packet_buffer_start = 0;
+ for (int i = 0; i < handle->num_iso_packets; ++i) {
+ PlatformUsbIsoPacketDescriptor packet = &handle->iso_packet_desc[i];
+ if (packet->actual_length > 0) {
+ // We don't need to copy as long as all packets until now provide
+ // all the data the packet can hold.
+ if (actual_length < packet_buffer_start) {
+ CHECK(packet_buffer_start + packet->actual_length <=
+ transfer.length);
+ memmove(transfer.buffer->data() + actual_length,
+ transfer.buffer->data() + packet_buffer_start,
+ packet->actual_length);
+ }
+ actual_length += packet->actual_length;
+ }
+
+ packet_buffer_start += packet->length;
+ }
+ }
+ break;
+
+ case USB_TRANSFER_BULK:
+ case USB_TRANSFER_INTERRUPT:
+ break;
+
+ default:
+ NOTREACHED() << "Invalid usb transfer type";
+ break;
+ }
+
+ transfer.Complete(ConvertTransferStatus(handle->status), actual_length);
+ libusb_free_transfer(handle);
+
+ // Must release interface first before actually delete this.
+ transfer.claimed_interface = NULL;
+}
+
+bool UsbDeviceHandleImpl::GetSupportedLanguages() {
+ if (!languages_.empty()) {
+ return true;
+ }
+
+ // The 1-byte length field limits the descriptor to 256-bytes (128 uint16s).
+ uint16 languages[128];
+ int size = libusb_get_string_descriptor(
+ handle_,
+ 0,
+ 0,
+ reinterpret_cast<unsigned char*>(&languages[0]),
+ sizeof(languages));
+ if (size < 0) {
+ VLOG(1) << "Failed to get list of supported languages: "
+ << ConvertPlatformUsbErrorToString(size);
+ return false;
+ } else if (size < 2) {
+ VLOG(1) << "String descriptor zero has no header.";
+ return false;
+ // The first 2 bytes of the descriptor are the total length and type tag.
+ } else if ((languages[0] & 0xff) != size) {
+ VLOG(1) << "String descriptor zero size mismatch: " << (languages[0] & 0xff)
+ << " != " << size;
+ return false;
+ } else if ((languages[0] >> 8) != LIBUSB_DT_STRING) {
+ VLOG(1) << "String descriptor zero is not a string descriptor.";
+ return false;
+ }
+
+ languages_.assign(languages[1], languages[(size - 2) / 2]);
+ return true;
+}
+
void UsbDeviceHandleImpl::InternalClose() {
DCHECK(thread_checker_.CalledOnValidThread());
if (!device_)
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | device/usb/usb_device_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698