| 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 |