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