| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/adb/android_usb_socket.h" | 5 #include "chrome/browser/devtools/adb/android_usb_socket.h" |
| 6 | 6 |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 AndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, | 27 AndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, |
| 28 uint32 socket_id, | 28 uint32 socket_id, |
| 29 const std::string& command, | 29 const std::string& command, |
| 30 base::Callback<void(uint32)> delete_callback) | 30 base::Callback<void(uint32)> delete_callback) |
| 31 : device_(device), | 31 : device_(device), |
| 32 command_(command), | 32 command_(command), |
| 33 delete_callback_(delete_callback), | 33 delete_callback_(delete_callback), |
| 34 local_id_(socket_id), | 34 local_id_(socket_id), |
| 35 remote_id_(0), | 35 remote_id_(0), |
| 36 is_connected_(false), | 36 is_connected_(false) { |
| 37 is_closed_(false) { | |
| 38 } | 37 } |
| 39 | 38 |
| 40 AndroidUsbSocket::~AndroidUsbSocket() { | 39 AndroidUsbSocket::~AndroidUsbSocket() { |
| 41 DCHECK(CalledOnValidThread()); | 40 DCHECK(CalledOnValidThread()); |
| 42 if (is_connected_) | 41 if (is_connected_) |
| 43 Disconnect(); | 42 Disconnect(); |
| 44 delete_callback_.Run(local_id_); | 43 if (!delete_callback_.is_null()) |
| 44 delete_callback_.Run(local_id_); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { | 47 void AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { |
| 48 if (!device_) |
| 49 return; |
| 50 |
| 48 CHECK_EQ(message->arg1, local_id_); | 51 CHECK_EQ(message->arg1, local_id_); |
| 49 switch (message->command) { | 52 switch (message->command) { |
| 50 case AdbMessage::kCommandOKAY: | 53 case AdbMessage::kCommandOKAY: |
| 51 if (!is_connected_) { | 54 if (!is_connected_) { |
| 52 remote_id_ = message->arg0; | 55 remote_id_ = message->arg0; |
| 53 is_connected_ = true; | 56 is_connected_ = true; |
| 54 net::CompletionCallback callback = connect_callback_; | 57 net::CompletionCallback callback = connect_callback_; |
| 55 connect_callback_.Reset(); | 58 connect_callback_.Reset(); |
| 56 callback.Run(net::OK); | 59 callback.Run(net::OK); |
| 57 // "this" can be NULL. | 60 // "this" can be NULL. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 72 callback.Run(net::OK); | 75 callback.Run(net::OK); |
| 73 // "this" can be NULL. | 76 // "this" can be NULL. |
| 74 } else { | 77 } else { |
| 75 RespondToReaders(false); | 78 RespondToReaders(false); |
| 76 // "this" can be NULL. | 79 // "this" can be NULL. |
| 77 } | 80 } |
| 78 break; | 81 break; |
| 79 case AdbMessage::kCommandCLSE: | 82 case AdbMessage::kCommandCLSE: |
| 80 if (is_connected_) | 83 if (is_connected_) |
| 81 device_->Send(AdbMessage::kCommandCLSE, local_id_, 0, ""); | 84 device_->Send(AdbMessage::kCommandCLSE, local_id_, 0, ""); |
| 82 is_connected_ = false; | 85 Terminated(); |
| 83 is_closed_ = true; | |
| 84 RespondToReaders(true); | |
| 85 // "this" can be NULL. | 86 // "this" can be NULL. |
| 86 break; | 87 break; |
| 87 default: | 88 default: |
| 88 break; | 89 break; |
| 89 } | 90 } |
| 90 } | 91 } |
| 91 | 92 |
| 92 void AndroidUsbSocket::Terminated() { | 93 void AndroidUsbSocket::Terminated() { |
| 93 is_connected_ = false; | 94 is_connected_ = false; |
| 94 is_closed_ = true; | 95 |
| 96 // Break the socket -> device connection, release the device. |
| 97 delete_callback_.Run(local_id_); |
| 98 delete_callback_.Reset(); |
| 99 device_ = NULL; |
| 100 |
| 101 // Respond to pending callbacks. |
| 95 if (!connect_callback_.is_null()) { | 102 if (!connect_callback_.is_null()) { |
| 96 net::CompletionCallback callback = connect_callback_; | 103 net::CompletionCallback callback = connect_callback_; |
| 97 connect_callback_.Reset(); | 104 connect_callback_.Reset(); |
| 98 callback.Run(net::ERR_FAILED); | 105 callback.Run(net::ERR_FAILED); |
| 99 // "this" can be NULL. | 106 // "this" can be NULL. |
| 100 return; | 107 return; |
| 101 } | 108 } |
| 102 RespondToReaders(true); | 109 RespondToReaders(true); |
| 103 } | 110 } |
| 104 | 111 |
| 105 int AndroidUsbSocket::Read(net::IOBuffer* buffer, | 112 int AndroidUsbSocket::Read(net::IOBuffer* buffer, |
| 106 int length, | 113 int length, |
| 107 const net::CompletionCallback& callback) { | 114 const net::CompletionCallback& callback) { |
| 108 if (!is_connected_) | 115 if (!is_connected_) |
| 109 return is_closed_ ? 0 : net::ERR_SOCKET_NOT_CONNECTED; | 116 return device_ ? net::ERR_SOCKET_NOT_CONNECTED : 0; |
| 110 | 117 |
| 111 if (read_buffer_.empty()) { | 118 if (read_buffer_.empty()) { |
| 112 read_requests_.push_back(IORequest(buffer, length, callback)); | 119 read_requests_.push_back(IORequest(buffer, length, callback)); |
| 113 return net::ERR_IO_PENDING; | 120 return net::ERR_IO_PENDING; |
| 114 } | 121 } |
| 115 | 122 |
| 116 size_t bytes_to_copy = static_cast<size_t>(length) > read_buffer_.length() ? | 123 size_t bytes_to_copy = static_cast<size_t>(length) > read_buffer_.length() ? |
| 117 read_buffer_.length() : static_cast<size_t>(length); | 124 read_buffer_.length() : static_cast<size_t>(length); |
| 118 memcpy(buffer->data(), read_buffer_.data(), bytes_to_copy); | 125 memcpy(buffer->data(), read_buffer_.data(), bytes_to_copy); |
| 119 if (read_buffer_.length() > bytes_to_copy) | 126 if (read_buffer_.length() > bytes_to_copy) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 142 return net::ERR_NOT_IMPLEMENTED; | 149 return net::ERR_NOT_IMPLEMENTED; |
| 143 } | 150 } |
| 144 | 151 |
| 145 int AndroidUsbSocket::SetSendBufferSize(int32 size) { | 152 int AndroidUsbSocket::SetSendBufferSize(int32 size) { |
| 146 NOTIMPLEMENTED(); | 153 NOTIMPLEMENTED(); |
| 147 return net::ERR_NOT_IMPLEMENTED; | 154 return net::ERR_NOT_IMPLEMENTED; |
| 148 } | 155 } |
| 149 | 156 |
| 150 int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { | 157 int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { |
| 151 DCHECK(CalledOnValidThread()); | 158 DCHECK(CalledOnValidThread()); |
| 152 if (device_->terminated()) | 159 if (!device_) |
| 153 return net::ERR_FAILED; | 160 return net::ERR_FAILED; |
| 154 connect_callback_ = callback; | 161 connect_callback_ = callback; |
| 155 device_->Send(AdbMessage::kCommandOPEN, local_id_, 0, command_); | 162 device_->Send(AdbMessage::kCommandOPEN, local_id_, 0, command_); |
| 156 return net::ERR_IO_PENDING; | 163 return net::ERR_IO_PENDING; |
| 157 } | 164 } |
| 158 | 165 |
| 159 void AndroidUsbSocket::Disconnect() { | 166 void AndroidUsbSocket::Disconnect() { |
| 160 is_connected_ = false; | 167 if (!device_) |
| 168 return; |
| 161 device_->Send(AdbMessage::kCommandCLSE, local_id_, remote_id_, ""); | 169 device_->Send(AdbMessage::kCommandCLSE, local_id_, remote_id_, ""); |
| 162 RespondToReaders(true); | 170 Terminated(); |
| 163 } | 171 } |
| 164 | 172 |
| 165 bool AndroidUsbSocket::IsConnected() const { | 173 bool AndroidUsbSocket::IsConnected() const { |
| 166 DCHECK(CalledOnValidThread()); | 174 DCHECK(CalledOnValidThread()); |
| 167 return is_connected_; | 175 return is_connected_; |
| 168 } | 176 } |
| 169 | 177 |
| 170 bool AndroidUsbSocket::IsConnectedAndIdle() const { | 178 bool AndroidUsbSocket::IsConnectedAndIdle() const { |
| 171 NOTIMPLEMENTED(); | 179 NOTIMPLEMENTED(); |
| 172 return false; | 180 return false; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 } | 245 } |
| 238 } | 246 } |
| 239 | 247 |
| 240 void AndroidUsbSocket::RespondToWriters() { | 248 void AndroidUsbSocket::RespondToWriters() { |
| 241 if (!write_requests_.empty()) { | 249 if (!write_requests_.empty()) { |
| 242 IORequest write_request = write_requests_.front(); | 250 IORequest write_request = write_requests_.front(); |
| 243 write_requests_.pop_front(); | 251 write_requests_.pop_front(); |
| 244 write_request.callback.Run(write_request.length); | 252 write_request.callback.Run(write_request.length); |
| 245 } | 253 } |
| 246 } | 254 } |
| OLD | NEW |