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

Side by Side Diff: chrome/browser/devtools/device/usb/android_usb_device.cc

Issue 497363004: Merge components/usb_service into device/usb. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 6 years, 3 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_device.h ('k') | chrome/chrome_browser.gypi » ('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 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 "components/usb_service/usb_device.h"
20 #include "components/usb_service/usb_interface.h"
21 #include "components/usb_service/usb_service.h"
22 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
23 #include "crypto/rsa_private_key.h" 20 #include "crypto/rsa_private_key.h"
24 #include "device/core/device_client.h" 21 #include "device/core/device_client.h"
22 #include "device/usb/usb_device.h"
23 #include "device/usb/usb_interface.h"
24 #include "device/usb/usb_service.h"
25 #include "net/base/ip_endpoint.h" 25 #include "net/base/ip_endpoint.h"
26 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
27 #include "net/socket/stream_socket.h" 27 #include "net/socket/stream_socket.h"
28 28
29 using usb_service::UsbConfigDescriptor; 29 using device::UsbConfigDescriptor;
30 using usb_service::UsbDevice; 30 using device::UsbDevice;
31 using usb_service::UsbDeviceHandle; 31 using device::UsbDeviceHandle;
32 using usb_service::UsbInterfaceAltSettingDescriptor; 32 using device::UsbInterfaceAltSettingDescriptor;
33 using usb_service::UsbInterfaceDescriptor; 33 using device::UsbInterfaceDescriptor;
34 using usb_service::UsbEndpointDescriptor; 34 using device::UsbEndpointDescriptor;
35 using usb_service::UsbService; 35 using device::UsbService;
36 using usb_service::UsbTransferStatus; 36 using device::UsbTransferStatus;
37 37
38 namespace { 38 namespace {
39 39
40 const size_t kHeaderSize = 24; 40 const size_t kHeaderSize = 24;
41 41
42 const int kAdbClass = 0xff; 42 const int kAdbClass = 0xff;
43 const int kAdbSubclass = 0x42; 43 const int kAdbSubclass = 0x42;
44 const int kAdbProtocol = 0x1; 44 const int kAdbProtocol = 0x1;
45 45
46 const int kUsbTimeout = 0; 46 const int kUsbTimeout = 0;
47 47
48 const uint32 kMaxPayload = 4096; 48 const uint32 kMaxPayload = 4096;
49 const uint32 kVersion = 0x01000000; 49 const uint32 kVersion = 0x01000000;
50 50
51 static const char kHostConnectMessage[] = "host::"; 51 static const char kHostConnectMessage[] = "host::";
52 52
53 using content::BrowserThread; 53 using content::BrowserThread;
54 54
55 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices; 55 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices;
56 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet; 56 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet;
57 57
58 // Stores android wrappers around claimed usb devices on caller thread. 58 // Stores android wrappers around claimed usb devices on caller thread.
59 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices = 59 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices =
60 LAZY_INSTANCE_INITIALIZER; 60 LAZY_INSTANCE_INITIALIZER;
61 61
62 bool IsAndroidInterface( 62 bool IsAndroidInterface(scoped_refptr<const UsbInterfaceDescriptor> interface) {
63 scoped_refptr<const usb_service::UsbInterfaceDescriptor> interface) {
64 if (interface->GetNumAltSettings() == 0) 63 if (interface->GetNumAltSettings() == 0)
65 return false; 64 return false;
66 65
67 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = 66 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc =
68 interface->GetAltSetting(0); 67 interface->GetAltSetting(0);
69 68
70 if (idesc->GetInterfaceClass() != kAdbClass || 69 if (idesc->GetInterfaceClass() != kAdbClass ||
71 idesc->GetInterfaceSubclass() != kAdbSubclass || 70 idesc->GetInterfaceSubclass() != kAdbSubclass ||
72 idesc->GetInterfaceProtocol() != kAdbProtocol || 71 idesc->GetInterfaceProtocol() != kAdbProtocol ||
73 idesc->GetNumEndpoints() != 2) { 72 idesc->GetNumEndpoints() != 2) {
(...skipping 10 matching lines...) Expand all
84 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = 83 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc =
85 interface->GetAltSetting(0); 84 interface->GetAltSetting(0);
86 85
87 int inbound_address = 0; 86 int inbound_address = 0;
88 int outbound_address = 0; 87 int outbound_address = 0;
89 int zero_mask = 0; 88 int zero_mask = 0;
90 89
91 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) { 90 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) {
92 scoped_refptr<const UsbEndpointDescriptor> edesc = 91 scoped_refptr<const UsbEndpointDescriptor> edesc =
93 idesc->GetEndpoint(i); 92 idesc->GetEndpoint(i);
94 if (edesc->GetTransferType() != usb_service::USB_TRANSFER_BULK) 93 if (edesc->GetTransferType() != device::USB_TRANSFER_BULK)
95 continue; 94 continue;
96 if (edesc->GetDirection() == usb_service::USB_DIRECTION_INBOUND) 95 if (edesc->GetDirection() == device::USB_DIRECTION_INBOUND)
97 inbound_address = edesc->GetAddress(); 96 inbound_address = edesc->GetAddress();
98 else 97 else
99 outbound_address = edesc->GetAddress(); 98 outbound_address = edesc->GetAddress();
100 zero_mask = edesc->GetMaximumPacketSize() - 1; 99 zero_mask = edesc->GetMaximumPacketSize() - 1;
101 } 100 }
102 101
103 if (inbound_address == 0 || outbound_address == 0) 102 if (inbound_address == 0 || outbound_address == 0)
104 return NULL; 103 return NULL;
105 104
106 if (!usb_handle->ClaimInterface(interface_id)) 105 if (!usb_handle->ClaimInterface(interface_id))
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 423
425 void AndroidUsbDevice::ProcessOutgoing() { 424 void AndroidUsbDevice::ProcessOutgoing() {
426 DCHECK(message_loop_ == base::MessageLoop::current()); 425 DCHECK(message_loop_ == base::MessageLoop::current());
427 426
428 if (outgoing_queue_.empty() || !usb_handle_.get()) 427 if (outgoing_queue_.empty() || !usb_handle_.get())
429 return; 428 return;
430 429
431 BulkMessage message = outgoing_queue_.front(); 430 BulkMessage message = outgoing_queue_.front();
432 outgoing_queue_.pop(); 431 outgoing_queue_.pop();
433 DumpMessage(true, message->data(), message->size()); 432 DumpMessage(true, message->data(), message->size());
434 usb_handle_->BulkTransfer(usb_service::USB_DIRECTION_OUTBOUND, 433 usb_handle_->BulkTransfer(device::USB_DIRECTION_OUTBOUND,
435 outbound_address_, 434 outbound_address_,
436 message.get(), 435 message.get(),
437 message->size(), 436 message->size(),
438 kUsbTimeout, 437 kUsbTimeout,
439 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, 438 base::Bind(&AndroidUsbDevice::OutgoingMessageSent,
440 weak_factory_.GetWeakPtr())); 439 weak_factory_.GetWeakPtr()));
441 } 440 }
442 441
443 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, 442 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status,
444 scoped_refptr<net::IOBuffer> buffer, 443 scoped_refptr<net::IOBuffer> buffer,
445 size_t result) { 444 size_t result) {
446 DCHECK(message_loop_ == base::MessageLoop::current()); 445 DCHECK(message_loop_ == base::MessageLoop::current());
447 446
448 if (status != usb_service::USB_TRANSFER_COMPLETED) 447 if (status != device::USB_TRANSFER_COMPLETED)
449 return; 448 return;
450 message_loop_->PostTask(FROM_HERE, 449 message_loop_->PostTask(FROM_HERE,
451 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); 450 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this));
452 } 451 }
453 452
454 void AndroidUsbDevice::ReadHeader() { 453 void AndroidUsbDevice::ReadHeader() {
455 DCHECK(message_loop_ == base::MessageLoop::current()); 454 DCHECK(message_loop_ == base::MessageLoop::current());
456 455
457 if (!usb_handle_.get()) 456 if (!usb_handle_.get())
458 return; 457 return;
459 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); 458 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize);
460 usb_handle_->BulkTransfer( 459 usb_handle_->BulkTransfer(
461 usb_service::USB_DIRECTION_INBOUND, 460 device::USB_DIRECTION_INBOUND,
462 inbound_address_, 461 inbound_address_,
463 buffer.get(), 462 buffer.get(),
464 kHeaderSize, 463 kHeaderSize,
465 kUsbTimeout, 464 kUsbTimeout,
466 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr())); 465 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr()));
467 } 466 }
468 467
469 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, 468 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status,
470 scoped_refptr<net::IOBuffer> buffer, 469 scoped_refptr<net::IOBuffer> buffer,
471 size_t result) { 470 size_t result) {
472 DCHECK(message_loop_ == base::MessageLoop::current()); 471 DCHECK(message_loop_ == base::MessageLoop::current());
473 472
474 if (status == usb_service::USB_TRANSFER_TIMEOUT) { 473 if (status == device::USB_TRANSFER_TIMEOUT) {
475 message_loop_->PostTask(FROM_HERE, 474 message_loop_->PostTask(FROM_HERE,
476 base::Bind(&AndroidUsbDevice::ReadHeader, this)); 475 base::Bind(&AndroidUsbDevice::ReadHeader, this));
477 return; 476 return;
478 } 477 }
479 478
480 if (status != usb_service::USB_TRANSFER_COMPLETED || result != kHeaderSize) { 479 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) {
481 TransferError(status); 480 TransferError(status);
482 return; 481 return;
483 } 482 }
484 483
485 DumpMessage(false, buffer->data(), result); 484 DumpMessage(false, buffer->data(), result);
486 std::vector<uint32> header(6); 485 std::vector<uint32> header(6);
487 memcpy(&header[0], buffer->data(), result); 486 memcpy(&header[0], buffer->data(), result);
488 scoped_refptr<AdbMessage> message = 487 scoped_refptr<AdbMessage> message =
489 new AdbMessage(header[0], header[1], header[2], ""); 488 new AdbMessage(header[0], header[1], header[2], "");
490 uint32 data_length = header[3]; 489 uint32 data_length = header[3];
491 uint32 data_check = header[4]; 490 uint32 data_check = header[4];
492 uint32 magic = header[5]; 491 uint32 magic = header[5];
493 if ((message->command ^ 0xffffffff) != magic) { 492 if ((message->command ^ 0xffffffff) != magic) {
494 TransferError(usb_service::USB_TRANSFER_ERROR); 493 TransferError(device::USB_TRANSFER_ERROR);
495 return; 494 return;
496 } 495 }
497 496
498 if (data_length == 0) { 497 if (data_length == 0) {
499 message_loop_->PostTask(FROM_HERE, 498 message_loop_->PostTask(FROM_HERE,
500 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 499 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
501 message)); 500 message));
502 return; 501 return;
503 } 502 }
504 503
505 message_loop_->PostTask(FROM_HERE, 504 message_loop_->PostTask(FROM_HERE,
506 base::Bind(&AndroidUsbDevice::ReadBody, this, 505 base::Bind(&AndroidUsbDevice::ReadBody, this,
507 message, data_length, data_check)); 506 message, data_length, data_check));
508 } 507 }
509 508
510 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message, 509 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message,
511 uint32 data_length, 510 uint32 data_length,
512 uint32 data_check) { 511 uint32 data_check) {
513 DCHECK(message_loop_ == base::MessageLoop::current()); 512 DCHECK(message_loop_ == base::MessageLoop::current());
514 513
515 if (!usb_handle_.get()) 514 if (!usb_handle_.get())
516 return; 515 return;
517 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); 516 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length);
518 usb_handle_->BulkTransfer(usb_service::USB_DIRECTION_INBOUND, 517 usb_handle_->BulkTransfer(device::USB_DIRECTION_INBOUND,
519 inbound_address_, 518 inbound_address_,
520 buffer.get(), 519 buffer.get(),
521 data_length, 520 data_length,
522 kUsbTimeout, 521 kUsbTimeout,
523 base::Bind(&AndroidUsbDevice::ParseBody, 522 base::Bind(&AndroidUsbDevice::ParseBody,
524 weak_factory_.GetWeakPtr(), 523 weak_factory_.GetWeakPtr(),
525 message, 524 message,
526 data_length, 525 data_length,
527 data_check)); 526 data_check));
528 } 527 }
529 528
530 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message, 529 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message,
531 uint32 data_length, 530 uint32 data_length,
532 uint32 data_check, 531 uint32 data_check,
533 UsbTransferStatus status, 532 UsbTransferStatus status,
534 scoped_refptr<net::IOBuffer> buffer, 533 scoped_refptr<net::IOBuffer> buffer,
535 size_t result) { 534 size_t result) {
536 DCHECK(message_loop_ == base::MessageLoop::current()); 535 DCHECK(message_loop_ == base::MessageLoop::current());
537 536
538 if (status == usb_service::USB_TRANSFER_TIMEOUT) { 537 if (status == device::USB_TRANSFER_TIMEOUT) {
539 message_loop_->PostTask(FROM_HERE, 538 message_loop_->PostTask(FROM_HERE,
540 base::Bind(&AndroidUsbDevice::ReadBody, this, 539 base::Bind(&AndroidUsbDevice::ReadBody, this,
541 message, data_length, data_check)); 540 message, data_length, data_check));
542 return; 541 return;
543 } 542 }
544 543
545 if (status != usb_service::USB_TRANSFER_COMPLETED || 544 if (status != device::USB_TRANSFER_COMPLETED ||
546 static_cast<uint32>(result) != data_length) { 545 static_cast<uint32>(result) != data_length) {
547 TransferError(status); 546 TransferError(status);
548 return; 547 return;
549 } 548 }
550 549
551 DumpMessage(false, buffer->data(), data_length); 550 DumpMessage(false, buffer->data(), data_length);
552 message->body = std::string(buffer->data(), result); 551 message->body = std::string(buffer->data(), result);
553 if (Checksum(message->body) != data_check) { 552 if (Checksum(message->body) != data_check) {
554 TransferError(usb_service::USB_TRANSFER_ERROR); 553 TransferError(device::USB_TRANSFER_ERROR);
555 return; 554 return;
556 } 555 }
557 556
558 message_loop_->PostTask(FROM_HERE, 557 message_loop_->PostTask(FROM_HERE,
559 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 558 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
560 message)); 559 message));
561 } 560 }
562 561
563 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) { 562 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) {
564 DCHECK(message_loop_ == base::MessageLoop::current()); 563 DCHECK(message_loop_ == base::MessageLoop::current());
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 BrowserThread::PostTask( 654 BrowserThread::PostTask(
656 BrowserThread::FILE, FROM_HERE, 655 BrowserThread::FILE, FROM_HERE,
657 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); 656 base::Bind(&ReleaseInterface, usb_handle, interface_id_));
658 } 657 }
659 658
660 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { 659 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) {
661 DCHECK(message_loop_ == base::MessageLoop::current()); 660 DCHECK(message_loop_ == base::MessageLoop::current());
662 661
663 sockets_.erase(socket_id); 662 sockets_.erase(socket_id);
664 } 663 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/usb/android_usb_device.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698