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

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

Issue 236203019: Move UsbService to its own component. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move usb_service component symbols into usb_service namespace Created 6 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 | Annotate | Revision Log
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 "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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/usb/android_usb_device.h ('k') | chrome/browser/extensions/api/usb/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698