OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |