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

Side by Side Diff: chrome/browser/devtools/device/usb/android_usb_device.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 | « chrome/browser/devtools/device/usb/android_usb_browsertest.cc ('k') | device/usb/BUILD.gn » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/devtools/device/usb/android_usb_device.h" 5 #include "chrome/browser/devtools/device/usb/android_usb_device.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/barrier_closure.h" 10 #include "base/barrier_closure.h"
(...skipping 18 matching lines...) Expand all
29 #include "net/base/ip_endpoint.h" 29 #include "net/base/ip_endpoint.h"
30 #include "net/base/net_errors.h" 30 #include "net/base/net_errors.h"
31 #include "net/socket/stream_socket.h" 31 #include "net/socket/stream_socket.h"
32 32
33 using device::UsbConfigDescriptor; 33 using device::UsbConfigDescriptor;
34 using device::UsbDevice; 34 using device::UsbDevice;
35 using device::UsbDeviceHandle; 35 using device::UsbDeviceHandle;
36 using device::UsbInterfaceDescriptor; 36 using device::UsbInterfaceDescriptor;
37 using device::UsbEndpointDescriptor; 37 using device::UsbEndpointDescriptor;
38 using device::UsbService; 38 using device::UsbService;
39 using device::UsbTransferDirection;
39 using device::UsbTransferStatus; 40 using device::UsbTransferStatus;
41 using device::UsbTransferType;
40 42
41 namespace { 43 namespace {
42 44
43 const size_t kHeaderSize = 24; 45 const size_t kHeaderSize = 24;
44 46
45 const int kAdbClass = 0xff; 47 const int kAdbClass = 0xff;
46 const int kAdbSubclass = 0x42; 48 const int kAdbSubclass = 0x42;
47 const int kAdbProtocol = 0x1; 49 const int kAdbProtocol = 0x1;
48 50
49 const int kUsbTimeout = 0; 51 const int kUsbTimeout = 0;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 barrier.Run(); 222 barrier.Run();
221 return; 223 return;
222 } 224 }
223 225
224 const UsbInterfaceDescriptor& interface = config->interfaces[interface_id]; 226 const UsbInterfaceDescriptor& interface = config->interfaces[interface_id];
225 int inbound_address = 0; 227 int inbound_address = 0;
226 int outbound_address = 0; 228 int outbound_address = 0;
227 int zero_mask = 0; 229 int zero_mask = 0;
228 230
229 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) { 231 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) {
230 if (endpoint.transfer_type != device::USB_TRANSFER_BULK) 232 if (endpoint.transfer_type != UsbTransferType::BULK)
231 continue; 233 continue;
232 if (endpoint.direction == device::USB_DIRECTION_INBOUND) 234 if (endpoint.direction == UsbTransferDirection::INBOUND)
233 inbound_address = endpoint.address; 235 inbound_address = endpoint.address;
234 else 236 else
235 outbound_address = endpoint.address; 237 outbound_address = endpoint.address;
236 zero_mask = endpoint.maximum_packet_size - 1; 238 zero_mask = endpoint.maximum_packet_size - 1;
237 } 239 }
238 240
239 if (inbound_address == 0 || outbound_address == 0) { 241 if (inbound_address == 0 || outbound_address == 0) {
240 barrier.Run(); 242 barrier.Run();
241 return; 243 return;
242 } 244 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 DCHECK(task_runner_->BelongsToCurrentThread()); 441 DCHECK(task_runner_->BelongsToCurrentThread());
440 442
441 if (outgoing_queue_.empty() || !usb_handle_.get()) 443 if (outgoing_queue_.empty() || !usb_handle_.get())
442 return; 444 return;
443 445
444 BulkMessage message = outgoing_queue_.front(); 446 BulkMessage message = outgoing_queue_.front();
445 outgoing_queue_.pop(); 447 outgoing_queue_.pop();
446 DumpMessage(true, message->data(), message->size()); 448 DumpMessage(true, message->data(), message->size());
447 449
448 usb_handle_->GenericTransfer( 450 usb_handle_->GenericTransfer(
449 device::USB_DIRECTION_OUTBOUND, outbound_address_, message, 451 UsbTransferDirection::OUTBOUND, outbound_address_, message,
450 message->size(), kUsbTimeout, 452 message->size(), kUsbTimeout,
451 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, 453 base::Bind(&AndroidUsbDevice::OutgoingMessageSent,
452 weak_factory_.GetWeakPtr())); 454 weak_factory_.GetWeakPtr()));
453 } 455 }
454 456
455 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, 457 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status,
456 scoped_refptr<net::IOBuffer> buffer, 458 scoped_refptr<net::IOBuffer> buffer,
457 size_t result) { 459 size_t result) {
458 if (status != device::USB_TRANSFER_COMPLETED) { 460 if (status != UsbTransferStatus::COMPLETED) {
459 return; 461 return;
460 } 462 }
461 463
462 task_runner_->PostTask(FROM_HERE, 464 task_runner_->PostTask(FROM_HERE,
463 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); 465 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this));
464 } 466 }
465 467
466 void AndroidUsbDevice::ReadHeader() { 468 void AndroidUsbDevice::ReadHeader() {
467 DCHECK(task_runner_->BelongsToCurrentThread()); 469 DCHECK(task_runner_->BelongsToCurrentThread());
468 470
469 if (!usb_handle_.get()) { 471 if (!usb_handle_.get()) {
470 return; 472 return;
471 } 473 }
472 474
473 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); 475 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize);
474 usb_handle_->GenericTransfer( 476 usb_handle_->GenericTransfer(
475 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, kHeaderSize, 477 UsbTransferDirection::INBOUND, inbound_address_, buffer, kHeaderSize,
476 kUsbTimeout, 478 kUsbTimeout,
477 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr())); 479 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr()));
478 } 480 }
479 481
480 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, 482 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status,
481 scoped_refptr<net::IOBuffer> buffer, 483 scoped_refptr<net::IOBuffer> buffer,
482 size_t result) { 484 size_t result) {
483 DCHECK(task_runner_->BelongsToCurrentThread()); 485 DCHECK(task_runner_->BelongsToCurrentThread());
484 486
485 if (status == device::USB_TRANSFER_TIMEOUT) { 487 if (status == UsbTransferStatus::TIMEOUT) {
486 task_runner_->PostTask(FROM_HERE, 488 task_runner_->PostTask(FROM_HERE,
487 base::Bind(&AndroidUsbDevice::ReadHeader, this)); 489 base::Bind(&AndroidUsbDevice::ReadHeader, this));
488 return; 490 return;
489 } 491 }
490 492
491 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) { 493 if (status != UsbTransferStatus::COMPLETED || result != kHeaderSize) {
492 TransferError(status); 494 TransferError(status);
493 return; 495 return;
494 } 496 }
495 497
496 DumpMessage(false, buffer->data(), result); 498 DumpMessage(false, buffer->data(), result);
497 std::vector<uint32_t> header(6); 499 std::vector<uint32_t> header(6);
498 memcpy(&header[0], buffer->data(), result); 500 memcpy(&header[0], buffer->data(), result);
499 std::unique_ptr<AdbMessage> message( 501 std::unique_ptr<AdbMessage> message(
500 new AdbMessage(header[0], header[1], header[2], "")); 502 new AdbMessage(header[0], header[1], header[2], ""));
501 uint32_t data_length = header[3]; 503 uint32_t data_length = header[3];
502 uint32_t data_check = header[4]; 504 uint32_t data_check = header[4];
503 uint32_t magic = header[5]; 505 uint32_t magic = header[5];
504 if ((message->command ^ 0xffffffff) != magic) { 506 if ((message->command ^ 0xffffffff) != magic) {
505 TransferError(device::USB_TRANSFER_ERROR); 507 TransferError(UsbTransferStatus::TRANSFER_ERROR);
506 return; 508 return;
507 } 509 }
508 510
509 if (data_length == 0) { 511 if (data_length == 0) {
510 task_runner_->PostTask(FROM_HERE, 512 task_runner_->PostTask(FROM_HERE,
511 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 513 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
512 base::Passed(&message))); 514 base::Passed(&message)));
513 } else { 515 } else {
514 task_runner_->PostTask( 516 task_runner_->PostTask(
515 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, 517 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this,
516 base::Passed(&message), data_length, data_check)); 518 base::Passed(&message), data_length, data_check));
517 } 519 }
518 } 520 }
519 521
520 void AndroidUsbDevice::ReadBody(std::unique_ptr<AdbMessage> message, 522 void AndroidUsbDevice::ReadBody(std::unique_ptr<AdbMessage> message,
521 uint32_t data_length, 523 uint32_t data_length,
522 uint32_t data_check) { 524 uint32_t data_check) {
523 DCHECK(task_runner_->BelongsToCurrentThread()); 525 DCHECK(task_runner_->BelongsToCurrentThread());
524 526
525 if (!usb_handle_.get()) { 527 if (!usb_handle_.get()) {
526 return; 528 return;
527 } 529 }
528 530
529 scoped_refptr<net::IOBuffer> buffer = 531 scoped_refptr<net::IOBuffer> buffer =
530 new net::IOBuffer(static_cast<size_t>(data_length)); 532 new net::IOBuffer(static_cast<size_t>(data_length));
531 usb_handle_->GenericTransfer( 533 usb_handle_->GenericTransfer(
532 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, data_length, 534 UsbTransferDirection::INBOUND, inbound_address_, buffer, data_length,
533 kUsbTimeout, 535 kUsbTimeout,
534 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), 536 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(),
535 base::Passed(&message), data_length, data_check)); 537 base::Passed(&message), data_length, data_check));
536 } 538 }
537 539
538 void AndroidUsbDevice::ParseBody(std::unique_ptr<AdbMessage> message, 540 void AndroidUsbDevice::ParseBody(std::unique_ptr<AdbMessage> message,
539 uint32_t data_length, 541 uint32_t data_length,
540 uint32_t data_check, 542 uint32_t data_check,
541 UsbTransferStatus status, 543 UsbTransferStatus status,
542 scoped_refptr<net::IOBuffer> buffer, 544 scoped_refptr<net::IOBuffer> buffer,
543 size_t result) { 545 size_t result) {
544 DCHECK(task_runner_->BelongsToCurrentThread()); 546 DCHECK(task_runner_->BelongsToCurrentThread());
545 547
546 if (status == device::USB_TRANSFER_TIMEOUT) { 548 if (status == UsbTransferStatus::TIMEOUT) {
547 task_runner_->PostTask( 549 task_runner_->PostTask(
548 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, 550 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this,
549 base::Passed(&message), data_length, data_check)); 551 base::Passed(&message), data_length, data_check));
550 return; 552 return;
551 } 553 }
552 554
553 if (status != device::USB_TRANSFER_COMPLETED || 555 if (status != UsbTransferStatus::COMPLETED ||
554 static_cast<uint32_t>(result) != data_length) { 556 static_cast<uint32_t>(result) != data_length) {
555 TransferError(status); 557 TransferError(status);
556 return; 558 return;
557 } 559 }
558 560
559 DumpMessage(false, buffer->data(), data_length); 561 DumpMessage(false, buffer->data(), data_length);
560 message->body = std::string(buffer->data(), result); 562 message->body = std::string(buffer->data(), result);
561 if (Checksum(message->body) != data_check) { 563 if (Checksum(message->body) != data_check) {
562 TransferError(device::USB_TRANSFER_ERROR); 564 TransferError(UsbTransferStatus::TRANSFER_ERROR);
563 return; 565 return;
564 } 566 }
565 567
566 task_runner_->PostTask(FROM_HERE, 568 task_runner_->PostTask(FROM_HERE,
567 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 569 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
568 base::Passed(&message))); 570 base::Passed(&message)));
569 } 571 }
570 572
571 void AndroidUsbDevice::HandleIncoming(std::unique_ptr<AdbMessage> message) { 573 void AndroidUsbDevice::HandleIncoming(std::unique_ptr<AdbMessage> message) {
572 DCHECK(task_runner_->BelongsToCurrentThread()); 574 DCHECK(task_runner_->BelongsToCurrentThread());
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 BrowserThread::PostTask( 664 BrowserThread::PostTask(
663 BrowserThread::UI, FROM_HERE, 665 BrowserThread::UI, FROM_HERE,
664 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); 666 base::Bind(&ReleaseInterface, usb_handle, interface_id_));
665 } 667 }
666 668
667 void AndroidUsbDevice::SocketDeleted(uint32_t socket_id) { 669 void AndroidUsbDevice::SocketDeleted(uint32_t socket_id) {
668 DCHECK(task_runner_->BelongsToCurrentThread()); 670 DCHECK(task_runner_->BelongsToCurrentThread());
669 671
670 sockets_.erase(socket_id); 672 sockets_.erase(socket_id);
671 } 673 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/usb/android_usb_browsertest.cc ('k') | device/usb/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698