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

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

Issue 980023002: Move device/usb classes from the FILE thread to UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add more thread assertions. Created 5 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
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/single_thread_task_runner.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 "base/thread_task_runner_handle.h"
17 #include "chrome/browser/devtools/device/usb/android_rsa.h" 18 #include "chrome/browser/devtools/device/usb/android_rsa.h"
18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" 19 #include "chrome/browser/devtools/device/usb/android_usb_socket.h"
19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
20 #include "crypto/rsa_private_key.h" 21 #include "crypto/rsa_private_key.h"
21 #include "device/core/device_client.h" 22 #include "device/core/device_client.h"
22 #include "device/usb/usb_descriptors.h" 23 #include "device/usb/usb_descriptors.h"
23 #include "device/usb/usb_device.h" 24 #include "device/usb/usb_device.h"
24 #include "device/usb/usb_service.h" 25 #include "device/usb/usb_service.h"
25 #include "net/base/ip_endpoint.h" 26 #include "net/base/ip_endpoint.h"
26 #include "net/base/net_errors.h" 27 #include "net/base/net_errors.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 if (interface.alternate_setting != 0 || 63 if (interface.alternate_setting != 0 ||
63 interface.interface_class != kAdbClass || 64 interface.interface_class != kAdbClass ||
64 interface.interface_subclass != kAdbSubclass || 65 interface.interface_subclass != kAdbSubclass ||
65 interface.interface_protocol != kAdbProtocol || 66 interface.interface_protocol != kAdbProtocol ||
66 interface.endpoints.size() != 2) { 67 interface.endpoints.size() != 2) {
67 return false; 68 return false;
68 } 69 }
69 return true; 70 return true;
70 } 71 }
71 72
72 scoped_refptr<AndroidUsbDevice> ClaimInterface( 73 void CountAndroidDevices(const base::Callback<void(int)>& callback,
73 crypto::RSAPrivateKey* rsa_key, 74 const UsbDevices& devices) {
74 scoped_refptr<UsbDeviceHandle> usb_handle, 75 int device_count = 0;
75 const base::string16& serial, 76 for (const scoped_refptr<UsbDevice>& device : devices) {
76 const UsbInterfaceDescriptor& interface) { 77 const UsbConfigDescriptor* config = device->GetConfiguration();
77 int inbound_address = 0; 78 if (config) {
78 int outbound_address = 0; 79 for (const UsbInterfaceDescriptor& iface : config->interfaces) {
79 int zero_mask = 0; 80 if (IsAndroidInterface(iface)) {
80 81 ++device_count;
81 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) { 82 }
82 if (endpoint.transfer_type != device::USB_TRANSFER_BULK) 83 }
83 continue; 84 }
84 if (endpoint.direction == device::USB_DIRECTION_INBOUND)
85 inbound_address = endpoint.address;
86 else
87 outbound_address = endpoint.address;
88 zero_mask = endpoint.maximum_packet_size - 1;
89 } 85 }
90 86
91 if (inbound_address == 0 || outbound_address == 0) 87 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
92 return NULL; 88 base::Bind(callback, device_count));
93
94 if (!usb_handle->ClaimInterface(interface.interface_number))
95 return NULL;
96
97 return new AndroidUsbDevice(rsa_key,
98 usb_handle,
99 base::UTF16ToASCII(serial),
100 inbound_address,
101 outbound_address,
102 zero_mask,
103 interface.interface_number);
104 } 89 }
105 90
106 uint32 Checksum(const std::string& data) { 91 uint32 Checksum(const std::string& data) {
107 unsigned char* x = (unsigned char*)data.data(); 92 unsigned char* x = (unsigned char*)data.data();
108 int count = data.length(); 93 int count = data.length();
109 uint32 sum = 0; 94 uint32 sum = 0;
110 while (count-- > 0) 95 while (count-- > 0)
111 sum += *x++; 96 sum += *x++;
112 return sum; 97 return sum;
113 } 98 }
(...skipping 26 matching lines...) Expand all
140 LOG(ERROR) << (outgoing ? "[out] " : "[ in] ") << result; 125 LOG(ERROR) << (outgoing ? "[out] " : "[ in] ") << result;
141 #endif // 0 126 #endif // 0
142 } 127 }
143 128
144 void ReleaseInterface(scoped_refptr<UsbDeviceHandle> usb_device, 129 void ReleaseInterface(scoped_refptr<UsbDeviceHandle> usb_device,
145 int interface_id) { 130 int interface_id) {
146 usb_device->ReleaseInterface(interface_id); 131 usb_device->ReleaseInterface(interface_id);
147 usb_device->Close(); 132 usb_device->Close();
148 } 133 }
149 134
150 } // namespace 135 void RespondOnCallerThread(const AndroidUsbDevicesCallback& callback,
151 136 AndroidUsbDevices* new_devices) {
152 AdbMessage::AdbMessage(uint32 command,
153 uint32 arg0,
154 uint32 arg1,
155 const std::string& body)
156 : command(command),
157 arg0(arg0),
158 arg1(arg1),
159 body(body) {
160 }
161
162 AdbMessage::~AdbMessage() {
163 }
164
165 static void RespondOnCallerThread(const AndroidUsbDevicesCallback& callback,
166 AndroidUsbDevices* new_devices) {
167 scoped_ptr<AndroidUsbDevices> devices(new_devices); 137 scoped_ptr<AndroidUsbDevices> devices(new_devices);
168 138
169 // Add raw pointers to the newly claimed devices. 139 // Add raw pointers to the newly claimed devices.
170 for (const scoped_refptr<AndroidUsbDevice>& device : *devices) { 140 for (const scoped_refptr<AndroidUsbDevice>& device : *devices) {
171 g_devices.Get().push_back(device.get()); 141 g_devices.Get().push_back(device.get());
172 } 142 }
173 143
174 // Return all claimed devices. 144 // Return all claimed devices.
175 AndroidUsbDevices result(g_devices.Get().begin(), g_devices.Get().end()); 145 AndroidUsbDevices result(g_devices.Get().begin(), g_devices.Get().end());
176 callback.Run(result); 146 callback.Run(result);
177 } 147 }
178 148
179 static void RespondOnFileThread( 149 void RespondOnUIThread(
180 const AndroidUsbDevicesCallback& callback, 150 const AndroidUsbDevicesCallback& callback,
181 AndroidUsbDevices* devices, 151 AndroidUsbDevices* devices,
182 scoped_refptr<base::MessageLoopProxy> caller_message_loop_proxy) { 152 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
183 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 153 DCHECK_CURRENTLY_ON(BrowserThread::UI);
184 caller_message_loop_proxy->PostTask( 154 caller_task_runner->PostTask(
185 FROM_HERE, 155 FROM_HERE, base::Bind(&RespondOnCallerThread, callback, devices));
186 base::Bind(&RespondOnCallerThread, callback, devices));
187 } 156 }
188 157
189 static void OpenAndroidDeviceOnFileThread( 158 void CreateDeviceOnInterfaceClaimed(AndroidUsbDevices* devices,
190 AndroidUsbDevices* devices, 159 crypto::RSAPrivateKey* rsa_key,
191 crypto::RSAPrivateKey* rsa_key, 160 scoped_refptr<UsbDeviceHandle> usb_handle,
192 const base::Closure& barrier, 161 int inbound_address,
193 scoped_refptr<UsbDevice> device, 162 int outbound_address,
194 int interface_id, 163 int zero_mask,
195 bool success) { 164 int interface_number,
196 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 165 const base::Closure& barrier,
166 bool success) {
167 DCHECK_CURRENTLY_ON(BrowserThread::UI);
197 if (success) { 168 if (success) {
198 base::string16 serial; 169 devices->push_back(new AndroidUsbDevice(
199 if (device->GetSerialNumber(&serial) && !serial.empty()) { 170 rsa_key, usb_handle,
200 const UsbConfigDescriptor* config = device->GetConfiguration(); 171 base::UTF16ToASCII(usb_handle->GetDevice()->serial_number()),
201 if (config) { 172 inbound_address, outbound_address, zero_mask, interface_number));
202 scoped_refptr<UsbDeviceHandle> usb_handle = device->Open(); 173 } else {
203 if (usb_handle.get()) { 174 usb_handle->Close();
204 scoped_refptr<AndroidUsbDevice> android_device = ClaimInterface(
205 rsa_key, usb_handle, serial, config->interfaces[interface_id]);
206 if (android_device.get())
207 devices->push_back(android_device);
208 else
209 usb_handle->Close();
210 }
211 }
212 }
213 } 175 }
214 barrier.Run(); 176 barrier.Run();
215 } 177 }
216 178
217 static int CountOnFileThread() { 179 void OnDeviceOpened(AndroidUsbDevices* devices,
218 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 180 crypto::RSAPrivateKey* rsa_key,
219 UsbService* service = device::DeviceClient::Get()->GetUsbService(); 181 int inbound_address,
220 UsbDevices usb_devices; 182 int outbound_address,
221 if (service != NULL) 183 int zero_mask,
222 service->GetDevices(&usb_devices); 184 int interface_number,
223 int device_count = 0; 185 const base::Closure& barrier,
224 for (const scoped_refptr<UsbDevice>& device : usb_devices) { 186 scoped_refptr<UsbDeviceHandle> usb_handle) {
225 const UsbConfigDescriptor* config = device->GetConfiguration(); 187 DCHECK_CURRENTLY_ON(BrowserThread::UI);
226 if (config) { 188 if (usb_handle.get()) {
227 for (const UsbInterfaceDescriptor& iface : config->interfaces) { 189 usb_handle->ClaimInterface(
228 if (IsAndroidInterface(iface)) { 190 interface_number,
229 ++device_count; 191 base::Bind(&CreateDeviceOnInterfaceClaimed, devices, rsa_key,
230 } 192 usb_handle, inbound_address, outbound_address, zero_mask,
231 } 193 interface_number, barrier));
232 } 194 } else {
195 barrier.Run();
233 } 196 }
234 return device_count;
235 } 197 }
236 198
237 static void EnumerateOnFileThread( 199 void OpenAndroidDevice(AndroidUsbDevices* devices,
200 crypto::RSAPrivateKey* rsa_key,
201 const base::Closure& barrier,
202 scoped_refptr<UsbDevice> device,
203 int interface_id,
204 bool success) {
205 DCHECK_CURRENTLY_ON(BrowserThread::UI);
206 if (!success) {
207 barrier.Run();
208 return;
209 }
210
211 if (device->serial_number().empty()) {
212 barrier.Run();
213 return;
214 }
215
216 const UsbConfigDescriptor* config = device->GetConfiguration();
217 if (!config) {
218 barrier.Run();
219 return;
220 }
221
222 const UsbInterfaceDescriptor& interface = config->interfaces[interface_id];
223 int inbound_address = 0;
224 int outbound_address = 0;
225 int zero_mask = 0;
226
227 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) {
228 if (endpoint.transfer_type != device::USB_TRANSFER_BULK)
229 continue;
230 if (endpoint.direction == device::USB_DIRECTION_INBOUND)
231 inbound_address = endpoint.address;
232 else
233 outbound_address = endpoint.address;
234 zero_mask = endpoint.maximum_packet_size - 1;
235 }
236
237 if (inbound_address == 0 || outbound_address == 0) {
238 barrier.Run();
239 return;
240 }
241
242 device->Open(base::Bind(&OnDeviceOpened, devices, rsa_key, inbound_address,
243 outbound_address, zero_mask,
244 interface.interface_number, barrier));
245 }
246
247 void OpenAndroidDevices(
238 crypto::RSAPrivateKey* rsa_key, 248 crypto::RSAPrivateKey* rsa_key,
239 const AndroidUsbDevicesCallback& callback, 249 const AndroidUsbDevicesCallback& callback,
240 scoped_refptr<base::MessageLoopProxy> caller_message_loop_proxy) { 250 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
241 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 251 const UsbDevices& usb_devices) {
242 252 DCHECK_CURRENTLY_ON(BrowserThread::UI);
243 UsbService* service = device::DeviceClient::Get()->GetUsbService();
244 UsbDevices usb_devices;
245 if (service != NULL)
246 service->GetDevices(&usb_devices);
247
248 // Add new devices. 253 // Add new devices.
249 AndroidUsbDevices* devices = new AndroidUsbDevices(); 254 AndroidUsbDevices* devices = new AndroidUsbDevices();
250 base::Closure barrier = base::BarrierClosure( 255 base::Closure barrier = base::BarrierClosure(
251 usb_devices.size(), base::Bind(&RespondOnFileThread, 256 usb_devices.size(),
252 callback, 257 base::Bind(&RespondOnUIThread, callback, devices, caller_task_runner));
253 devices,
254 caller_message_loop_proxy));
255 258
256 for (const scoped_refptr<UsbDevice>& device : usb_devices) { 259 for (const scoped_refptr<UsbDevice>& device : usb_devices) {
257 const UsbConfigDescriptor* config = device->GetConfiguration(); 260 const UsbConfigDescriptor* config = device->GetConfiguration();
258 if (!config) { 261 if (!config) {
259 barrier.Run(); 262 barrier.Run();
260 continue; 263 continue;
261 } 264 }
262 bool has_android_interface = false; 265 bool has_android_interface = false;
263 for (size_t j = 0; j < config->interfaces.size(); ++j) { 266 for (size_t j = 0; j < config->interfaces.size(); ++j) {
264 if (!IsAndroidInterface(config->interfaces[j])) { 267 if (!IsAndroidInterface(config->interfaces[j])) {
265 continue; 268 continue;
266 } 269 }
267 270
268 device->RequestUsbAccess( 271 device->RequestUsbAccess(j, base::Bind(&OpenAndroidDevice, devices,
269 j, base::Bind(&OpenAndroidDeviceOnFileThread, devices, rsa_key, 272 rsa_key, barrier, device, j));
270 barrier, device, j));
271 273
272 has_android_interface = true; 274 has_android_interface = true;
273 break; 275 break;
274 } 276 }
275 if (!has_android_interface) 277 if (!has_android_interface) {
276 barrier.Run(); 278 barrier.Run();
279 }
277 } 280 }
278 } 281 }
279 282
283 void EnumerateOnUIThread(
284 crypto::RSAPrivateKey* rsa_key,
285 const AndroidUsbDevicesCallback& callback,
286 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
287 DCHECK_CURRENTLY_ON(BrowserThread::UI);
288
289 UsbService* service = device::DeviceClient::Get()->GetUsbService();
290 if (service == NULL) {
291 caller_task_runner->PostTask(FROM_HERE,
292 base::Bind(callback, AndroidUsbDevices()));
293 } else {
294 service->GetDevices(
295 base::Bind(&OpenAndroidDevices, rsa_key, callback, caller_task_runner));
296 }
297 }
298
299 } // namespace
300
301 AdbMessage::AdbMessage(uint32 command,
302 uint32 arg0,
303 uint32 arg1,
304 const std::string& body)
305 : command(command), arg0(arg0), arg1(arg1), body(body) {
306 }
307
308 AdbMessage::~AdbMessage() {
309 }
310
280 // static 311 // static
281 void AndroidUsbDevice::CountDevices( 312 void AndroidUsbDevice::CountDevices(const base::Callback<void(int)>& callback) {
282 const base::Callback<void(int)>& callback) { 313 UsbService* service = device::DeviceClient::Get()->GetUsbService();
283 BrowserThread::PostTaskAndReplyWithResult( 314 if (service != NULL) {
284 BrowserThread::FILE, 315 service->GetDevices(base::Bind(&CountAndroidDevices, callback));
285 FROM_HERE, 316 } else {
286 base::Bind(&CountOnFileThread), 317 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
287 callback); 318 base::Bind(callback, 0));
319 }
288 } 320 }
289 321
290 // static 322 // static
291 void AndroidUsbDevice::Enumerate(crypto::RSAPrivateKey* rsa_key, 323 void AndroidUsbDevice::Enumerate(crypto::RSAPrivateKey* rsa_key,
292 const AndroidUsbDevicesCallback& callback) { 324 const AndroidUsbDevicesCallback& callback) {
293
294 // Collect devices with closed handles. 325 // Collect devices with closed handles.
295 for (AndroidUsbDevice* device : g_devices.Get()) { 326 for (AndroidUsbDevice* device : g_devices.Get()) {
296 if (device->usb_handle_.get()) { 327 if (device->usb_handle_.get()) {
297 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 328 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
298 base::Bind(&AndroidUsbDevice::TerminateIfReleased, device, 329 base::Bind(&AndroidUsbDevice::TerminateIfReleased,
299 device->usb_handle_)); 330 device, device->usb_handle_));
300 } 331 }
301 } 332 }
302 333
303 // Then look for the new devices. 334 // Then look for the new devices.
304 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 335 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
305 base::Bind(&EnumerateOnFileThread, rsa_key, callback, 336 base::Bind(&EnumerateOnUIThread, rsa_key, callback,
306 base::MessageLoopProxy::current())); 337 base::ThreadTaskRunnerHandle::Get()));
307 } 338 }
308 339
309 AndroidUsbDevice::AndroidUsbDevice(crypto::RSAPrivateKey* rsa_key, 340 AndroidUsbDevice::AndroidUsbDevice(crypto::RSAPrivateKey* rsa_key,
310 scoped_refptr<UsbDeviceHandle> usb_device, 341 scoped_refptr<UsbDeviceHandle> usb_device,
311 const std::string& serial, 342 const std::string& serial,
312 int inbound_address, 343 int inbound_address,
313 int outbound_address, 344 int outbound_address,
314 int zero_mask, 345 int zero_mask,
315 int interface_id) 346 int interface_id)
316 : message_loop_(NULL), 347 : rsa_key_(rsa_key->Copy()),
317 rsa_key_(rsa_key->Copy()),
318 usb_handle_(usb_device), 348 usb_handle_(usb_device),
319 serial_(serial), 349 serial_(serial),
320 inbound_address_(inbound_address), 350 inbound_address_(inbound_address),
321 outbound_address_(outbound_address), 351 outbound_address_(outbound_address),
322 zero_mask_(zero_mask), 352 zero_mask_(zero_mask),
323 interface_id_(interface_id), 353 interface_id_(interface_id),
324 is_connected_(false), 354 is_connected_(false),
325 signature_sent_(false), 355 signature_sent_(false),
326 last_socket_id_(256), 356 last_socket_id_(256),
327 weak_factory_(this) { 357 weak_factory_(this) {
328 } 358 }
329 359
330 void AndroidUsbDevice::InitOnCallerThread() { 360 void AndroidUsbDevice::InitOnCallerThread() {
331 if (message_loop_) 361 if (task_runner_)
332 return; 362 return;
333 message_loop_ = base::MessageLoop::current(); 363 task_runner_ = base::ThreadTaskRunnerHandle::Get();
334 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion, 364 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion,
335 kMaxPayload, kHostConnectMessage))); 365 kMaxPayload, kHostConnectMessage)));
336 ReadHeader(); 366 ReadHeader();
337 } 367 }
338 368
339 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) { 369 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) {
340 if (!usb_handle_.get()) 370 if (!usb_handle_.get())
341 return NULL; 371 return NULL;
342 372
343 uint32 socket_id = ++last_socket_id_; 373 uint32 socket_id = ++last_socket_id_;
344 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command, 374 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command,
345 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id)); 375 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id));
346 return sockets_[socket_id]; 376 return sockets_[socket_id];
347 } 377 }
348 378
349 void AndroidUsbDevice::Send(uint32 command, 379 void AndroidUsbDevice::Send(uint32 command,
350 uint32 arg0, 380 uint32 arg0,
351 uint32 arg1, 381 uint32 arg1,
352 const std::string& body) { 382 const std::string& body) {
353 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body)); 383 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body));
354 // Delay open request if not yet connected. 384 // Delay open request if not yet connected.
355 if (!is_connected_) { 385 if (!is_connected_) {
356 pending_messages_.push_back(message.release()); 386 pending_messages_.push_back(message.release());
357 return; 387 return;
358 } 388 }
359 Queue(message.Pass()); 389 Queue(message.Pass());
360 } 390 }
361 391
362 AndroidUsbDevice::~AndroidUsbDevice() { 392 AndroidUsbDevice::~AndroidUsbDevice() {
363 DCHECK(message_loop_ == base::MessageLoop::current()); 393 DCHECK(task_runner_->BelongsToCurrentThread());
364 Terminate(); 394 Terminate();
365 } 395 }
366 396
367 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) { 397 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) {
368 DCHECK(message_loop_ == base::MessageLoop::current()); 398 DCHECK(task_runner_->BelongsToCurrentThread());
369 399
370 // Queue header. 400 // Queue header.
371 std::vector<uint32> header; 401 std::vector<uint32> header;
372 header.push_back(message->command); 402 header.push_back(message->command);
373 header.push_back(message->arg0); 403 header.push_back(message->arg0);
374 header.push_back(message->arg1); 404 header.push_back(message->arg1);
375 bool append_zero = true; 405 bool append_zero = true;
376 if (message->body.empty()) 406 if (message->body.empty())
377 append_zero = false; 407 append_zero = false;
378 if (message->command == AdbMessage::kCommandAUTH && 408 if (message->command == AdbMessage::kCommandAUTH &&
(...skipping 21 matching lines...) Expand all
400 outgoing_queue_.push(body_buffer); 430 outgoing_queue_.push(body_buffer);
401 if (zero_mask_ && (body_length & zero_mask_) == 0) { 431 if (zero_mask_ && (body_length & zero_mask_) == 0) {
402 // Send a zero length packet. 432 // Send a zero length packet.
403 outgoing_queue_.push(new net::IOBufferWithSize(0)); 433 outgoing_queue_.push(new net::IOBufferWithSize(0));
404 } 434 }
405 } 435 }
406 ProcessOutgoing(); 436 ProcessOutgoing();
407 } 437 }
408 438
409 void AndroidUsbDevice::ProcessOutgoing() { 439 void AndroidUsbDevice::ProcessOutgoing() {
410 DCHECK(message_loop_ == base::MessageLoop::current()); 440 DCHECK(task_runner_->BelongsToCurrentThread());
411 441
412 if (outgoing_queue_.empty() || !usb_handle_.get()) 442 if (outgoing_queue_.empty() || !usb_handle_.get())
413 return; 443 return;
414 444
415 BulkMessage message = outgoing_queue_.front(); 445 BulkMessage message = outgoing_queue_.front();
416 outgoing_queue_.pop(); 446 outgoing_queue_.pop();
417 DumpMessage(true, message->data(), message->size()); 447 DumpMessage(true, message->data(), message->size());
418 usb_handle_->BulkTransfer(device::USB_DIRECTION_OUTBOUND, 448
419 outbound_address_, 449 usb_handle_->BulkTransfer(device::USB_DIRECTION_OUTBOUND, outbound_address_,
420 message.get(), 450 message, message->size(), kUsbTimeout,
421 message->size(),
422 kUsbTimeout,
423 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, 451 base::Bind(&AndroidUsbDevice::OutgoingMessageSent,
424 weak_factory_.GetWeakPtr())); 452 weak_factory_.GetWeakPtr()));
425 } 453 }
426 454
427 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, 455 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status,
428 scoped_refptr<net::IOBuffer> buffer, 456 scoped_refptr<net::IOBuffer> buffer,
429 size_t result) { 457 size_t result) {
430 DCHECK(message_loop_ == base::MessageLoop::current()); 458 if (status != device::USB_TRANSFER_COMPLETED) {
459 return;
460 }
431 461
432 if (status != device::USB_TRANSFER_COMPLETED) 462 task_runner_->PostTask(FROM_HERE,
433 return; 463 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this));
434 message_loop_->PostTask(FROM_HERE,
435 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this));
436 } 464 }
437 465
438 void AndroidUsbDevice::ReadHeader() { 466 void AndroidUsbDevice::ReadHeader() {
439 DCHECK(message_loop_ == base::MessageLoop::current()); 467 DCHECK(task_runner_->BelongsToCurrentThread());
440 468
441 if (!usb_handle_.get()) 469 if (!usb_handle_.get()) {
442 return; 470 return;
471 }
472
443 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); 473 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize);
444 usb_handle_->BulkTransfer( 474 usb_handle_->BulkTransfer(
445 device::USB_DIRECTION_INBOUND, 475 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, kHeaderSize,
446 inbound_address_,
447 buffer.get(),
448 kHeaderSize,
449 kUsbTimeout, 476 kUsbTimeout,
450 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr())); 477 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr()));
451 } 478 }
452 479
453 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, 480 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status,
454 scoped_refptr<net::IOBuffer> buffer, 481 scoped_refptr<net::IOBuffer> buffer,
455 size_t result) { 482 size_t result) {
456 DCHECK(message_loop_ == base::MessageLoop::current()); 483 DCHECK(task_runner_->BelongsToCurrentThread());
457 484
458 if (status == device::USB_TRANSFER_TIMEOUT) { 485 if (status == device::USB_TRANSFER_TIMEOUT) {
459 message_loop_->PostTask(FROM_HERE, 486 task_runner_->PostTask(FROM_HERE,
460 base::Bind(&AndroidUsbDevice::ReadHeader, this)); 487 base::Bind(&AndroidUsbDevice::ReadHeader, this));
461 return; 488 return;
462 } 489 }
463 490
464 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) { 491 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) {
465 TransferError(status); 492 TransferError(status);
466 return; 493 return;
467 } 494 }
468 495
469 DumpMessage(false, buffer->data(), result); 496 DumpMessage(false, buffer->data(), result);
470 std::vector<uint32> header(6); 497 std::vector<uint32> header(6);
471 memcpy(&header[0], buffer->data(), result); 498 memcpy(&header[0], buffer->data(), result);
472 scoped_ptr<AdbMessage> message( 499 scoped_ptr<AdbMessage> message(
473 new AdbMessage(header[0], header[1], header[2], "")); 500 new AdbMessage(header[0], header[1], header[2], ""));
474 uint32 data_length = header[3]; 501 uint32 data_length = header[3];
475 uint32 data_check = header[4]; 502 uint32 data_check = header[4];
476 uint32 magic = header[5]; 503 uint32 magic = header[5];
477 if ((message->command ^ 0xffffffff) != magic) { 504 if ((message->command ^ 0xffffffff) != magic) {
478 TransferError(device::USB_TRANSFER_ERROR); 505 TransferError(device::USB_TRANSFER_ERROR);
479 return; 506 return;
480 } 507 }
481 508
482 if (data_length == 0) { 509 if (data_length == 0) {
483 message_loop_->PostTask(FROM_HERE, 510 task_runner_->PostTask(FROM_HERE,
484 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 511 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
485 base::Passed(&message))); 512 base::Passed(&message)));
486 return; 513 } else {
514 task_runner_->PostTask(
515 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this,
516 base::Passed(&message), data_length, data_check));
487 } 517 }
488
489 message_loop_->PostTask(FROM_HERE,
490 base::Bind(&AndroidUsbDevice::ReadBody, this,
491 base::Passed(&message), data_length, data_check));
492 } 518 }
493 519
494 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message, 520 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message,
495 uint32 data_length, 521 uint32 data_length,
496 uint32 data_check) { 522 uint32 data_check) {
497 DCHECK(message_loop_ == base::MessageLoop::current()); 523 DCHECK(task_runner_->BelongsToCurrentThread());
498 524
499 if (!usb_handle_.get()) 525 if (!usb_handle_.get()) {
500 return; 526 return;
527 }
528
501 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); 529 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length);
502 usb_handle_->BulkTransfer(device::USB_DIRECTION_INBOUND, 530 usb_handle_->BulkTransfer(
503 inbound_address_, 531 device::USB_DIRECTION_INBOUND, inbound_address_, buffer, data_length,
504 buffer.get(), 532 kUsbTimeout,
505 data_length, 533 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(),
506 kUsbTimeout, 534 base::Passed(&message), data_length, data_check));
507 base::Bind(&AndroidUsbDevice::ParseBody,
508 weak_factory_.GetWeakPtr(),
509 base::Passed(&message),
510 data_length,
511 data_check));
512 } 535 }
513 536
514 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message, 537 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message,
515 uint32 data_length, 538 uint32 data_length,
516 uint32 data_check, 539 uint32 data_check,
517 UsbTransferStatus status, 540 UsbTransferStatus status,
518 scoped_refptr<net::IOBuffer> buffer, 541 scoped_refptr<net::IOBuffer> buffer,
519 size_t result) { 542 size_t result) {
520 DCHECK(message_loop_ == base::MessageLoop::current()); 543 DCHECK(task_runner_->BelongsToCurrentThread());
521 544
522 if (status == device::USB_TRANSFER_TIMEOUT) { 545 if (status == device::USB_TRANSFER_TIMEOUT) {
523 message_loop_->PostTask(FROM_HERE, 546 task_runner_->PostTask(
524 base::Bind(&AndroidUsbDevice::ReadBody, this, 547 FROM_HERE, base::Bind(&AndroidUsbDevice::ReadBody, this,
525 base::Passed(&message), data_length, data_check)); 548 base::Passed(&message), data_length, data_check));
526 return; 549 return;
527 } 550 }
528 551
529 if (status != device::USB_TRANSFER_COMPLETED || 552 if (status != device::USB_TRANSFER_COMPLETED ||
530 static_cast<uint32>(result) != data_length) { 553 static_cast<uint32>(result) != data_length) {
531 TransferError(status); 554 TransferError(status);
532 return; 555 return;
533 } 556 }
534 557
535 DumpMessage(false, buffer->data(), data_length); 558 DumpMessage(false, buffer->data(), data_length);
536 message->body = std::string(buffer->data(), result); 559 message->body = std::string(buffer->data(), result);
537 if (Checksum(message->body) != data_check) { 560 if (Checksum(message->body) != data_check) {
538 TransferError(device::USB_TRANSFER_ERROR); 561 TransferError(device::USB_TRANSFER_ERROR);
539 return; 562 return;
540 } 563 }
541 564
542 message_loop_->PostTask(FROM_HERE, 565 task_runner_->PostTask(FROM_HERE,
543 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 566 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
544 base::Passed(&message))); 567 base::Passed(&message)));
545 } 568 }
546 569
547 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) { 570 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) {
548 DCHECK(message_loop_ == base::MessageLoop::current()); 571 DCHECK(task_runner_->BelongsToCurrentThread());
549 572
550 switch (message->command) { 573 switch (message->command) {
551 case AdbMessage::kCommandAUTH: 574 case AdbMessage::kCommandAUTH:
552 { 575 {
553 DCHECK_EQ(message->arg0, static_cast<uint32>(AdbMessage::kAuthToken)); 576 DCHECK_EQ(message->arg0, static_cast<uint32>(AdbMessage::kAuthToken));
554 if (signature_sent_) { 577 if (signature_sent_) {
555 Queue(make_scoped_ptr(new AdbMessage( 578 Queue(make_scoped_ptr(new AdbMessage(
556 AdbMessage::kCommandAUTH, 579 AdbMessage::kCommandAUTH,
557 AdbMessage::kAuthRSAPublicKey, 0, 580 AdbMessage::kAuthRSAPublicKey, 0,
558 AndroidRSAPublicKey(rsa_key_.get())))); 581 AndroidRSAPublicKey(rsa_key_.get()))));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 it->second->HandleIncoming(message.Pass()); 615 it->second->HandleIncoming(message.Pass());
593 } 616 }
594 break; 617 break;
595 default: 618 default:
596 break; 619 break;
597 } 620 }
598 ReadHeader(); 621 ReadHeader();
599 } 622 }
600 623
601 void AndroidUsbDevice::TransferError(UsbTransferStatus status) { 624 void AndroidUsbDevice::TransferError(UsbTransferStatus status) {
602 DCHECK(message_loop_ == base::MessageLoop::current()); 625 DCHECK(task_runner_->BelongsToCurrentThread());
603 626
604 message_loop_->PostTask(FROM_HERE, 627 Terminate();
605 base::Bind(&AndroidUsbDevice::Terminate, this));
606 } 628 }
607 629
608 void AndroidUsbDevice::TerminateIfReleased( 630 void AndroidUsbDevice::TerminateIfReleased(
609 scoped_refptr<UsbDeviceHandle> usb_handle) { 631 scoped_refptr<UsbDeviceHandle> usb_handle) {
610 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 632 DCHECK_CURRENTLY_ON(BrowserThread::UI);
611 if (usb_handle->GetDevice().get()) 633 if (usb_handle->GetDevice().get()) {
612 return; 634 return;
613 message_loop_->PostTask(FROM_HERE, 635 }
614 base::Bind(&AndroidUsbDevice::Terminate, this)); 636
637 task_runner_->PostTask(FROM_HERE,
638 base::Bind(&AndroidUsbDevice::Terminate, this));
615 } 639 }
616 640
617 void AndroidUsbDevice::Terminate() { 641 void AndroidUsbDevice::Terminate() {
618 DCHECK(message_loop_ == base::MessageLoop::current()); 642 DCHECK(task_runner_->BelongsToCurrentThread());
619 643
620 std::vector<AndroidUsbDevice*>::iterator it = 644 std::vector<AndroidUsbDevice*>::iterator it =
621 std::find(g_devices.Get().begin(), g_devices.Get().end(), this); 645 std::find(g_devices.Get().begin(), g_devices.Get().end(), this);
622 if (it != g_devices.Get().end()) 646 if (it != g_devices.Get().end())
623 g_devices.Get().erase(it); 647 g_devices.Get().erase(it);
624 648
625 if (!usb_handle_.get()) 649 if (!usb_handle_.get())
626 return; 650 return;
627 651
628 // Make sure we zero-out handle so that closing connections did not open 652 // Make sure we zero-out handle so that closing connections did not open
629 // new connections. 653 // new connections.
630 scoped_refptr<UsbDeviceHandle> usb_handle = usb_handle_; 654 scoped_refptr<UsbDeviceHandle> usb_handle = usb_handle_;
631 usb_handle_ = NULL; 655 usb_handle_ = NULL;
632 656
633 // Iterate over copy. 657 // Iterate over copy.
634 AndroidUsbSockets sockets(sockets_); 658 AndroidUsbSockets sockets(sockets_);
635 for (AndroidUsbSockets::iterator it = sockets.begin(); 659 for (AndroidUsbSockets::iterator it = sockets.begin();
636 it != sockets.end(); ++it) { 660 it != sockets.end(); ++it) {
637 it->second->Terminated(true); 661 it->second->Terminated(true);
638 } 662 }
639 DCHECK(sockets_.empty()); 663 DCHECK(sockets_.empty());
640 664
641 BrowserThread::PostTask( 665 BrowserThread::PostTask(
642 BrowserThread::FILE, FROM_HERE, 666 BrowserThread::UI, FROM_HERE,
643 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); 667 base::Bind(&ReleaseInterface, usb_handle, interface_id_));
644 } 668 }
645 669
646 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { 670 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) {
647 DCHECK(message_loop_ == base::MessageLoop::current()); 671 DCHECK(task_runner_->BelongsToCurrentThread());
648 672
649 sockets_.erase(socket_id); 673 sockets_.erase(socket_id);
650 } 674 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698