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

Unified Diff: device/usb/usb_service_impl.cc

Issue 1646783002: Update webusb_descriptors.cc to parse the new WebUSB descriptors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@io_buffer
Patch Set: Sometimes MSVC complains about passing size_type to BarrierClosure. Created 4 years, 11 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_impl.h ('k') | device/usb/webusb_descriptors.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « device/usb/usb_device_impl.h ('k') | device/usb/webusb_descriptors.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698