Index: device/usb/usb_device_impl.cc |
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc |
index d0dc78097e9b916e4a64b96eda986c7b359b5832..03c8ee0b8d74843dd65828c01c0d209d5b957a92 100644 |
--- a/device/usb/usb_device_impl.cc |
+++ b/device/usb/usb_device_impl.cc |
@@ -12,9 +12,9 @@ |
#include "base/stl_util.h" |
#include "base/thread_task_runner_handle.h" |
#include "device/usb/usb_context.h" |
-#include "device/usb/usb_descriptors.h" |
#include "device/usb/usb_device_handle_impl.h" |
#include "device/usb/usb_error.h" |
+#include "device/usb/usb_interface_impl.h" |
#include "third_party/libusb/src/libusb/libusb.h" |
#if defined(OS_CHROMEOS) |
@@ -22,8 +22,6 @@ |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/permission_broker_client.h" |
#endif // defined(OS_CHROMEOS) |
- |
-namespace device { |
namespace { |
@@ -36,67 +34,9 @@ |
} |
#endif // defined(OS_CHROMEOS) |
-UsbEndpointDirection GetDirection( |
- const libusb_endpoint_descriptor* descriptor) { |
- switch (descriptor->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) { |
- case LIBUSB_ENDPOINT_IN: |
- return USB_DIRECTION_INBOUND; |
- case LIBUSB_ENDPOINT_OUT: |
- return USB_DIRECTION_OUTBOUND; |
- default: |
- NOTREACHED(); |
- return USB_DIRECTION_INBOUND; |
- } |
-} |
+} // namespace |
-UsbSynchronizationType GetSynchronizationType( |
- const libusb_endpoint_descriptor* descriptor) { |
- switch (descriptor->bmAttributes & LIBUSB_ISO_SYNC_TYPE_MASK) { |
- case LIBUSB_ISO_SYNC_TYPE_NONE: |
- return USB_SYNCHRONIZATION_NONE; |
- case LIBUSB_ISO_SYNC_TYPE_ASYNC: |
- return USB_SYNCHRONIZATION_ASYNCHRONOUS; |
- case LIBUSB_ISO_SYNC_TYPE_ADAPTIVE: |
- return USB_SYNCHRONIZATION_ADAPTIVE; |
- case LIBUSB_ISO_SYNC_TYPE_SYNC: |
- return USB_SYNCHRONIZATION_SYNCHRONOUS; |
- default: |
- NOTREACHED(); |
- return USB_SYNCHRONIZATION_NONE; |
- } |
-} |
- |
-UsbTransferType GetTransferType(const libusb_endpoint_descriptor* descriptor) { |
- switch (descriptor->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) { |
- case LIBUSB_TRANSFER_TYPE_CONTROL: |
- return USB_TRANSFER_CONTROL; |
- case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: |
- return USB_TRANSFER_ISOCHRONOUS; |
- case LIBUSB_TRANSFER_TYPE_BULK: |
- return USB_TRANSFER_BULK; |
- case LIBUSB_TRANSFER_TYPE_INTERRUPT: |
- return USB_TRANSFER_INTERRUPT; |
- default: |
- NOTREACHED(); |
- return USB_TRANSFER_CONTROL; |
- } |
-} |
- |
-UsbUsageType GetUsageType(const libusb_endpoint_descriptor* descriptor) { |
- switch (descriptor->bmAttributes & LIBUSB_ISO_USAGE_TYPE_MASK) { |
- case LIBUSB_ISO_USAGE_TYPE_DATA: |
- return USB_USAGE_DATA; |
- case LIBUSB_ISO_USAGE_TYPE_FEEDBACK: |
- return USB_USAGE_FEEDBACK; |
- case LIBUSB_ISO_USAGE_TYPE_IMPLICIT: |
- return USB_USAGE_EXPLICIT_FEEDBACK; |
- default: |
- NOTREACHED(); |
- return USB_USAGE_DATA; |
- } |
-} |
- |
-} // namespace |
+namespace device { |
UsbDeviceImpl::UsbDeviceImpl( |
scoped_refptr<UsbContext> context, |
@@ -107,7 +47,6 @@ |
uint32 unique_id) |
: UsbDevice(vendor_id, product_id, unique_id), |
platform_device_(platform_device), |
- current_configuration_cached_(false), |
context_(context), |
ui_task_runner_(ui_task_runner) { |
CHECK(platform_device) << "platform_device cannot be NULL"; |
@@ -162,12 +101,11 @@ |
PlatformUsbDeviceHandle handle; |
const int rv = libusb_open(platform_device_, &handle); |
if (LIBUSB_SUCCESS == rv) { |
- GetConfiguration(); |
- if (!current_configuration_cached_) { |
+ scoped_refptr<UsbConfigDescriptor> interfaces = ListInterfaces(); |
+ if (!interfaces.get()) |
return NULL; |
- } |
scoped_refptr<UsbDeviceHandleImpl> device_handle = |
- new UsbDeviceHandleImpl(context_, this, handle, current_configuration_); |
+ new UsbDeviceHandleImpl(context_, this, handle, interfaces); |
handles_.push_back(device_handle); |
return device_handle; |
} else { |
@@ -190,76 +128,19 @@ |
return false; |
} |
-const UsbConfigDescriptor& UsbDeviceImpl::GetConfiguration() { |
+scoped_refptr<UsbConfigDescriptor> UsbDeviceImpl::ListInterfaces() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!current_configuration_cached_) { |
- libusb_config_descriptor* platform_config; |
- const int rv = |
- libusb_get_active_config_descriptor(platform_device_, &platform_config); |
- if (rv != LIBUSB_SUCCESS) { |
- VLOG(1) << "Failed to get config descriptor: " |
- << ConvertPlatformUsbErrorToString(rv); |
- return current_configuration_; |
- } |
- |
- current_configuration_.configuration_value = |
- platform_config->bConfigurationValue; |
- current_configuration_.self_powered = |
- (platform_config->bmAttributes & 0x40) != 0; |
- current_configuration_.remote_wakeup = |
- (platform_config->bmAttributes & 0x20) != 0; |
- current_configuration_.maximum_power = platform_config->MaxPower * 2; |
- |
- for (size_t i = 0; i < platform_config->bNumInterfaces; ++i) { |
- const struct libusb_interface* platform_interface = |
- &platform_config->interface[i]; |
- for (int j = 0; j < platform_interface->num_altsetting; ++j) { |
- const struct libusb_interface_descriptor* platform_alt_setting = |
- &platform_interface->altsetting[j]; |
- UsbInterfaceDescriptor interface; |
- |
- interface.interface_number = platform_alt_setting->bInterfaceNumber; |
- interface.alternate_setting = platform_alt_setting->bAlternateSetting; |
- interface.interface_class = platform_alt_setting->bInterfaceClass; |
- interface.interface_subclass = platform_alt_setting->bInterfaceSubClass; |
- interface.interface_protocol = platform_alt_setting->bInterfaceProtocol; |
- |
- for (size_t k = 0; k < platform_alt_setting->bNumEndpoints; ++k) { |
- const struct libusb_endpoint_descriptor* platform_endpoint = |
- &platform_alt_setting->endpoint[k]; |
- UsbEndpointDescriptor endpoint; |
- |
- endpoint.address = platform_endpoint->bEndpointAddress; |
- endpoint.direction = GetDirection(platform_endpoint); |
- endpoint.maximum_packet_size = platform_endpoint->wMaxPacketSize; |
- endpoint.synchronization_type = |
- GetSynchronizationType(platform_endpoint); |
- endpoint.transfer_type = GetTransferType(platform_endpoint); |
- endpoint.usage_type = GetUsageType(platform_endpoint); |
- endpoint.polling_interval = platform_endpoint->bInterval; |
- endpoint.extra_data = std::vector<uint8_t>( |
- platform_endpoint->extra, |
- platform_endpoint->extra + platform_endpoint->extra_length); |
- |
- interface.endpoints.push_back(endpoint); |
- } |
- |
- interface.extra_data = std::vector<uint8_t>( |
- platform_alt_setting->extra, |
- platform_alt_setting->extra + platform_alt_setting->extra_length); |
- |
- current_configuration_.interfaces.push_back(interface); |
- } |
- } |
- |
- current_configuration_.extra_data = std::vector<uint8_t>( |
- platform_config->extra, |
- platform_config->extra + platform_config->extra_length); |
- current_configuration_cached_ = true; |
+ PlatformUsbConfigDescriptor platform_config; |
+ const int rv = |
+ libusb_get_active_config_descriptor(platform_device_, &platform_config); |
+ if (rv == LIBUSB_SUCCESS) { |
+ return new UsbConfigDescriptorImpl(platform_config); |
+ } else { |
+ VLOG(1) << "Failed to get config descriptor: " |
+ << ConvertPlatformUsbErrorToString(rv); |
+ return NULL; |
} |
- |
- return current_configuration_; |
} |
void UsbDeviceImpl::OnDisconnect() { |