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 |