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 | 8 |
9 #include "base/barrier_closure.h" | 9 #include "base/barrier_closure.h" |
10 #include "base/base64.h" | 10 #include "base/base64.h" |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
17 #include "chrome/browser/devtools/device/usb/android_rsa.h" | 17 #include "chrome/browser/devtools/device/usb/android_rsa.h" |
18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" | 18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" |
19 #include "chrome/browser/usb/usb_device.h" | 19 #include "components/usb_service/usb_device.h" |
20 #include "chrome/browser/usb/usb_interface.h" | 20 #include "components/usb_service/usb_interface.h" |
21 #include "chrome/browser/usb/usb_service.h" | 21 #include "components/usb_service/usb_service.h" |
22 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
23 #include "crypto/rsa_private_key.h" | 23 #include "crypto/rsa_private_key.h" |
24 #include "net/base/ip_endpoint.h" | 24 #include "net/base/ip_endpoint.h" |
25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
26 #include "net/socket/stream_socket.h" | 26 #include "net/socket/stream_socket.h" |
27 | 27 |
| 28 using usb_service::UsbConfigDescriptor; |
| 29 using usb_service::UsbDevice; |
| 30 using usb_service::UsbDeviceHandle; |
| 31 using usb_service::UsbInterfaceAltSettingDescriptor; |
| 32 using usb_service::UsbInterfaceDescriptor; |
| 33 using usb_service::UsbEndpointDescriptor; |
| 34 using usb_service::UsbService; |
| 35 using usb_service::UsbTransferStatus; |
| 36 |
28 namespace { | 37 namespace { |
29 | 38 |
30 const size_t kHeaderSize = 24; | 39 const size_t kHeaderSize = 24; |
31 | 40 |
32 const int kAdbClass = 0xff; | 41 const int kAdbClass = 0xff; |
33 const int kAdbSubclass = 0x42; | 42 const int kAdbSubclass = 0x42; |
34 const int kAdbProtocol = 0x1; | 43 const int kAdbProtocol = 0x1; |
35 | 44 |
36 const int kUsbTimeout = 0; | 45 const int kUsbTimeout = 0; |
37 | 46 |
38 const uint32 kMaxPayload = 4096; | 47 const uint32 kMaxPayload = 4096; |
39 const uint32 kVersion = 0x01000000; | 48 const uint32 kVersion = 0x01000000; |
40 | 49 |
41 static const char kHostConnectMessage[] = "host::"; | 50 static const char kHostConnectMessage[] = "host::"; |
42 | 51 |
43 using content::BrowserThread; | 52 using content::BrowserThread; |
44 | 53 |
45 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices; | 54 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices; |
46 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet; | 55 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet; |
47 | 56 |
48 // Stores android wrappers around claimed usb devices on caller thread. | 57 // Stores android wrappers around claimed usb devices on caller thread. |
49 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices = | 58 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices = |
50 LAZY_INSTANCE_INITIALIZER; | 59 LAZY_INSTANCE_INITIALIZER; |
51 | 60 |
52 bool IsAndroidInterface( | 61 bool IsAndroidInterface( |
53 scoped_refptr<const UsbInterfaceDescriptor> interface) { | 62 scoped_refptr<const usb_service::UsbInterfaceDescriptor> interface) { |
54 if (interface->GetNumAltSettings() == 0) | 63 if (interface->GetNumAltSettings() == 0) |
55 return false; | 64 return false; |
56 | 65 |
57 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = | 66 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = |
58 interface->GetAltSetting(0); | 67 interface->GetAltSetting(0); |
59 | 68 |
60 if (idesc->GetInterfaceClass() != kAdbClass || | 69 if (idesc->GetInterfaceClass() != kAdbClass || |
61 idesc->GetInterfaceSubclass() != kAdbSubclass || | 70 idesc->GetInterfaceSubclass() != kAdbSubclass || |
62 idesc->GetInterfaceProtocol() != kAdbProtocol || | 71 idesc->GetInterfaceProtocol() != kAdbProtocol || |
63 idesc->GetNumEndpoints() != 2) { | 72 idesc->GetNumEndpoints() != 2) { |
(...skipping 10 matching lines...) Expand all Loading... |
74 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = | 83 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = |
75 interface->GetAltSetting(0); | 84 interface->GetAltSetting(0); |
76 | 85 |
77 int inbound_address = 0; | 86 int inbound_address = 0; |
78 int outbound_address = 0; | 87 int outbound_address = 0; |
79 int zero_mask = 0; | 88 int zero_mask = 0; |
80 | 89 |
81 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) { | 90 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) { |
82 scoped_refptr<const UsbEndpointDescriptor> edesc = | 91 scoped_refptr<const UsbEndpointDescriptor> edesc = |
83 idesc->GetEndpoint(i); | 92 idesc->GetEndpoint(i); |
84 if (edesc->GetTransferType() != USB_TRANSFER_BULK) | 93 if (edesc->GetTransferType() != usb_service::USB_TRANSFER_BULK) |
85 continue; | 94 continue; |
86 if (edesc->GetDirection() == USB_DIRECTION_INBOUND) | 95 if (edesc->GetDirection() == usb_service::USB_DIRECTION_INBOUND) |
87 inbound_address = edesc->GetAddress(); | 96 inbound_address = edesc->GetAddress(); |
88 else | 97 else |
89 outbound_address = edesc->GetAddress(); | 98 outbound_address = edesc->GetAddress(); |
90 zero_mask = edesc->GetMaximumPacketSize() - 1; | 99 zero_mask = edesc->GetMaximumPacketSize() - 1; |
91 } | 100 } |
92 | 101 |
93 if (inbound_address == 0 || outbound_address == 0) | 102 if (inbound_address == 0 || outbound_address == 0) |
94 return NULL; | 103 return NULL; |
95 | 104 |
96 if (!usb_handle->ClaimInterface(interface_id)) | 105 if (!usb_handle->ClaimInterface(interface_id)) |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 | 421 |
413 void AndroidUsbDevice::ProcessOutgoing() { | 422 void AndroidUsbDevice::ProcessOutgoing() { |
414 DCHECK(message_loop_ == base::MessageLoop::current()); | 423 DCHECK(message_loop_ == base::MessageLoop::current()); |
415 | 424 |
416 if (outgoing_queue_.empty() || !usb_handle_) | 425 if (outgoing_queue_.empty() || !usb_handle_) |
417 return; | 426 return; |
418 | 427 |
419 BulkMessage message = outgoing_queue_.front(); | 428 BulkMessage message = outgoing_queue_.front(); |
420 outgoing_queue_.pop(); | 429 outgoing_queue_.pop(); |
421 DumpMessage(true, message.first->data(), message.second); | 430 DumpMessage(true, message.first->data(), message.second); |
422 usb_handle_->BulkTransfer(USB_DIRECTION_OUTBOUND, outbound_address_, | 431 usb_handle_->BulkTransfer( |
| 432 usb_service::USB_DIRECTION_OUTBOUND, outbound_address_, |
423 message.first, message.second, kUsbTimeout, | 433 message.first, message.second, kUsbTimeout, |
424 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, | 434 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, |
425 weak_factory_.GetWeakPtr())); | 435 weak_factory_.GetWeakPtr())); |
426 } | 436 } |
427 | 437 |
428 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, | 438 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, |
429 scoped_refptr<net::IOBuffer> buffer, | 439 scoped_refptr<net::IOBuffer> buffer, |
430 size_t result) { | 440 size_t result) { |
431 DCHECK(message_loop_ == base::MessageLoop::current()); | 441 DCHECK(message_loop_ == base::MessageLoop::current()); |
432 | 442 |
433 if (status != USB_TRANSFER_COMPLETED) | 443 if (status != usb_service::USB_TRANSFER_COMPLETED) |
434 return; | 444 return; |
435 message_loop_->PostTask(FROM_HERE, | 445 message_loop_->PostTask(FROM_HERE, |
436 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); | 446 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); |
437 } | 447 } |
438 | 448 |
439 void AndroidUsbDevice::ReadHeader() { | 449 void AndroidUsbDevice::ReadHeader() { |
440 DCHECK(message_loop_ == base::MessageLoop::current()); | 450 DCHECK(message_loop_ == base::MessageLoop::current()); |
441 | 451 |
442 if (!usb_handle_) | 452 if (!usb_handle_) |
443 return; | 453 return; |
444 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); | 454 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); |
445 usb_handle_->BulkTransfer(USB_DIRECTION_INBOUND, inbound_address_, | 455 usb_handle_->BulkTransfer( |
| 456 usb_service::USB_DIRECTION_INBOUND, inbound_address_, |
446 buffer, kHeaderSize, kUsbTimeout, | 457 buffer, kHeaderSize, kUsbTimeout, |
447 base::Bind(&AndroidUsbDevice::ParseHeader, | 458 base::Bind(&AndroidUsbDevice::ParseHeader, |
448 weak_factory_.GetWeakPtr())); | 459 weak_factory_.GetWeakPtr())); |
449 } | 460 } |
450 | 461 |
451 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, | 462 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, |
452 scoped_refptr<net::IOBuffer> buffer, | 463 scoped_refptr<net::IOBuffer> buffer, |
453 size_t result) { | 464 size_t result) { |
454 DCHECK(message_loop_ == base::MessageLoop::current()); | 465 DCHECK(message_loop_ == base::MessageLoop::current()); |
455 | 466 |
456 if (status == USB_TRANSFER_TIMEOUT) { | 467 if (status == usb_service::USB_TRANSFER_TIMEOUT) { |
457 message_loop_->PostTask(FROM_HERE, | 468 message_loop_->PostTask(FROM_HERE, |
458 base::Bind(&AndroidUsbDevice::ReadHeader, this)); | 469 base::Bind(&AndroidUsbDevice::ReadHeader, this)); |
459 return; | 470 return; |
460 } | 471 } |
461 | 472 |
462 if (status != USB_TRANSFER_COMPLETED || result != kHeaderSize) { | 473 if (status != usb_service::USB_TRANSFER_COMPLETED || result != kHeaderSize) { |
463 TransferError(status); | 474 TransferError(status); |
464 return; | 475 return; |
465 } | 476 } |
466 | 477 |
467 DumpMessage(false, buffer->data(), result); | 478 DumpMessage(false, buffer->data(), result); |
468 std::vector<uint32> header(6); | 479 std::vector<uint32> header(6); |
469 memcpy(&header[0], buffer->data(), result); | 480 memcpy(&header[0], buffer->data(), result); |
470 scoped_refptr<AdbMessage> message = | 481 scoped_refptr<AdbMessage> message = |
471 new AdbMessage(header[0], header[1], header[2], ""); | 482 new AdbMessage(header[0], header[1], header[2], ""); |
472 uint32 data_length = header[3]; | 483 uint32 data_length = header[3]; |
473 uint32 data_check = header[4]; | 484 uint32 data_check = header[4]; |
474 uint32 magic = header[5]; | 485 uint32 magic = header[5]; |
475 if ((message->command ^ 0xffffffff) != magic) { | 486 if ((message->command ^ 0xffffffff) != magic) { |
476 TransferError(USB_TRANSFER_ERROR); | 487 TransferError(usb_service::USB_TRANSFER_ERROR); |
477 return; | 488 return; |
478 } | 489 } |
479 | 490 |
480 if (data_length == 0) { | 491 if (data_length == 0) { |
481 message_loop_->PostTask(FROM_HERE, | 492 message_loop_->PostTask(FROM_HERE, |
482 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 493 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
483 message)); | 494 message)); |
484 return; | 495 return; |
485 } | 496 } |
486 | 497 |
487 message_loop_->PostTask(FROM_HERE, | 498 message_loop_->PostTask(FROM_HERE, |
488 base::Bind(&AndroidUsbDevice::ReadBody, this, | 499 base::Bind(&AndroidUsbDevice::ReadBody, this, |
489 message, data_length, data_check)); | 500 message, data_length, data_check)); |
490 } | 501 } |
491 | 502 |
492 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message, | 503 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message, |
493 uint32 data_length, | 504 uint32 data_length, |
494 uint32 data_check) { | 505 uint32 data_check) { |
495 DCHECK(message_loop_ == base::MessageLoop::current()); | 506 DCHECK(message_loop_ == base::MessageLoop::current()); |
496 | 507 |
497 if (!usb_handle_) | 508 if (!usb_handle_) |
498 return; | 509 return; |
499 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); | 510 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); |
500 usb_handle_->BulkTransfer(USB_DIRECTION_INBOUND, inbound_address_, | 511 usb_handle_->BulkTransfer( |
| 512 usb_service::USB_DIRECTION_INBOUND, inbound_address_, |
501 buffer, data_length, kUsbTimeout, | 513 buffer, data_length, kUsbTimeout, |
502 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), | 514 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), |
503 message, data_length, data_check)); | 515 message, data_length, data_check)); |
504 } | 516 } |
505 | 517 |
506 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message, | 518 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message, |
507 uint32 data_length, | 519 uint32 data_length, |
508 uint32 data_check, | 520 uint32 data_check, |
509 UsbTransferStatus status, | 521 UsbTransferStatus status, |
510 scoped_refptr<net::IOBuffer> buffer, | 522 scoped_refptr<net::IOBuffer> buffer, |
511 size_t result) { | 523 size_t result) { |
512 DCHECK(message_loop_ == base::MessageLoop::current()); | 524 DCHECK(message_loop_ == base::MessageLoop::current()); |
513 | 525 |
514 if (status == USB_TRANSFER_TIMEOUT) { | 526 if (status == usb_service::USB_TRANSFER_TIMEOUT) { |
515 message_loop_->PostTask(FROM_HERE, | 527 message_loop_->PostTask(FROM_HERE, |
516 base::Bind(&AndroidUsbDevice::ReadBody, this, | 528 base::Bind(&AndroidUsbDevice::ReadBody, this, |
517 message, data_length, data_check)); | 529 message, data_length, data_check)); |
518 return; | 530 return; |
519 } | 531 } |
520 | 532 |
521 if (status != USB_TRANSFER_COMPLETED || | 533 if (status != usb_service::USB_TRANSFER_COMPLETED || |
522 static_cast<uint32>(result) != data_length) { | 534 static_cast<uint32>(result) != data_length) { |
523 TransferError(status); | 535 TransferError(status); |
524 return; | 536 return; |
525 } | 537 } |
526 | 538 |
527 DumpMessage(false, buffer->data(), data_length); | 539 DumpMessage(false, buffer->data(), data_length); |
528 message->body = std::string(buffer->data(), result); | 540 message->body = std::string(buffer->data(), result); |
529 if (Checksum(message->body) != data_check) { | 541 if (Checksum(message->body) != data_check) { |
530 TransferError(USB_TRANSFER_ERROR); | 542 TransferError(usb_service::USB_TRANSFER_ERROR); |
531 return; | 543 return; |
532 } | 544 } |
533 | 545 |
534 message_loop_->PostTask(FROM_HERE, | 546 message_loop_->PostTask(FROM_HERE, |
535 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 547 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
536 message)); | 548 message)); |
537 } | 549 } |
538 | 550 |
539 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) { | 551 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) { |
540 DCHECK(message_loop_ == base::MessageLoop::current()); | 552 DCHECK(message_loop_ == base::MessageLoop::current()); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 BrowserThread::PostTask( | 643 BrowserThread::PostTask( |
632 BrowserThread::FILE, FROM_HERE, | 644 BrowserThread::FILE, FROM_HERE, |
633 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); | 645 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); |
634 } | 646 } |
635 | 647 |
636 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { | 648 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { |
637 DCHECK(message_loop_ == base::MessageLoop::current()); | 649 DCHECK(message_loop_ == base::MessageLoop::current()); |
638 | 650 |
639 sockets_.erase(socket_id); | 651 sockets_.erase(socket_id); |
640 } | 652 } |
OLD | NEW |