Index: device/usb/usb_service_impl.cc |
diff --git a/device/usb/usb_service_impl.cc b/device/usb/usb_service_impl.cc |
index 93b51d617514a6fdc3f9afe4dbd031254469862d..759f33cd1aff4261b66f6a8070645cd84332020f 100644 |
--- a/device/usb/usb_service_impl.cc |
+++ b/device/usb/usb_service_impl.cc |
@@ -48,11 +48,6 @@ namespace { |
const uint16_t kUsbVersion2_1 = 0x0210; |
const uint8_t kGetDescriptorRequest = 0x06; |
const uint8_t kStringDescriptorType = 0x03; |
-const uint8_t kBosDescriptorType = 0x0F; |
- |
-// WebUSB requests: |
-const uint8_t kGetAllowedOriginsRequest = 0x01; |
-const uint8_t kGetLandingPageRequest = 0x02; |
const int kControlTransferTimeout = 60000; // 1 minute |
@@ -150,147 +145,6 @@ void ReadStringDescriptor( |
base::Bind(&OnReadStringDescriptor, callback)); |
} |
-void OnReadWebUsbLandingPage(scoped_refptr<UsbDevice> device, |
- const base::Closure& callback, |
- UsbTransferStatus status, |
- scoped_refptr<net::IOBuffer> buffer, |
- size_t length) { |
- if (status != USB_TRANSFER_COMPLETED) { |
- USB_LOG(EVENT) << "Failed to read WebUSB landing page."; |
- callback.Run(); |
- return; |
- } |
- |
- GURL landing_page; |
- if (ParseWebUsbUrlDescriptor( |
- std::vector<uint8_t>(buffer->data(), buffer->data() + length), |
- &landing_page)) { |
- UsbDeviceImpl* device_impl = static_cast<UsbDeviceImpl*>(device.get()); |
- device_impl->set_webusb_landing_page(landing_page); |
- } |
- callback.Run(); |
-} |
- |
-void ReadWebUsbLandingPage(scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback, |
- uint8_t vendor_code) { |
- scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255); |
- device_handle->ControlTransfer( |
- USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, |
- vendor_code, 0, kGetLandingPageRequest, buffer, buffer->size(), |
- kControlTransferTimeout, |
- base::Bind(&OnReadWebUsbLandingPage, device_handle->GetDevice(), |
- callback)); |
-} |
- |
-void OnReadWebUsbAllowedOrigins(scoped_refptr<UsbDevice> device, |
- const base::Closure& callback, |
- UsbTransferStatus status, |
- scoped_refptr<net::IOBuffer> buffer, |
- size_t length) { |
- if (status != USB_TRANSFER_COMPLETED) { |
- USB_LOG(EVENT) << "Failed to read WebUSB allowed origins."; |
- callback.Run(); |
- return; |
- } |
- |
- scoped_ptr<WebUsbDescriptorSet> descriptors(new WebUsbDescriptorSet()); |
- if (descriptors->Parse( |
- std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { |
- UsbDeviceImpl* device_impl = static_cast<UsbDeviceImpl*>(device.get()); |
- device_impl->set_webusb_allowed_origins(std::move(descriptors)); |
- } |
- callback.Run(); |
-} |
- |
-void OnReadWebUsbAllowedOriginsHeader( |
- scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback, |
- uint8_t vendor_code, |
- UsbTransferStatus status, |
- scoped_refptr<net::IOBuffer> buffer, |
- size_t length) { |
- if (status != USB_TRANSFER_COMPLETED || length != 4) { |
- USB_LOG(EVENT) << "Failed to read WebUSB allowed origins header."; |
- callback.Run(); |
- return; |
- } |
- |
- uint16_t new_length = buffer->data()[2] | (buffer->data()[3] << 8); |
- scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length); |
- device_handle->ControlTransfer( |
- USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, |
- vendor_code, 0, kGetAllowedOriginsRequest, new_buffer, new_buffer->size(), |
- kControlTransferTimeout, |
- base::Bind(&OnReadWebUsbAllowedOrigins, device_handle->GetDevice(), |
- callback)); |
-} |
- |
-void ReadWebUsbAllowedOrigins(scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback, |
- uint8_t vendor_code) { |
- scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(4); |
- device_handle->ControlTransfer( |
- USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, |
- vendor_code, 0, kGetAllowedOriginsRequest, buffer, buffer->size(), |
- kControlTransferTimeout, |
- base::Bind(&OnReadWebUsbAllowedOriginsHeader, device_handle, callback, |
- vendor_code)); |
-} |
- |
-void OnReadBosDescriptor(scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback, |
- UsbTransferStatus status, |
- scoped_refptr<net::IOBuffer> buffer, |
- size_t length) { |
- if (status != USB_TRANSFER_COMPLETED) { |
- USB_LOG(EVENT) << "Failed to read BOS descriptor."; |
- callback.Run(); |
- return; |
- } |
- |
- WebUsbPlatformCapabilityDescriptor descriptor; |
- if (!descriptor.ParseFromBosDescriptor( |
- std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { |
- callback.Run(); |
- return; |
- } |
- |
- base::Closure barrier = base::BarrierClosure(2, callback); |
- ReadWebUsbLandingPage(device_handle, barrier, descriptor.vendor_code); |
- ReadWebUsbAllowedOrigins(device_handle, barrier, descriptor.vendor_code); |
-} |
- |
-void OnReadBosDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback, |
- UsbTransferStatus status, |
- scoped_refptr<net::IOBuffer> buffer, |
- size_t length) { |
- if (status != USB_TRANSFER_COMPLETED || length != 5) { |
- USB_LOG(EVENT) << "Failed to read BOS descriptor header."; |
- callback.Run(); |
- return; |
- } |
- |
- uint16_t new_length = buffer->data()[2] | (buffer->data()[3] << 8); |
- scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length); |
- device_handle->ControlTransfer( |
- USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, |
- kGetDescriptorRequest, kBosDescriptorType << 8, 0, new_buffer, |
- new_buffer->size(), kControlTransferTimeout, |
- base::Bind(&OnReadBosDescriptor, device_handle, callback)); |
-} |
- |
-void ReadBosDescriptor(scoped_refptr<UsbDeviceHandle> device_handle, |
- const base::Closure& callback) { |
- scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(5); |
- device_handle->ControlTransfer( |
- USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, |
- kGetDescriptorRequest, kBosDescriptorType << 8, 0, buffer, buffer->size(), |
- kControlTransferTimeout, |
- base::Bind(&OnReadBosDescriptorHeader, device_handle, callback)); |
-} |
- |
void CloseHandleAndRunContinuation(scoped_refptr<UsbDeviceHandle> device_handle, |
const base::Closure& continuation) { |
device_handle->Close(); |
@@ -349,6 +203,21 @@ void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle, |
} |
} |
+void OnReadBosDescriptor(scoped_refptr<UsbDeviceHandle> device_handle, |
+ const base::Closure& barrier, |
+ scoped_ptr<WebUsbAllowedOrigins> allowed_origins, |
+ const GURL& landing_page) { |
+ scoped_refptr<UsbDeviceImpl> device = |
+ static_cast<UsbDeviceImpl*>(device_handle->GetDevice().get()); |
+ |
+ if (allowed_origins) |
+ device->set_webusb_allowed_origins(std::move(allowed_origins)); |
+ if (landing_page.is_valid()) |
+ device->set_webusb_landing_page(landing_page); |
+ |
+ barrier.Run(); |
+} |
+ |
void OnDeviceOpenedReadDescriptors( |
uint8_t manufacturer, |
uint8_t product, |
@@ -381,7 +250,8 @@ void OnDeviceOpenedReadDescriptors( |
} |
if (read_bos_descriptors) { |
- ReadBosDescriptor(device_handle, barrier); |
+ ReadWebUsbDescriptors(device_handle, base::Bind(&OnReadBosDescriptor, |
+ device_handle, barrier)); |
} |
} else { |
failure_closure.Run(); |