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" |
(...skipping 27 matching lines...) Expand all Loading... |
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_t kMaxPayload = 4096; |
49 const uint32 kVersion = 0x01000000; | 49 const uint32_t 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 = |
(...skipping 21 matching lines...) Expand all Loading... |
81 ++device_count; | 81 ++device_count; |
82 } | 82 } |
83 } | 83 } |
84 } | 84 } |
85 } | 85 } |
86 | 86 |
87 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 87 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
88 base::Bind(callback, device_count)); | 88 base::Bind(callback, device_count)); |
89 } | 89 } |
90 | 90 |
91 uint32 Checksum(const std::string& data) { | 91 uint32_t Checksum(const std::string& data) { |
92 unsigned char* x = (unsigned char*)data.data(); | 92 unsigned char* x = (unsigned char*)data.data(); |
93 int count = data.length(); | 93 int count = data.length(); |
94 uint32 sum = 0; | 94 uint32_t sum = 0; |
95 while (count-- > 0) | 95 while (count-- > 0) |
96 sum += *x++; | 96 sum += *x++; |
97 return sum; | 97 return sum; |
98 } | 98 } |
99 | 99 |
100 void DumpMessage(bool outgoing, const char* data, size_t length) { | 100 void DumpMessage(bool outgoing, const char* data, size_t length) { |
101 #if 0 | 101 #if 0 |
102 std::string result = ""; | 102 std::string result = ""; |
103 if (length == kHeaderSize) { | 103 if (length == kHeaderSize) { |
104 for (size_t i = 0; i < 24; ++i) { | 104 for (size_t i = 0; i < 24; ++i) { |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 caller_task_runner->PostTask(FROM_HERE, | 283 caller_task_runner->PostTask(FROM_HERE, |
284 base::Bind(callback, AndroidUsbDevices())); | 284 base::Bind(callback, AndroidUsbDevices())); |
285 } else { | 285 } else { |
286 service->GetDevices( | 286 service->GetDevices( |
287 base::Bind(&OpenAndroidDevices, rsa_key, callback, caller_task_runner)); | 287 base::Bind(&OpenAndroidDevices, rsa_key, callback, caller_task_runner)); |
288 } | 288 } |
289 } | 289 } |
290 | 290 |
291 } // namespace | 291 } // namespace |
292 | 292 |
293 AdbMessage::AdbMessage(uint32 command, | 293 AdbMessage::AdbMessage(uint32_t command, |
294 uint32 arg0, | 294 uint32_t arg0, |
295 uint32 arg1, | 295 uint32_t arg1, |
296 const std::string& body) | 296 const std::string& body) |
297 : command(command), arg0(arg0), arg1(arg1), body(body) { | 297 : command(command), arg0(arg0), arg1(arg1), body(body) {} |
298 } | |
299 | 298 |
300 AdbMessage::~AdbMessage() { | 299 AdbMessage::~AdbMessage() { |
301 } | 300 } |
302 | 301 |
303 // static | 302 // static |
304 void AndroidUsbDevice::CountDevices(const base::Callback<void(int)>& callback) { | 303 void AndroidUsbDevice::CountDevices(const base::Callback<void(int)>& callback) { |
305 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 304 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
306 if (service != NULL) { | 305 if (service != NULL) { |
307 service->GetDevices(base::Bind(&CountAndroidDevices, callback)); | 306 service->GetDevices(base::Bind(&CountAndroidDevices, callback)); |
308 } else { | 307 } else { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 354 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
356 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion, | 355 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion, |
357 kMaxPayload, kHostConnectMessage))); | 356 kMaxPayload, kHostConnectMessage))); |
358 ReadHeader(); | 357 ReadHeader(); |
359 } | 358 } |
360 | 359 |
361 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) { | 360 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) { |
362 if (!usb_handle_.get()) | 361 if (!usb_handle_.get()) |
363 return NULL; | 362 return NULL; |
364 | 363 |
365 uint32 socket_id = ++last_socket_id_; | 364 uint32_t socket_id = ++last_socket_id_; |
366 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command, | 365 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command, |
367 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id)); | 366 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id)); |
368 return sockets_[socket_id]; | 367 return sockets_[socket_id]; |
369 } | 368 } |
370 | 369 |
371 void AndroidUsbDevice::Send(uint32 command, | 370 void AndroidUsbDevice::Send(uint32_t command, |
372 uint32 arg0, | 371 uint32_t arg0, |
373 uint32 arg1, | 372 uint32_t arg1, |
374 const std::string& body) { | 373 const std::string& body) { |
375 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body)); | 374 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body)); |
376 // Delay open request if not yet connected. | 375 // Delay open request if not yet connected. |
377 if (!is_connected_) { | 376 if (!is_connected_) { |
378 pending_messages_.push_back(message.release()); | 377 pending_messages_.push_back(message.release()); |
379 return; | 378 return; |
380 } | 379 } |
381 Queue(message.Pass()); | 380 Queue(message.Pass()); |
382 } | 381 } |
383 | 382 |
384 AndroidUsbDevice::~AndroidUsbDevice() { | 383 AndroidUsbDevice::~AndroidUsbDevice() { |
385 DCHECK(task_runner_->BelongsToCurrentThread()); | 384 DCHECK(task_runner_->BelongsToCurrentThread()); |
386 Terminate(); | 385 Terminate(); |
387 } | 386 } |
388 | 387 |
389 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) { | 388 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) { |
390 DCHECK(task_runner_->BelongsToCurrentThread()); | 389 DCHECK(task_runner_->BelongsToCurrentThread()); |
391 | 390 |
392 // Queue header. | 391 // Queue header. |
393 std::vector<uint32> header; | 392 std::vector<uint32_t> header; |
394 header.push_back(message->command); | 393 header.push_back(message->command); |
395 header.push_back(message->arg0); | 394 header.push_back(message->arg0); |
396 header.push_back(message->arg1); | 395 header.push_back(message->arg1); |
397 bool append_zero = true; | 396 bool append_zero = true; |
398 if (message->body.empty()) | 397 if (message->body.empty()) |
399 append_zero = false; | 398 append_zero = false; |
400 if (message->command == AdbMessage::kCommandAUTH && | 399 if (message->command == AdbMessage::kCommandAUTH && |
401 message->arg0 == AdbMessage::kAuthSignature) | 400 message->arg0 == AdbMessage::kAuthSignature) |
402 append_zero = false; | 401 append_zero = false; |
403 if (message->command == AdbMessage::kCommandWRTE) | 402 if (message->command == AdbMessage::kCommandWRTE) |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 base::Bind(&AndroidUsbDevice::ReadHeader, this)); | 479 base::Bind(&AndroidUsbDevice::ReadHeader, this)); |
481 return; | 480 return; |
482 } | 481 } |
483 | 482 |
484 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) { | 483 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) { |
485 TransferError(status); | 484 TransferError(status); |
486 return; | 485 return; |
487 } | 486 } |
488 | 487 |
489 DumpMessage(false, buffer->data(), result); | 488 DumpMessage(false, buffer->data(), result); |
490 std::vector<uint32> header(6); | 489 std::vector<uint32_t> header(6); |
491 memcpy(&header[0], buffer->data(), result); | 490 memcpy(&header[0], buffer->data(), result); |
492 scoped_ptr<AdbMessage> message( | 491 scoped_ptr<AdbMessage> message( |
493 new AdbMessage(header[0], header[1], header[2], "")); | 492 new AdbMessage(header[0], header[1], header[2], "")); |
494 uint32 data_length = header[3]; | 493 uint32_t data_length = header[3]; |
495 uint32 data_check = header[4]; | 494 uint32_t data_check = header[4]; |
496 uint32 magic = header[5]; | 495 uint32_t magic = header[5]; |
497 if ((message->command ^ 0xffffffff) != magic) { | 496 if ((message->command ^ 0xffffffff) != magic) { |
498 TransferError(device::USB_TRANSFER_ERROR); | 497 TransferError(device::USB_TRANSFER_ERROR); |
499 return; | 498 return; |
500 } | 499 } |
501 | 500 |
502 if (data_length == 0) { | 501 if (data_length == 0) { |
503 task_runner_->PostTask(FROM_HERE, | 502 task_runner_->PostTask(FROM_HERE, |
504 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 503 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
505 base::Passed(&message))); | 504 base::Passed(&message))); |
506 } else { | 505 } else { |
507 task_runner_->PostTask( | 506 task_runner_->PostTask( |
508 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, | 507 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, |
509 base::Passed(&message), data_length, data_check)); | 508 base::Passed(&message), data_length, data_check)); |
510 } | 509 } |
511 } | 510 } |
512 | 511 |
513 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message, | 512 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message, |
514 uint32 data_length, | 513 uint32_t data_length, |
515 uint32 data_check) { | 514 uint32_t data_check) { |
516 DCHECK(task_runner_->BelongsToCurrentThread()); | 515 DCHECK(task_runner_->BelongsToCurrentThread()); |
517 | 516 |
518 if (!usb_handle_.get()) { | 517 if (!usb_handle_.get()) { |
519 return; | 518 return; |
520 } | 519 } |
521 | 520 |
522 scoped_refptr<net::IOBuffer> buffer = | 521 scoped_refptr<net::IOBuffer> buffer = |
523 new net::IOBuffer(static_cast<size_t>(data_length)); | 522 new net::IOBuffer(static_cast<size_t>(data_length)); |
524 usb_handle_->GenericTransfer( | 523 usb_handle_->GenericTransfer( |
525 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, data_length, | 524 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, data_length, |
526 kUsbTimeout, | 525 kUsbTimeout, |
527 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), | 526 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), |
528 base::Passed(&message), data_length, data_check)); | 527 base::Passed(&message), data_length, data_check)); |
529 } | 528 } |
530 | 529 |
531 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message, | 530 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message, |
532 uint32 data_length, | 531 uint32_t data_length, |
533 uint32 data_check, | 532 uint32_t data_check, |
534 UsbTransferStatus status, | 533 UsbTransferStatus status, |
535 scoped_refptr<net::IOBuffer> buffer, | 534 scoped_refptr<net::IOBuffer> buffer, |
536 size_t result) { | 535 size_t result) { |
537 DCHECK(task_runner_->BelongsToCurrentThread()); | 536 DCHECK(task_runner_->BelongsToCurrentThread()); |
538 | 537 |
539 if (status == device::USB_TRANSFER_TIMEOUT) { | 538 if (status == device::USB_TRANSFER_TIMEOUT) { |
540 task_runner_->PostTask( | 539 task_runner_->PostTask( |
541 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, | 540 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this, |
542 base::Passed(&message), data_length, data_check)); | 541 base::Passed(&message), data_length, data_check)); |
543 return; | 542 return; |
544 } | 543 } |
545 | 544 |
546 if (status != device::USB_TRANSFER_COMPLETED || | 545 if (status != device::USB_TRANSFER_COMPLETED || |
547 static_cast<uint32>(result) != data_length) { | 546 static_cast<uint32_t>(result) != data_length) { |
548 TransferError(status); | 547 TransferError(status); |
549 return; | 548 return; |
550 } | 549 } |
551 | 550 |
552 DumpMessage(false, buffer->data(), data_length); | 551 DumpMessage(false, buffer->data(), data_length); |
553 message->body = std::string(buffer->data(), result); | 552 message->body = std::string(buffer->data(), result); |
554 if (Checksum(message->body) != data_check) { | 553 if (Checksum(message->body) != data_check) { |
555 TransferError(device::USB_TRANSFER_ERROR); | 554 TransferError(device::USB_TRANSFER_ERROR); |
556 return; | 555 return; |
557 } | 556 } |
558 | 557 |
559 task_runner_->PostTask(FROM_HERE, | 558 task_runner_->PostTask(FROM_HERE, |
560 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 559 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
561 base::Passed(&message))); | 560 base::Passed(&message))); |
562 } | 561 } |
563 | 562 |
564 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) { | 563 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) { |
565 DCHECK(task_runner_->BelongsToCurrentThread()); | 564 DCHECK(task_runner_->BelongsToCurrentThread()); |
566 | 565 |
567 switch (message->command) { | 566 switch (message->command) { |
568 case AdbMessage::kCommandAUTH: | 567 case AdbMessage::kCommandAUTH: |
569 { | 568 { |
570 DCHECK_EQ(message->arg0, static_cast<uint32>(AdbMessage::kAuthToken)); | 569 DCHECK_EQ(message->arg0, static_cast<uint32_t>(AdbMessage::kAuthToken)); |
571 if (signature_sent_) { | 570 if (signature_sent_) { |
572 Queue(make_scoped_ptr(new AdbMessage( | 571 Queue(make_scoped_ptr(new AdbMessage( |
573 AdbMessage::kCommandAUTH, | 572 AdbMessage::kCommandAUTH, |
574 AdbMessage::kAuthRSAPublicKey, 0, | 573 AdbMessage::kAuthRSAPublicKey, 0, |
575 AndroidRSAPublicKey(rsa_key_.get())))); | 574 AndroidRSAPublicKey(rsa_key_.get())))); |
576 } else { | 575 } else { |
577 signature_sent_ = true; | 576 signature_sent_ = true; |
578 std::string signature = AndroidRSASign(rsa_key_.get(), message->body); | 577 std::string signature = AndroidRSASign(rsa_key_.get(), message->body); |
579 if (!signature.empty()) { | 578 if (!signature.empty()) { |
580 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandAUTH, | 579 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandAUTH, |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 it != sockets.end(); ++it) { | 653 it != sockets.end(); ++it) { |
655 it->second->Terminated(true); | 654 it->second->Terminated(true); |
656 } | 655 } |
657 DCHECK(sockets_.empty()); | 656 DCHECK(sockets_.empty()); |
658 | 657 |
659 BrowserThread::PostTask( | 658 BrowserThread::PostTask( |
660 BrowserThread::UI, FROM_HERE, | 659 BrowserThread::UI, FROM_HERE, |
661 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); | 660 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); |
662 } | 661 } |
663 | 662 |
664 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { | 663 void AndroidUsbDevice::SocketDeleted(uint32_t socket_id) { |
665 DCHECK(task_runner_->BelongsToCurrentThread()); | 664 DCHECK(task_runner_->BelongsToCurrentThread()); |
666 | 665 |
667 sockets_.erase(socket_id); | 666 sockets_.erase(socket_id); |
668 } | 667 } |
OLD | NEW |