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

Side by Side Diff: device/usb/webusb_descriptors.cc

Issue 2821813002: Use Mojo enum types in the C++ USB interface (Closed)
Patch Set: Fix up //device/usb dependencies in //extensions/browser/api Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « device/usb/usb_device_handle_win.cc ('k') | device/usb/webusb_descriptors_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/usb/webusb_descriptors.h" 5 #include "device/usb/webusb_descriptors.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <iterator> 9 #include <iterator>
10 #include <map> 10 #include <map>
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 185
186 callback.Run(std::move(allowed_origins), landing_page); 186 callback.Run(std::move(allowed_origins), landing_page);
187 } 187 }
188 188
189 void OnReadUrlDescriptor(std::map<uint8_t, GURL>* url_map, 189 void OnReadUrlDescriptor(std::map<uint8_t, GURL>* url_map,
190 uint8_t index, 190 uint8_t index,
191 const base::Closure& callback, 191 const base::Closure& callback,
192 UsbTransferStatus status, 192 UsbTransferStatus status,
193 scoped_refptr<net::IOBuffer> buffer, 193 scoped_refptr<net::IOBuffer> buffer,
194 size_t length) { 194 size_t length) {
195 if (status != USB_TRANSFER_COMPLETED) { 195 if (status != UsbTransferStatus::COMPLETED) {
196 USB_LOG(EVENT) << "Failed to read WebUSB URL descriptor: " << index; 196 USB_LOG(EVENT) << "Failed to read WebUSB URL descriptor: " << index;
197 callback.Run(); 197 callback.Run();
198 return; 198 return;
199 } 199 }
200 200
201 GURL url; 201 GURL url;
202 if (ParseWebUsbUrlDescriptor( 202 if (ParseWebUsbUrlDescriptor(
203 std::vector<uint8_t>(buffer->data(), buffer->data() + length), 203 std::vector<uint8_t>(buffer->data(), buffer->data() + length),
204 &url)) { 204 &url)) {
205 (*url_map)[index] = url; 205 (*url_map)[index] = url;
206 } 206 }
207 callback.Run(); 207 callback.Run();
208 } 208 }
209 209
210 // Reads the descriptor with |index| from the device, adds the value to 210 // Reads the descriptor with |index| from the device, adds the value to
211 // |url_map| and then runs |callback|. 211 // |url_map| and then runs |callback|.
212 void ReadUrlDescriptor(scoped_refptr<UsbDeviceHandle> device_handle, 212 void ReadUrlDescriptor(scoped_refptr<UsbDeviceHandle> device_handle,
213 uint8_t vendor_code, 213 uint8_t vendor_code,
214 std::map<uint8_t, GURL>* url_map, 214 std::map<uint8_t, GURL>* url_map,
215 uint8_t index, 215 uint8_t index,
216 const base::Closure& callback) { 216 const base::Closure& callback) {
217 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255); 217 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255);
218 device_handle->ControlTransfer( 218 device_handle->ControlTransfer(
219 USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, 219 UsbTransferDirection::INBOUND, UsbControlTransferType::VENDOR,
220 vendor_code, index, kGetUrlRequest, buffer, buffer->size(), 220 UsbControlTransferRecipient::DEVICE, vendor_code, index, kGetUrlRequest,
221 kControlTransferTimeout, 221 buffer, buffer->size(), kControlTransferTimeout,
222 base::Bind(&OnReadUrlDescriptor, url_map, index, callback)); 222 base::Bind(&OnReadUrlDescriptor, url_map, index, callback));
223 } 223 }
224 224
225 // Reads URL descriptors from the device so that it can fill |allowed_origins| 225 // Reads URL descriptors from the device so that it can fill |allowed_origins|
226 // with the GURLs matching the indicies already collected. 226 // with the GURLs matching the indicies already collected.
227 void ReadUrlDescriptors(scoped_refptr<UsbDeviceHandle> device_handle, 227 void ReadUrlDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
228 uint8_t vendor_code, 228 uint8_t vendor_code,
229 uint8_t landing_page_id, 229 uint8_t landing_page_id,
230 const ReadWebUsbDescriptorsCallback& callback, 230 const ReadWebUsbDescriptorsCallback& callback,
231 std::unique_ptr<WebUsbAllowedOrigins> allowed_origins) { 231 std::unique_ptr<WebUsbAllowedOrigins> allowed_origins) {
(...skipping 26 matching lines...) Expand all
258 for (uint8_t index : to_request) { 258 for (uint8_t index : to_request) {
259 ReadUrlDescriptor(device_handle, vendor_code, url_map_ptr, index, barrier); 259 ReadUrlDescriptor(device_handle, vendor_code, url_map_ptr, index, barrier);
260 } 260 }
261 } 261 }
262 262
263 void OnReadWebUsbAllowedOrigins( 263 void OnReadWebUsbAllowedOrigins(
264 const ReadWebUsbAllowedOriginsCallback& callback, 264 const ReadWebUsbAllowedOriginsCallback& callback,
265 UsbTransferStatus status, 265 UsbTransferStatus status,
266 scoped_refptr<net::IOBuffer> buffer, 266 scoped_refptr<net::IOBuffer> buffer,
267 size_t length) { 267 size_t length) {
268 if (status != USB_TRANSFER_COMPLETED) { 268 if (status != UsbTransferStatus::COMPLETED) {
269 USB_LOG(EVENT) << "Failed to read WebUSB allowed origins."; 269 USB_LOG(EVENT) << "Failed to read WebUSB allowed origins.";
270 callback.Run(nullptr); 270 callback.Run(nullptr);
271 return; 271 return;
272 } 272 }
273 273
274 std::unique_ptr<WebUsbAllowedOrigins> allowed_origins( 274 std::unique_ptr<WebUsbAllowedOrigins> allowed_origins(
275 new WebUsbAllowedOrigins()); 275 new WebUsbAllowedOrigins());
276 if (allowed_origins->Parse( 276 if (allowed_origins->Parse(
277 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { 277 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) {
278 callback.Run(std::move(allowed_origins)); 278 callback.Run(std::move(allowed_origins));
279 } else { 279 } else {
280 callback.Run(nullptr); 280 callback.Run(nullptr);
281 } 281 }
282 } 282 }
283 283
284 void OnReadWebUsbAllowedOriginsHeader( 284 void OnReadWebUsbAllowedOriginsHeader(
285 scoped_refptr<UsbDeviceHandle> device_handle, 285 scoped_refptr<UsbDeviceHandle> device_handle,
286 const ReadWebUsbAllowedOriginsCallback& callback, 286 const ReadWebUsbAllowedOriginsCallback& callback,
287 uint8_t vendor_code, 287 uint8_t vendor_code,
288 UsbTransferStatus status, 288 UsbTransferStatus status,
289 scoped_refptr<net::IOBuffer> buffer, 289 scoped_refptr<net::IOBuffer> buffer,
290 size_t length) { 290 size_t length) {
291 if (status != USB_TRANSFER_COMPLETED || length != 4) { 291 if (status != UsbTransferStatus::COMPLETED || length != 4) {
292 USB_LOG(EVENT) << "Failed to read WebUSB allowed origins header."; 292 USB_LOG(EVENT) << "Failed to read WebUSB allowed origins header.";
293 callback.Run(nullptr); 293 callback.Run(nullptr);
294 return; 294 return;
295 } 295 }
296 296
297 const uint8_t* data = reinterpret_cast<uint8_t*>(buffer->data()); 297 const uint8_t* data = reinterpret_cast<uint8_t*>(buffer->data());
298 uint16_t new_length = data[2] | (data[3] << 8); 298 uint16_t new_length = data[2] | (data[3] << 8);
299 scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length); 299 scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length);
300 device_handle->ControlTransfer( 300 device_handle->ControlTransfer(
301 USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, 301 UsbTransferDirection::INBOUND, UsbControlTransferType::VENDOR,
302 vendor_code, 0, kGetAllowedOriginsRequest, new_buffer, new_buffer->size(), 302 UsbControlTransferRecipient::DEVICE, vendor_code, 0,
303 kGetAllowedOriginsRequest, new_buffer, new_buffer->size(),
303 kControlTransferTimeout, 304 kControlTransferTimeout,
304 base::Bind(&OnReadWebUsbAllowedOrigins, callback)); 305 base::Bind(&OnReadWebUsbAllowedOrigins, callback));
305 } 306 }
306 307
307 void ReadWebUsbAllowedOrigins( 308 void ReadWebUsbAllowedOrigins(
308 scoped_refptr<UsbDeviceHandle> device_handle, 309 scoped_refptr<UsbDeviceHandle> device_handle,
309 uint8_t vendor_code, 310 uint8_t vendor_code,
310 const ReadWebUsbAllowedOriginsCallback& callback) { 311 const ReadWebUsbAllowedOriginsCallback& callback) {
311 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(4); 312 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(4);
312 device_handle->ControlTransfer( 313 device_handle->ControlTransfer(
313 USB_DIRECTION_INBOUND, UsbDeviceHandle::VENDOR, UsbDeviceHandle::DEVICE, 314 UsbTransferDirection::INBOUND, UsbControlTransferType::VENDOR,
314 vendor_code, 0, kGetAllowedOriginsRequest, buffer, buffer->size(), 315 UsbControlTransferRecipient::DEVICE, vendor_code, 0,
316 kGetAllowedOriginsRequest, buffer, buffer->size(),
315 kControlTransferTimeout, 317 kControlTransferTimeout,
316 base::Bind(&OnReadWebUsbAllowedOriginsHeader, device_handle, callback, 318 base::Bind(&OnReadWebUsbAllowedOriginsHeader, device_handle, callback,
317 vendor_code)); 319 vendor_code));
318 } 320 }
319 321
320 void OnReadBosDescriptor(scoped_refptr<UsbDeviceHandle> device_handle, 322 void OnReadBosDescriptor(scoped_refptr<UsbDeviceHandle> device_handle,
321 const ReadWebUsbDescriptorsCallback& callback, 323 const ReadWebUsbDescriptorsCallback& callback,
322 UsbTransferStatus status, 324 UsbTransferStatus status,
323 scoped_refptr<net::IOBuffer> buffer, 325 scoped_refptr<net::IOBuffer> buffer,
324 size_t length) { 326 size_t length) {
325 if (status != USB_TRANSFER_COMPLETED) { 327 if (status != UsbTransferStatus::COMPLETED) {
326 USB_LOG(EVENT) << "Failed to read BOS descriptor."; 328 USB_LOG(EVENT) << "Failed to read BOS descriptor.";
327 callback.Run(nullptr, GURL()); 329 callback.Run(nullptr, GURL());
328 return; 330 return;
329 } 331 }
330 332
331 WebUsbPlatformCapabilityDescriptor descriptor; 333 WebUsbPlatformCapabilityDescriptor descriptor;
332 if (!descriptor.ParseFromBosDescriptor( 334 if (!descriptor.ParseFromBosDescriptor(
333 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { 335 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) {
334 callback.Run(nullptr, GURL()); 336 callback.Run(nullptr, GURL());
335 return; 337 return;
336 } 338 }
337 339
338 ReadWebUsbAllowedOrigins( 340 ReadWebUsbAllowedOrigins(
339 device_handle, descriptor.vendor_code, 341 device_handle, descriptor.vendor_code,
340 base::Bind(&ReadUrlDescriptors, device_handle, descriptor.vendor_code, 342 base::Bind(&ReadUrlDescriptors, device_handle, descriptor.vendor_code,
341 descriptor.landing_page_id, callback)); 343 descriptor.landing_page_id, callback));
342 } 344 }
343 345
344 void OnReadBosDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle, 346 void OnReadBosDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle,
345 const ReadWebUsbDescriptorsCallback& callback, 347 const ReadWebUsbDescriptorsCallback& callback,
346 UsbTransferStatus status, 348 UsbTransferStatus status,
347 scoped_refptr<net::IOBuffer> buffer, 349 scoped_refptr<net::IOBuffer> buffer,
348 size_t length) { 350 size_t length) {
349 if (status != USB_TRANSFER_COMPLETED || length != 5) { 351 if (status != UsbTransferStatus::COMPLETED || length != 5) {
350 USB_LOG(EVENT) << "Failed to read BOS descriptor header."; 352 USB_LOG(EVENT) << "Failed to read BOS descriptor header.";
351 callback.Run(nullptr, GURL()); 353 callback.Run(nullptr, GURL());
352 return; 354 return;
353 } 355 }
354 356
355 const uint8_t* data = reinterpret_cast<uint8_t*>(buffer->data()); 357 const uint8_t* data = reinterpret_cast<uint8_t*>(buffer->data());
356 uint16_t new_length = data[2] | (data[3] << 8); 358 uint16_t new_length = data[2] | (data[3] << 8);
357 scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length); 359 scoped_refptr<IOBufferWithSize> new_buffer = new IOBufferWithSize(new_length);
358 device_handle->ControlTransfer( 360 device_handle->ControlTransfer(
359 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, 361 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
360 kGetDescriptorRequest, kBosDescriptorType << 8, 0, new_buffer, 362 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
361 new_buffer->size(), kControlTransferTimeout, 363 kBosDescriptorType << 8, 0, new_buffer, new_buffer->size(),
364 kControlTransferTimeout,
362 base::Bind(&OnReadBosDescriptor, device_handle, callback)); 365 base::Bind(&OnReadBosDescriptor, device_handle, callback));
363 } 366 }
364 367
365 } // namespace 368 } // namespace
366 369
367 WebUsbFunctionSubset::WebUsbFunctionSubset() : first_interface(0) {} 370 WebUsbFunctionSubset::WebUsbFunctionSubset() : first_interface(0) {}
368 371
369 WebUsbFunctionSubset::WebUsbFunctionSubset(const WebUsbFunctionSubset& other) = 372 WebUsbFunctionSubset::WebUsbFunctionSubset(const WebUsbFunctionSubset& other) =
370 default; 373 default;
371 374
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 return false; 564 return false;
562 } 565 }
563 566
564 return true; 567 return true;
565 } 568 }
566 569
567 void ReadWebUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle, 570 void ReadWebUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
568 const ReadWebUsbDescriptorsCallback& callback) { 571 const ReadWebUsbDescriptorsCallback& callback) {
569 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(5); 572 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(5);
570 device_handle->ControlTransfer( 573 device_handle->ControlTransfer(
571 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, 574 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
572 kGetDescriptorRequest, kBosDescriptorType << 8, 0, buffer, buffer->size(), 575 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
576 kBosDescriptorType << 8, 0, buffer, buffer->size(),
573 kControlTransferTimeout, 577 kControlTransferTimeout,
574 base::Bind(&OnReadBosDescriptorHeader, device_handle, callback)); 578 base::Bind(&OnReadBosDescriptorHeader, device_handle, callback));
575 } 579 }
576 580
577 bool FindInWebUsbAllowedOrigins( 581 bool FindInWebUsbAllowedOrigins(
578 const device::WebUsbAllowedOrigins* allowed_origins, 582 const device::WebUsbAllowedOrigins* allowed_origins,
579 const GURL& origin, 583 const GURL& origin,
580 base::Optional<uint8_t> config_value, 584 base::Optional<uint8_t> config_value,
581 base::Optional<uint8_t> first_interface) { 585 base::Optional<uint8_t> first_interface) {
582 if (!allowed_origins) 586 if (!allowed_origins)
(...skipping 15 matching lines...) Expand all
598 602
599 if (base::ContainsValue(function.origins, origin)) 603 if (base::ContainsValue(function.origins, origin))
600 return true; 604 return true;
601 } 605 }
602 } 606 }
603 607
604 return false; 608 return false;
605 } 609 }
606 610
607 } // namespace device 611 } // namespace device
OLDNEW
« no previous file with comments | « device/usb/usb_device_handle_win.cc ('k') | device/usb/webusb_descriptors_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698